Git rebase尝试将更改应用于错误的文件

时间:2014-08-27 10:27:11

标签: git rebase

我在解决以下情况出现问题时遇到问题:

我在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

2 个答案:

答案 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提供关于此事的提示,但我不确定。