如何让Git尊重未被要求的取消合并?

时间:2015-07-09 08:58:08

标签: git git-merge

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

时发生的

我知道合并即将发生,因为Git会在编辑器中为该消息进行旋转。所以我执行 CTRL + C 试图阻止它。

我真的不在乎为什么或是什么让我进入这个州。当事情必须合并时,我只想停下来。我 希望它发生,因为它污染了签到,污染了历史记录,有时还添加了尚未准备好的东西。

但是,我看到Git仍然执行合并。 Confer:Merge branch 'master' of https://github.com/weidai11/cryptopp

一旦我 CTRL + C ,合并应该 继续。如何让Git尊重未被要求取消的合并?

1 个答案:

答案 0 :(得分:3)

如果遥控器上有任何新提交,那么

git push通常会失败,但您还没有在当地分支机构上提交。

为了推送,您不能错过服务器提交的任何提交。

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

当您尝试推送217cb1f时,服务器已经有d091b80,而您在本地分支机构中没有。{/ p>

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

通常这是你可以手动完成的事情。出于某种原因,似乎您的git push以某种方式调用git pull

虽然我无法找到启用此类行为的特定选项(并且也不建议这样做),但我可以看到有些人希望git以这种方式行事。
如果您正在为git或shell使用其他人配置文件,我会看看是否有任何可能导致这种奇怪行为的事情。

那么合并提交通常是如何产生的呢?抛开push命令的奇怪行为并假设你手动完成了拉动:

Git pull导致意外的合并提交

Git pull正在做两件事:

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

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

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

或者您可以执行git pull --rebase或在git配置中设置相应的设置。这将告诉git将您的本地更改应用于道路的终点&#34;服务器。
但请注意,重新定位会使冲突解决更加困难,并且通常比合并更复杂。

尽早推进可最大限度地减少分支转移。 如果您尚未进行任何新的本地提交,那么在进行提交之前,从服务器进行pull更改也是一个好主意。这样,你就是在阻止你的分支转移。

这样做的好方法是:

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

在编辑提交消息

的同时中止合并
  1. 清空编辑器缓冲区中的提交消息,保存并退出 任何注释(前缀为#)都可以保留,因为它们在评估之前被git删除(尽管可以在配置中更改此行为)。 如果您是vim用户,我相信dG:x是最快的方式。
  2. 运行git merge --abort
    这将使git尝试恢复工作副本的合并前状态 此命令在git 1.7.4或更高版本中可用。有关详细信息,请查看man entry for git-merge
  3. 为什么Ctrl + C不能达到预期的效果

    只需按 Ctrl + C (在大多数情况下,如果不是所有情况下)都不会按预期执行。当git启动命令行编辑器(例如vim,emacs或nano)时,编辑器将成为该shell的活动/当前进程。

    Ctrl + C 将向当前进程发送SIGINT信号。这意味着,将SIGINT发送给您的编辑器而不是git。

    如果您使用编辑器,那么在接收到该信号时失败(退出并返回0以外的退出代码),那可能(虽然我没有测试过)中止提交。
    和编辑一样,它会保存一个空缓冲区并退出 如果您配置git以启动GUI编辑器,它将仍然是最前面的进程,SIGINT仍然应该中止提交。

    请注意,在所有三种情况下,您可能会在工作副本中对其他分支进行更改,您需要清理它们(请参阅步骤2)。

    对于我个人(以及许多广泛的git用户),这种行为是我想要的git。如果您看到不同的内容,则可以提交错误报告或功能请求here