Git rebase:冲突阻止进展

我有一个git分支(称为v4),是由昨天的主人制作的。 掌握了一些变化,我想进入v4。 所以,在v4中,我尝试着从master进行rebase,并且有一个文件不断地搞砸了:包含版本号的单行文本文件。 这个文件是app/views/common/version.txt ,在重新包装之前包含这个文本:

 v1.4-alpha-02 

这是我正在做的事情:

 > git rebase master First, rewinding head to replay your work on top of it... Applying: new version, new branch error: patch failed: app/views/common/version.txt:1 error: app/views/common/version.txt: patch does not apply Using index info to reconstruct a base tree... Falling back to patching base and 3-way merge... Auto-merging app/views/common/version.txt CONFLICT (content): Merge conflict in app/views/common/version.txt Failed to merge in the changes. Patch failed at 0001 new version, new branch When you have resolved this problem run "git rebase --continue". If you would prefer to skip this patch, instead run "git rebase --skip". To restore the original branch and stop rebasing run "git rebase --abort". 

version.txt现在看起来像这样:

 <<<<<<< HEAD:app/views/common/version.txt v1.4-alpha-02 ======= v1.4-alpha-01 >>>>>>> new version, new branch:app/views/common/version.txt 

所以,我把它整理一下,现在看起来像这样:

 v1.4-alpha-02 

然后我试图继续:首先我尝试一个提交:

 > git commit -a -m "merged" # Not currently on any branch. nothing to commit (working directory clean) 

那里没有运气。 所以,我试图添加文件:

 git add app/views/common/version.txt 

没有反应。 没有消息是好消息,我想。 所以,我试着继续:

 > git rebase --continue Applying: new version, new branch No changes - did you forget to use 'git add'? When you have resolved this problem run "git rebase --continue". If you would prefer to skip this patch, instead run "git rebase --skip". To restore the original branch and stop rebasing run "git rebase --abort". 

就在这一点,经过这个转身之后,我把头从桌子上b了下来。

这里发生了什么? 我究竟做错了什么? 任何人都可以设置我吗?

编辑 – unutbu

我按照你的build议更改了文件,并得到相同的错误:

 > git rebase master First, rewinding head to replay your work on top of it... Applying: new version, new branch error: patch failed: app/views/common/version.txt:1 error: app/views/common/version.txt: patch does not apply Using index info to reconstruct a base tree... Falling back to patching base and 3-way merge... Auto-merging app/views/common/version.txt CONFLICT (content): Merge conflict in app/views/common/version.txt Failed to merge in the changes. Patch failed at 0001 new version, new branch When you have resolved this problem run "git rebase --continue". If you would prefer to skip this patch, instead run "git rebase --skip". To restore the original branch and stop rebasing run "git rebase --abort". 

我遇到了与rebase类似的问题。 我的问题是因为我的一个提交只改变了一个文件,当解决时,我放弃了这个提交引入的改变。 我能通过跳过相应的提交( git rebase --skip )来解决我的问题。

您可以在testing存储库中重现此问题。 首先创build存储库。

 $ mkdir failing-merge $ cd failing-merge $ git init Initialized empty Git repository in $HOME/failing-merge/.git/ 

然后在master中提交version.txt的原始内容。

 $ echo v1.4-alpha-02 > version.txt $ git add version.txt $ git commit -m initial [master (root-commit) 2eef0a5] initial 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 version.txt 

创buildv4分支并更改version.txt的内容。

 $ git checkout -b v4 Switched to a new branch 'v4' $ echo v1.4-alpha-03 > version.txt $ git add version.txt $ git commit -m v4 [v4 1ef8c9b] v4 1 files changed, 1 insertions(+), 1 deletions(-) 

回到master并更改version.txt的内容,以便在rebase期间会有一个conflit。

 $ git checkout master Switched to branch 'master' $ echo v1.4-alpha-04 > version.txt $ git add version.txt $ git commit -m master [master 7313eb3] master 1 files changed, 1 insertions(+), 1 deletions(-) 

切换回v4分支并尝试重新绑定。 按照计划,它会在version.txt .txt中遇到麻烦。

 $ git checkout v4 Switched to branch 'v4' $ git rebase master First, rewinding head to replay your work on top of it... Applying: v4 Using index info to reconstruct a base tree... Falling back to patching base and 3-way merge... Auto-merging version.txt CONFLICT (content): Merge conflict in version.txt Recorded preimage for 'version.txt' Failed to merge in the changes. Patch failed at 0001 v4 When you have resolved this problem run "git rebase --continue". If you would prefer to skip this patch, instead run "git rebase --skip". To restore the original branch and stop rebasing run "git rebase --abort". $ cat version.txt <<<<<<< HEAD v1.4-alpha-04 ======= v1.4-alpha-03 >>>>>>> v4 

