我遇到这种情况的时间大约是3或4次。有时,Git会想要执行合并。它是响应git commit <filename> -m <message>后跟git push。
而发生的
我知道合并将要发生,因为Git启动了消息的编辑器。因此,我尝试执行CTRL C来尝试将其停止。
我真的不在乎为什么或什么使我进入状态。当事情必须合并时,我只想停下来。我不希望发生这种情况,因为它会污染签到,污染历史记录,有时还会添加尚未准备好的内容。
但是,我看到Git仍然执行合并。授予:合并https://github.com/weidai11/cryptopp的分支\\'master \\'。
一旦我CTRL C,合并就不应继续进行。如何使Git荣誉成为不需要的取消合并?
- 触发此"不必要的合并"的原因尚不清楚,但请注意,空的提交消息将取消提交。当提示您输入提交消息,保存并退出编辑器时,只需清空编辑器的缓冲区即可。
-
如何取消它而不删除消息中的所有行?那只是额外的工作。有没有办法像地球上几乎所有其他软件一样使Git尊敬CTRL C?
-
我认为您在这里问的是错误的问题。相反,您应该找出导致此"不必要的合并"的原因。除非您在后台运行了一些恶意脚本,否则Git只会执行您要求的操作。
-
也许吧,但是我不是Git专家,我也不打算成为一个Git专家。对于只想签出和签入的非专家,取消合并最安全,最容易。
-
这与成为git专家无关。 Git根本不会自己做这些事情。现在,假设您使用的是命令行编辑器,而不是启动gui键盘:Ctrl c也不行。在您的终端中运行的当前进程(信号发送到该进程)将是您的编辑器,而不是git。在此之前,您正在运行什么命令?
-
蒂姆(Tim)和朱伯斯(Jubobs)-我认为您正在做的事情被称为自行车脱落。你是在告诉我在你的世界里我应该做什么。在我的世界中,我想在发生意外情况时立即停止。我不想了解发生的原因或如何应对。我只是不在乎为什么。停止后,可以通过删除当前存储库并执行新的克隆来更正它。对我来说真的很容易。其他任何事情对我来说都是多余的工作。
-
我将您问题的最后一行解释为"我应该怎么做,以免再次发生这种情况"。如果我误解了这个问题或以任何方式得罪了你,我感到抱歉。我只是在尽力帮助我。我提到过,为什么从技术的angular来看,为什么我相信在大多数情况下使用ctrl c还是行不通的。 @Jubobs提供了(据我所知)快速的方法来取消任何git commit(立即停止)。我们俩都明确表示,我们认为git并不是您实际问题的根源。而且我不会叫那辆自行车脱落。
-
@jww这里根本没有"自行车脱落"。您写道:我不想了解发生的原因或如何应对。我只是不在乎为什么。我不想听起来卑鄙,但这只是一种可怕的态度。与其尝试避免出现问题的后果(例如,当您不想创建提交时,编辑器提示您输入提交消息),而是转到问题的根源(即,导致"不必要的"创建的原因)"提交)并消除它。我感觉合理。
-
@Jubobs-"但是那只是一个可怕的态度"-好的,但这就是事实。我的工作是生产稳定,安全的软件。用Git浪费时间就是这样-浪费时间。我过去在Git上浪费了太多时间,我拒绝再浪费时间了。我对学习您感兴趣的事物不感兴趣,例如如何掌握Git。告诉我应该引起兴趣的是自行车脱落。
-
@jww我不会和你争论;您要做的是您的业务,而不是我的。我建议了一种取消创建提交的方法(我所知道的唯一一种方法)。要么接受,要么离开它。
-
同样,我们当中的任何人实际上都没有说过您应该对git产生任何进一步的兴趣。我们只是提到您的系统上可能存在另一个问题,这不是git本身引起的。如果您想强调要使ctrl c工作,我认为git bug报告是正确的选择。不过请注意,如果您的编辑器是当前进程,它将"拦截"该信号。 git实际上允许您使用ctrl c(例如中止git fetch)。
-
深入了解此问题的另一个原因是,只有" true"合并(即非快进合并)会导致编辑器弹出,并为您提供取消它们的机会。 ctrl c不能帮助您取消"不需要的"快速合并。
-
蒂姆和朱伯斯-好的,谢谢。我将终止终端过程,以一劳永逸地结束这些问题。谢谢你的帮助。 (而且我不知道"真正的"合并与其他类型的合并之间的区别。而且我不会浪费时间尝试了解它的含义。我不再为此程序使用grep手册页我只希望它立即停止:)
-
@jww是否使用git pull进行任何更改?
-
@Jubobs我想知道完全相同的事情。
-
(我的意思是"机会",而不是"改变"。)
-
@jww您是否检查过您的shell或git配置中是否有可能导致此问题的东西?有关详细信息,请查看我的最新答案。
如果远程上有任何新的提交,而您在本地分支上还没有,则
git push通常应该会失败。
为了进行推送,您不能丢失服务器具有的任何提交。
在您发布的示例中,您似乎已经在两台不同的计算机或两个不同的本地副本上进行了d091b80和217cb1f提交。
当您尝试推送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是执行此操作的最快方法。 sub>
运行git merge --abort
这将使git尝试恢复工作副本的合并前状态。
此命令在git 1.7.4或更高版本中可用。有关更多信息,请查看git-merge的man条目。 sub>
为什么Ctrl C无法执行预期的操作
简单地按Ctrl C将(在大多数情况下,即使不是所有情况下)也无法实现预期的效果。当git启动命令行编辑器(例如vim,emacs或nano)时,该编辑器将成为该Shell的活动/当前进程。
按Ctrl C将向当前进程发送SIGINT信号。含义是,将SIGINT发送到您的编辑器而不是git。
如果要使用编辑器,则在收到该信号时失败(退出并返回非0的退出代码),这可能(尽管我尚未测试过)中止提交。
就像编辑器一样,它将保存一个空缓冲区并退出。
如果将git配置为启动GUI编辑器,它将保留在最前面,而SIGINT仍应中止提交。
请注意,在所有三种情况下,您都可能会在工作副本中拥有来自另一个分支的更改,并且需要清理它们(请参阅步骤2)。
对于我个人(以及很多git广泛的用户)而言,这种行为正是我想要从git中获得的。如果您有不同的看法,则可以在此处提交错误报告或功能请求。
- 谢谢蒂姆。我要接受答案才能上床睡觉。据我所知,我不能让Git阻止所有这些多余的不良行为。将来,我将终止该过程。