首先我合并,然后发生冲突,所以我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
答案 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 ad37620的commit 25c200a,Elijah 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