我在解决以下情况出现问题时遇到问题:
我在development
后面有一个功能分支X,所以当git rebase development
在此功能分支X上时,我会通过调用HEAD
对此功能分支进行重新设置.Git现在重放development
上我的功能分支的所有提交,并在有冲突的提交时停止。我通过删除一些不应该在那里的文件来修复冲突,并将文件夹添加到我的.gitignore
然后继续进行更改和git rebase --continue
。
现在,rebase在一个提交上再次停止,该提交对我之前删除的一些文件进行了更改。但是,git
尝试将更改应用于文件夹中的其他文件,而不是注意到此特定文件不再存在!
为什么这是默认行为? (我运行Git 2.0)
冲突文件的差异是这样的:
++<<<<<<< HEAD:<path>/XML/fileA.xslt
+ [...]
+
++=======
+ [....]
+
++>>>>>>> <commit message>:<path>/XML/fileB.html
答案 0 :(得分:1)
为什么这是默认行为?
每个提交都存储一个文件树,当你重新定义时(据我所知),它只是从基础提交开始合并每个提交提交。
解决冲突时会发生什么情况,例如删除目录fileA.xslt
中的文件/XML/
,该文件本身存储为树,如下所示:
git ls-tree HEAD XML/
... blob ... fileA.xslt
... blob ... fileB.html
删除后,XML目录树如下所示:
git ls-tree HEAD XML/
... blob ... fileB.html
现在,如果您尝试再次将其与已删除文件的树(修改它的提交)合并:
git ls-tree HEAD XML/
... blob ... fileA.xslt
... blob ... fileB.html
所以我的猜测是匹配它可能会尝试将fileB.html
转换为fileA.xst
,因为它们都是XML
树的不同版本中的第一个文件,或者已经确定非常相似。
BTW:如果有必要,您可以进行交互式rebase并编辑,跳过或重新排序提交。
答案 1 :(得分:0)
由于git不记录所做的更改,只记录快照,因此错误地将您的更改检测为将.xml重命名为.html并将其内容替换为.html文件的内容。我想可能会有一些开关为git提供关于此事的提示,但我不确定。