我有以下git历史记录
cd
我想将* bee55e9 (HEAD -> WM-290) - Jepessen : Little refactoring. (4 minutes ago)
* 1a4470a - Jepessen : Project refactoring (5 minutes ago)
* 399f769 - Jepessen : Added some documentation. (15 minutes ago)
* cb1055e - Jepessen : Another Test passed. (21 minutes ago)
* 549f147 - Jepessen : Another test passed. (24 minutes ago)
* b77c862 - Jepessen : First test passed. (29 minutes ago)
* d2c9d86 - Jepessen : Integer -> IntegerValue: Failing test added. (31 minutes ago)
* 678c0b1 - Jepessen : ExpressionTest added. (2 hours ago)
* b65284b - Jepessen : Refactored. (2 hours ago)
* 29ccc99 - Jepessen : Solution Refactored. (2 hours ago)
* 83f7a45 - Jepessen : Some Refactoring (2 hours ago)
* c33b81f - Jepessen : Integer class added. (2 hours ago)
* 1415bb4 - Jepessen : Leaf class added. (2 hours ago)
* a25da8b - Jepessen : Added Expression project (2 hours ago)
* aa9c4e8 (origin/master, origin/HEAD, master) - Jepessen : WMathTest C# solution added. (2 hours ago)
* b31dc4d - Jepessen : .gitignore updated. (2 hours ago)
* f7285b1 - Jepessen : Removed old files. (2 hours ago)
* 8d1213c - Jepessen : .gitignore updated. (23 hours ago)
* ed5a67a - Jepessen : WSchool project added. (24 hours ago)
分支压缩成一个提交。我使用命令
WM-290
在交互式变基中,我写道:
git rebase -i master
在变基期间,我收到以下错误消息:
pick a25da8b Added Expression project
s 1415bb4 Leaf class added.
s c33b81f Integer class added.
s 83f7a45 Some Refactoring
s 29ccc99 Solution Refactored.
s b65284b Refactored.
s 678c0b1 ExpressionTest added.
s d2c9d86 Integer -> IntegerValue: Failing test added.
s b77c862 First test passed.
s 549f147 Another test passed.
s cb1055e Another Test passed.
s 399f769 Added some documentation.
s 1a4470a Project refactoring
s bee55e9 Little refactoring.
但如果我使用命令error: Your local changes to the following files would be overwritten by merge:
WMathTest/Expression/Expression.csproj
Please commit your changes or stash them before you merge.
Aborting
Could not apply 83f7a45... Some Refactoring
,我会收到以下消息:
git mergetool
我唯一可以做的就是中止变基。
为什么会出现冲突,考虑到分支位于$ git mergetool
No files need merging
分支的顶部,如果没有文件需要合并,我该如何解决呢?
编辑:
在冲突期间,这是命令master
:
git status
答案 0 :(得分:1)
(我假设顶部的图形片段是git log --oneline --decorate
或类似的输出。)
我不能立即明白是什么让你进入的情况,但情况本身已经足够清楚了: 1 在交互式rebase失败时,文件WMathTest/Expression/Expression.csproj
在您的工作树中,但不在您的索引中。
据推测,提交83f7a45
包含(包括或包括)添加新文件WMathTest/Expression/Expression.csproj
,该文件不在存储在提交c33b81f Integer class added.
中的快照中。但是,&#39 ;提交83f7a45
中的s与您现在的工作树中的内容不匹配。具体来说,这个文件如何进入你的工作树,它处于现在的状态,当它在某些中间提交中时 - 是我发现有点不清楚的部分。对于这种情况,同一文件必须也不在提交bee55e9 Little refactoring.
中(如果 在该提交中,而不是a25da8b Added Expression project
},Git会在rebase开始时安全地删除它。如果它在 bee55e9
和a25da8b
中,Git会替换 带有起始版本的工作树文件,并且我们不再处于这种情况。唯一剩下的可能性是它不在中提交 - 不在分支中提示而不是在第一个pick
提交中 - 但由于某种原因现在正坐在工作树中。只有你可以解释。)
在任何情况下,由于此文件,交互式rebase用于挑选或压缩每个提交到当前索引和工作树的基础git cherry-pick
操作失败。此文件没有合并冲突,因为它没有合并:它仅仅是以rebase的方式。
一个解决方案是提交它(跟踪它),或者在工作树中删除它,当它位于WM-290
的顶端时,这样Git本身就会将其删除,或者它是&#39不要坐在路上。
另一个是跳过所有的rebase东西。如果您只是想让当前索引内容在分支WM-290
的尖端成为单个提交,并且该单个提交具有作为其父级的提交,那么当前是master
的提示,您可以只是做:
git reset --soft master
git commit
并编写一个全新的提交消息(请注意,这不会像git rebase -i
那样为您构建中间压缩的提交消息)。 --soft
告诉Git不要触摸索引(当然也不是工作树),因此索引继续包含WM-290
引用提交bee55e9
时的快照。这个reset
只是将分支标签移回去,以便下一个新提交有aa9c4e8
作为其父级:
newnewn <-- WM-290
/
...--b31dc4d--aa9c4e8 <-- master
\
a25da8b--1415bb4--...--bee55e9 [was WM-290]
提交newnewn
的快照(我们目前还不知道的ID)将是与{{1}的快照相同的 }。 父提交将为bee55e9
。这就是aa9c4e8
的作用:保持索引不变,以便新的提交将重新使用它,但移动分支名称,以便新的提交将继续其他一些提交。
1 嗯,对于那些与Git一起工作多年 fight 的人来说很清楚。 : - )