我们通过selectversion.txtmaster内容来解决冲突。 我们添加文件并尝试继续我们的rebase。

 $ echo v1.4-alpha-04 > version.txt $ git add version.txt $ git rebase --continue Applying: v4 No changes - did you forget to use 'git add'? If there is nothing left to stage, chances are that something else already introduced the same changes; you might want to skip this patch. When you have resolved this problem run "git rebase --continue". If you would prefer to skip this patch, instead run "git rebase --skip". To restore the original branch and stop rebasing run "git rebase --abort". 

它失败 ! 让我们看看git认为在我们的仓库中有什么变化。

 $ git status # Not currently on any branch. nothing to commit (working directory clean) 

啊,没有变化。 如果你仔细阅读之前的错误信息, git通知我们这个build议使用git rebase --skip 。 他告诉我们:“如果没有剩下的东西,有可能是其他东西已经引入了相同的变化,你可能想跳过这个补丁。 所以我们只是跳过提交和rebase成功。

 $ git rebase --skip HEAD is now at 7313eb3 master 

谨慎的话 :请注意, git rebase --skip会完全放弃git尝试重新绑定的提交。 在我们的例子中,这应该是好的,因为git抱怨这是一个空的提交。 如果你认为在rebase完成后你已经失去了更改,那么你可以使用git reflog在rebase之前获取你的仓库的commit id,并使用git reset --hard来让你的仓库恢复到这个状态(这是另一个破坏性的操作)。

从这里引用: http : //wholemeal.co.nz/node/9

咦?!? 不,我没有忘记使用git add,我做了…就像… 2秒前!

事实certificate,因为没有从补丁git怀疑有什么问题已经出错的变化。 Git希望已经应用了一个补丁,但该文件保持不变。

错误消息不是很直观,但它确实包含答案。 我们只需要告诉rebase就可以跳过这个补丁。 也没有必要修复文件中的冲突标记。 你将最终得到你正在devise的分支的文件版本。

 $ git rebase --skip 

将app / views / common / version.txt更改为

 v1.4-alpha-01 

在rebase的这一点上,记住你正在解决合并冲突,以显示非主分支的进展。

所以,从重新启动

  A---B---C topic / D---E---F---G master 

  A*--B*--C* topic / D---E---F---G master 

您正在解决的冲突是如何在主题分支上创buildA *。

所以在做git rebase --abort ,命令应该是

 git checkout topic git rebase master < make edits to resolve conflicts > git add . git rebase --continue 

这个错误信息是你的git commit -a -m "merged" 。 如果你只是修复这个文件,然后运行git add <file> ,然后git rebase --continue ,它应该可以正常工作。 git rebase --continue正在尝试做一个提交,但发现没有待提交的更改提交(因为你已经提交了)。

你看到的行为不是我所期待的,就是与这种冲突的典型的重组。 考虑使用一个单独的分支来做这个rebase(特别是如果你已经远程推送提交你正在快速转发)。 另外, git mergetool可以帮助解决冲突并记住发出git add

在这个最小的例子中,rebase按预期工作。 你能否提供一个显示你所看到的行为的例子?

 #!/bin/bash cd /tmp mkdir rebasetest cd rebasetest git init echo 'v1.0' > version.txt git add version.txt git commit -m 'initial commit' git checkout -b v4 echo 'v1.4-alpha-01' > version.txt git add version.txt git commit -m 'created v4' git checkout master git merge v4 echo 'v1.4-alpha-01-rc1' > version.txt git add version.txt git commit -m 'upped version on master to v1.4-alpha-01-rc1' git checkout v4 echo 'v1.4-alpha-02' > version.txt git add version.txt git commit -m 'starting work on alpha-02' git rebase master echo 'v1.4-alpha-02' > version.txt git add version.txt git rebase --continue 

这里有一些想法:

  • 在开始rebase之前,确保你没有在rebase或中间。 做: rm -rf .git/rebase-apply
    • 如果你使用Bash, 增强你的bash提示,所以它总是自动呈现这些信息
  • 有一点你提到我不明白:“然后试着继续:起初我尝试一个提交:”…为什么提交? 在一个rebase的中间,我认为你应该只在你收拾整理或“git rm”来折腾修改或确认一个文件删除之后“git add”。 也许这弄乱了什么?
  • 尝试合并,而不是一个rebase
  • 尝试Ethan Rowe的一些想法