我现在遇到这种情况大约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尊重未被要求取消的合并?
答案 0 :(得分:3)
git push
通常会失败,但您还没有在当地分支机构上提交。
为了推送,您不能错过服务器提交的任何提交。
在您发布的示例中,您似乎已在两台不同的计算机或两个不同的本地副本上提交了d091b80
和217cb1f
。
当您尝试推送217cb1f
时,服务器已经有d091b80
,而您在本地分支机构中没有。{/ p>
在git推送到服务器之前,您需要从服务器提取其他提交。
通常这是你可以手动完成的事情。出于某种原因,似乎您的git push
以某种方式调用git pull
。
虽然我无法找到启用此类行为的特定选项(并且也不建议这样做),但我可以看到有些人希望git以这种方式行事。
如果您正在为git或shell使用其他人配置文件,我会看看是否有任何可能导致这种奇怪行为的事情。
那么合并提交通常是如何产生的呢?抛开push命令的奇怪行为并假设你手动完成了拉动:
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
dG:x
是最快的方式。 git merge --abort
只需按 Ctrl + C (在大多数情况下,如果不是所有情况下)都不会按预期执行。当git启动命令行编辑器(例如vim,emacs或nano)时,编辑器将成为该shell的活动/当前进程。
按 Ctrl + C 将向当前进程发送SIGINT
信号。这意味着,将SIGINT
发送给您的编辑器而不是git。
如果您使用编辑器,那么在接收到该信号时失败(退出并返回0以外的退出代码),那可能(虽然我没有测试过)中止提交。
和编辑一样,它会保存一个空缓冲区并退出
如果您配置git以启动GUI编辑器,它将仍然是最前面的进程,SIGINT
仍然应该中止提交。
请注意,在所有三种情况下,您可能会在工作副本中对其他分支进行更改,您需要清理它们(请参阅步骤2)。
对于我个人(以及许多广泛的git用户),这种行为是我想要的git。如果您看到不同的内容,则可以提交错误报告或功能请求here。