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.txt
的master
内容来解决冲突。 我们添加文件并尝试继续我们的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的一些想法