Git变基:冲突不断阻碍进度


120

我有一个git分支(称为v4),它是昨天才由master制作的。我想对v4进行一些母版更改。因此,在v4中,我尝试从master进行重新设置,一个文件使问题不断恶化:一个单行文本文件,其中包含版本号。该文件是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".

正是在这一点上,我不断地转过身,把头从桌子上摔下来。

这里发生了什么?我究竟做错了什么?谁能让我挺直?

编辑-对于unutbu

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

> 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".

10
感谢您提出这个问题..我正面临同样的问题
Archan Mishra 2012年

6
如果您确定一些答案
那就

3
@MaxWilliams,我认为您(和我一样)对@unutbu的建议有误解 :1)首先,您运行git rebase master 并使其失败;2)然后您进行编辑version.txt并使其如它在该点上所看到的那样保存并保存;3)然后你git add .../version.txt;4)然后你做git rebase --continue '提交')!如果rebase --continue在这里成功,则它已经被提交git commit这里不需要!)-因此,剩下要做的就是git push(如果您使用远程仓库)。希望如果我做对了,这会有所帮助:)-干杯!
sdaau

@MaxWilliams,您有没有得到以下答案:ruby-forum.com/topic/187288(如果其他人没有首先到达那里,我会在回复后立即删除此内容!)
atw

Answers:


102

我遇到了一个类似的问题,与基地。造成我的问题的原因是,我的提交中的一个仅更改了文件,而在解决时,我放弃了此提交中引入的更改。我可以跳过相应的commit(git rebase --skip)解决问题。

您可以在测试存储库中重现此问题。首先创建存储库。

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

然后提交version.txtmaster中的原始内容。

$ 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

创建v4分支并更改的内容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以便在重新设置基准期间发生冲突。

$ 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并按计划进行了限制。

$ 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

我们通过选择的master内容来解决冲突version.txt。我们添加文件并尝试继续我们的变基。

$ 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告知我们并建议使用git rebase --skip。他告诉我们:“如果没有什么可上演的,很可能其他内容已经进行了相同的更改;您可能希望跳过此补丁。” 因此,我们只需跳过提交操作,即可成功重新设置基准。

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

谨慎的字:请注意,git rebase --skip将彻底删除该承诺是git试图重订。在我们的情况下,这应该没问题,因为git抱怨这是一个空的提交。如果您认为在完成基准变更后丢失了更改,则可以使用git reflog来在进行基准变更之前获取存储库的提交ID,并用于git reset --hard使软件仓库恢复到该状态(这是另一种破坏性操作)。


4
感谢您抽出宝贵的时间来写冗长的说明Sylvain!这确实使其更加清晰。我认为我总是不愿意跳过一个补丁,因为它好像会丢失工作:也就是说,该补丁涉及受基准服务器影响的所有文件,而不仅仅是涉及冲突的文件。补丁只是对单个文件的一次合并吗?
Max Williams

3
不,补丁包含一次提交中修改的所有文件的所有差异。但是,使用时git rebase --skip,您仅跳过单个提交。我通常会git status在跳过提交之前发出a ,以查看我是否处于这种情况。
西尔文·德夫雷斯内

1
我只是想回应马克斯,感谢您抽出宝贵的时间来写一个很好的解释,我终于明白了为什么会这样。我也不再害怕rebase --skip:)。
Ben Dolman

1
警告-如果您在一次提交中进行了几处更改,则在执行git rebase --skip时可能会丢失工作。我刚刚做了
Chrissy H

@ChrissyH除非您执行了,git reflog purge否则git reflog delete您仍然可以使用来找回更改git reflog。尝试检查那里引用的不同提交,其中一个应该是树的状态,然后再开始整体git rebase
Sylvain Defresne 2013年

23

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

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

事实证明,由于修补程序git没有变化,因此怀疑出了问题。Git希望已应用补丁,但文件未更改。

该错误消息不是很直观,但是确实包含了答案。我们只需要告诉rebase跳过此补丁即可。也不必修复文件中的冲突标记。您最终将获得您所基于的分支的文件版本。

$ git rebase --skip

在使用git mergetool并修复了更改,然后添加并提交更改之后,我只输入了<code> git rebase --skip </ code>,而“当前不在任何分支中”。一切都已修复。谢谢!
geerlingguy 2012年

实际上,我认为这是不断运行git mergetool,然后git rebase --continue,然后git mergetool等的组合,最终解决了我的问题。
geerlingguy 2012年

6

该错误消息是您造成的git commit -a -m "merged"。如果您只修复文件,请运行git add <file>git rebase --continue,它应该可以正常工作。git rebase --continue正在尝试进行提交,但发现没有任何待提交的更改(因为您已经提交了)。


1
至少在一般情况下,这似乎比跳过更合理。我很惊讶它没有被列为最佳答案。
EmeraldD。

1
@EmeraldD。,不起作用。修复文件并运行git add <file>无法解决问题。git rebase --continue 仍在报告No changes - did you forget to use 'git add'?
Pacerier,2015年

6

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

v1.4-alpha-01

在重新基准的这一点上,请记住,您正在解决合并冲突以显示非主分支的进度。

所以,从

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

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

您要解决的冲突在于如何在主题分支上创建A *。

所以做完之后git rebase --abort,命令应该是

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

3
谢谢unutbu,我尝试了一下,但是没有运气:请参见OP进行新的编辑。欢呼声
马克斯·威廉斯

4

您所看到的行为不是我希望从具有这种冲突的典型重新部署中获得的。考虑使用一个单独的分支来进行此基础调整(特别是如果您已经远程提交了快进的提交)。另外,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

4

这里有一些想法:

  • 在开始变基之前,请确保您不在变基中间或上午。做:rm -rf .git/rebase-apply
  • 您提到的一点我听不懂:“然后尝试继续:起初我尝试提交:” ...为什么要提交?在重新设置基准的过程中,我认为您只应在整理后使用“ git add”或“ git rm”来扔更改或确认文件删除。也许这搞砸了吗?
  • 尝试合并而不是变基
  • 尝试一些Ethan Rowe的想法
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.