如何使Git Honor取消并没有要求的合并?

How to make Git honor a cancelled merge that was not asked for?

我遇到这种情况的时间大约是3或4次。有时,Git会想要执行合并。它是响应git commit <filename> -m <message>后跟git push

而发生的

我知道合并将要发生,因为Git启动了消息的编辑器。因此,我尝试执行CTRL C来尝试将其停止。

我真的不在乎为什么或什么使我进入状态。当事情必须合并时,我只想停下来。我不希望发生这种情况,因为它会污染签到,污染历史记录,有时还会添加尚未准备好的内容。

但是,我看到Git仍然执行合并。授予:合并https://github.com/weidai11/cryptopp的分支\\'master \\'。

一旦我CTRL C,合并就不应继续进行。如何使Git荣誉成为不需要的取消合并?


如果远程上有任何新的提交,而您在本地分支上还没有,则

git push通常应该会失败。

为了进行推送,您不能丢失服务器具有的任何提交。

在您发布的示例中,您似乎已经在两台不同的计算机或两个不同的本地副本上进行了d091b80217cb1f提交。

当您尝试推送217cb1f时,服务器已经具有d091b80,而本地分支中却没有。

在git可以推送到服务器之前,您需要从服务器中提取其他提交。

通常这是您需要手动执行的操作。由于某种原因,您的git push似乎在以某种方式调用git pull

虽然我找不到启用这种行为的特定选项(并且也不建议这样做),但我可以看到有些人希望git以这种方式表现。
如果您将其他人的配置文件用于git或您的shell,请查看是否有任何可能导致此奇怪行为的内容。

那么合并提交通常是如何发生的?撇开push命令的怪异行为,并假设您手动完成了一次pull:

Git pull导致意外的合并提交

Git pull正在做两件事:

  • 它获取遥控器
  • 它将远程分支合并到本地分支

如果本地计算机上没有新的提交,则您具有线性历史记录,并且来自服务器的更改将包含在快速转发中。这意味着您的本地分支机构将被简单地设置为与远程分支机构相同的修订版(可视化只需要在一条道路上走得更远)。

想象一下,您已经在本地分支上进行了提交,而一位同事(或您自己在另一台计算机上)已将另一项更改推送到服务器上的远程分支:
现在,这两个分支已经以不同的方式徘徊(在这里可视化一条道路分成两部分)。当git pull尝试将它们合并在一起时,将需要进行合并提交(可视化两条道路合并为一条)。

或者,您可以执行git pull --rebase或在git config中设置相应的设置。这将告诉git将您的本地更改应用于服务器的"尽头"。
但是请注意,重新定基使冲突解决变得困难得多,并且通常比合并更复杂。

尽早推送可使分支转移最小化。
如果尚未进行任何新的本地提交,那么在进行提交之前从服务器pull进行更改也是一个好主意。这样,您可以防止分支转移。

执行此操作的好方法是:

1
2
3
git stash       # This saves your uncommitted changes away as a draft
git pull        # Gets new commits from the remote
git stash pop   # Restores your uncommitted changes

在已经编辑提交消息的同时中止合并

  • 在您的编辑器缓冲区中清空提交消息,保存并退出。
    任何注释(带有#前缀)都可以保留,因为它们在评估之前已被git删除(尽管此行为可以在配置中更改)。
    如果您是vim用户,我相信dG:x是执行此操作的最快方法。
  • 运行git merge --abort
    这将使git尝试恢复工作副本的合并前状态。
    此命令在git 1.7.4或更高版本中可用。有关更多信息,请查看git-merge的man条目。
  • 为什么Ctrl C无法执行预期的操作

    简单地按Ctrl C将(在大多数情况下,即使不是所有情况下)也无法实现预期的效果。当git启动命令行编辑器(例如vim,emacs或nano)时,该编辑器将成为该Shell的活动/当前进程。

    Ctrl C将向当前进程发送SIGINT信号。含义是,将SIGINT发送到您的编辑器而不是git。

    如果要使用编辑器,则在收到该信号时失败(退出并返回非0的退出代码),这可能(尽管我尚未测试过)中止提交。
    就像编辑器一样,它将保存一个空缓冲区并退出。
    如果将git配置为启动GUI编辑器,它将保留在最前面,而SIGINT仍应中止提交。

    请注意,在所有三种情况下,您都可能会在工作副本中拥有来自另一个分支的更改,并且需要清理它们(请参阅步骤2)。

    对于我个人(以及很多git广泛的用户)而言,这种行为正是我想要从git中获得的。如果您有不同的看法,则可以在此处提交错误报告或功能请求。