无法进行git merge-中止直到git status

时间:2018-07-03 03:46:16

标签: git

首先我合并,然后发生冲突,所以我git merge --abort,但是失败了,我必须先做git status,然后git merge --abort成功。

$ git merge features/test
Auto-merging src/cmd.c
CONFLICT (content): Merge conflict in src/main.c
Auto-merging src/client.c
Automatic merge failed; fix conflicts and then commit the result.
$ git merge --abort
error: Entry 'src/option.h' not uptodate. Cannot merge.
fatal: Could not reset index file to revision 'HEAD'.
$ git merge --abort
error: Entry 'src/option.h' not uptodate. Cannot merge.
fatal: Could not reset index file to revision 'HEAD'.
$ git status 
# On branch te
# You have unmerged paths.
#   (fix conflicts and run "git commit")
#
# Changes to be committed:
#
**********
#
# Unmerged paths:
#   (use "git add <file>..." to mark resolution)
#
**********
#
$ git merge --abort
$ git status
# On branch te
nothing to commit, working directory clean

我在做错什么吗?

git版本1.8.3.1

4 个答案:

答案 0 :(得分:1)

  

我在做错什么吗?

否:git merge --abort应该已经工作,而不必先运行git status。报告您正在使用的任何Git版本的错误。 编辑: 1.8.3.1确实很古老。您应该尽可能升级。

答案 1 :(得分:1)

注意:升级Git可能还不够,直到Git 2.19(2018年第三季度),因为“ git merge --abort”等在索引中出现冲突的条目时,不能以某些顺序正确地清理东西。涉及D / F冲突。
Git 2.19已更正了该问题。

请参见commit ad37620commit 25c200aElijah Newren (newren)(2018年7月31日)。
(由Junio C Hamano -- gitster --commit 8ba8642中合并,2018年8月17日)

  

read-cache:修复read_index_unmerged()中的目录/文件冲突处理

     

read_index_unmerged()有两个预期目的:

     
      
  • 如果有任何未合并的条目,则返回1,否则返回0
  •   
  • 将所有较高级别的条目放到第0阶段
  •   
     

read_index_unmerged()的多个调用方检查返回值   值是否为非零值,如果满足条件,则全部取die()   被满足。

     

对于这些调用者,将较高级别的条目放到阶段#0会浪费资源,并且在第一个未合并的条目上立即返回会更好。
  但这可能只是一个很小的差异,并不是本系列的重点。

     

其余调用者忽略返回值,并调用此函数,以防将较高级的条目放到#0级。
  如commit e11d7b5(“'reset --merge':修复未合并的情况”,2009-12-31,Git 1.7.0)所述,

     
    

我们要在阶段0保留索引中先前未合并的条目的唯一原因是,这样我们就不会忘记在工作树中具有相应文件的事实,以便当我们要重置的树没有路径时,可以删除它。

  
     

实际上,在commit d1a43f2之前(“ reset --hard / read-tree --reset -u:   删除未合并的新路径”,2008-10-15,Git 1.6.0.4),read_index_unmerged()只是   立即从缓存中删除未合并的条目,但是这样做会产生不良影响,即从中止的合并中在树中留下新的未跟踪文件。

     

所以,这就是该功能的预期目的。

     

问题是当存在目录/文件冲突时,在阶段0尝试将文件添加到索引失败(因为途中仍然存在目录),   并且该函数会以-1的返回码提前返回以表明错误

     

但是,如上所述,没有任何希望执行drop-to-stage-0行为的调用者会检查返回状态,因此,这意味着所有剩余的未合并条目仍保留在索引中,并且调用者会进行其他假设。

     

用户然后会看到以下形式的错误:

error: 'DIR-OR-FILE' appears as both a file and as a directory
error: DIR-OR-FILE: cannot drop to stage #0
     

,还可能包含有关其他未合并条目的消息,这些消息在字典上比文件名和目录都晚。 Google在搜索这些消息时发现了一些匹配项,这表明除我之外可能还有其他几个匹配项。
  幸运的是,多次调用git reset --hard可以解决此错误。

     

由于此处的全部目的是将条目临时放入索引中,以便可以删除工作副本中的任何关联文件,因此我们可以跳过DFCHECK并允许两者要显示在索引中的文件和目录
  调用者将通过调用unpack_trees()来删除索引中目录和文件条目的临时同时出现,这会在尝试写入之前从结果索引中排除这些标记有CE_CONFLICTED标志的未合并条目索引在任何地方。

答案 2 :(得分:1)

在我的情况下,git status并没有帮助,但是在提交本地更改后,它愿意放弃。

我的git版本:v2.25.0.windows.1

答案 3 :(得分:-1)

首先,我们需要运行

git status

然后

git merge --abort