将分支rebase到主分支master失败,如何解决?

26

我一直在本地副本上工作,这是一个远程git仓库。 我在本地副本上创建了一个分支,叫做'my_branch'。 我已经在'my_branch'上提交了几次。

最近我将'my_branch'推送到了远程。但是我不知道有人向远程主分支添加了一个版本。所以,我将它拉到了我的本地主分支。

总之,我的本地仓库看起来像这样(我试图使用这里的图表约定)。

 --C0--------------C7--  (local master)
      \
       --C1-C2-C3--     (local my_branch)
             \
              --C4-C5-C6--     (local sandbox_branch)

我希望它看起来像这样:

 --C0--------------C7--  (local master)
                      \
                       --C1'-C2'-C3'--     (local my_branch)
                             \
                              --C4'-C5'-C6'--     (local sandbox_branch)

我试图将我的分支rebase到本地master上,但是我得到了这个错误消息(我使用一个名为GitX的git可视化工具):

Rebase Failed!
There was an error rebasing HEAD with branch 'master'.

command: git rebase refs/heads/master

It seems that I cannot create a rebase-apply directory, and
I wonder if you are in the middle of patch application or another
rebase.  If that is not the case, please
    rm -fr /my_project_directory/.git/rebase-apply
and run me again.  I am stopping in case you still have something
valuable there.
我做错了什么?我应该如何处理?如果我要在命令行上执行此操作,那么将我带到图中状态的命令是什么?
更新1:
顺便说一下,我没有处于应用程序补丁或其他rebase的中间状态...至少不是故意的。 在发现我推送后远程更新了之后,我进行了一次fetch。这会导致GitX认为我处于应用程序补丁或另一个rebase的中间状态吗?
我还更新了图表以使其更准确。有一个从my_branch分支出来的分支。我最初没有包括它在内,因为我认为这并不重要。我包括它只是以防万一...
更新2:
FYI... 'local'和'remote'的master tree看起来像我画的图,除了它没有sandbox_branch。

1
你尝试过 git rebase --abort 吗? - Fred Foo
看起来我无法创建一个rebase-apply目录,我想知道你是否正在进行补丁应用或另一个rebase操作?这是情况吗? - fge
好的,那么实际上有一个名字像git所说的目录吗?git status命令输出了什么? - fge
@larsmans:运行git rebase --abort命令后,提示信息为HEAD is now at 445ef4b REMOVED "ADD AN ALBUM" BUTTON。但是当我在GitX中查看分支图表时...似乎没有任何变化。 - milesmeow
@fge:git status 给了我 # On branch lite_main nothing to commit (working directory clean)。注意:这是在执行 git rebase --abort 之后的情况。我尝试使用 GitX 再次进行变基。我认为它运行了 git rebase master lite_main。现在我得到了合并冲突……我想这就是我预期的结果。:) 听起来对吗?我仍然在我的 lite_main 分支上。所以我应该在该分支上解决冲突,然后运行 git rebase --continue,是吗? - milesmeow
2个回答

41

git rebase发现了.git/rebase-apply目录,因此假设您可能正在进行重新基础操作。如果在以前的rebase过程中存在冲突并且rebase尚未完成,则会发生这种情况;即您没有运行git rebase --abortgit rebase --skipgit rebase --continue(在解决冲突后最后一个命令)。

无论如何,如果您认为自己根本没有运行git rebase,那么您陷入这种状态并不重要。只需按照帮助建议使用rm -fr /my_project_directory/.git/rebase-apply命令,并且您现在应该能够执行rebase操作了。

但是请注意,由于您已经将分支发布到远程存储库中,因此不应尝试将主分支重新基础到它上面。实际上,如果您的远程设置为拒绝非快进提交(这似乎是一般推荐的最佳实践),则您甚至无法将rebase更改推送到远程存储库。通常,在将提交(也就是git rebase所做的事情)发布到远程存储库后尝试修改提交是不好的做法。


哎呀......那我该怎么办呢?我对 git 还比较新手。先执行 git rebase --abort 吗?另外,顺便说一下,“本地”和“远程”的主树看起来像我画的图一样,只是没有沙盘分支。 - milesmeow
我猜我可以在本地将我的更改合并到主分支,然后推送到远程……这样做可以吗? - milesmeow
你想将这些更改发布到远程主分支吗?如果是的话,你应该将分支合并到主分支并推送到远程。如果你只想确保最新的主分支更改也包含在你的分支中,那么请将主分支合并到你的本地分支并将其推送到你的远程分支。 - Siddhartha Reddy
我尝试了 git rebase 并解决了冲突(只到太晚了,没有看到你的评论),然后也尝试了 git reset --hard 来修复我的本地 repo。我认为我已经基本上把我的本地 repo 搞砸了...所以,我基本上又克隆了一遍远程 repo。检出了 my_branch 作为跟踪分支。现在我该如何将分支合并到主分支并推送到远程? - milesmeow
确保您已经检出主分支。然后执行以下命令:git merge origin/<branch_name>git push origin master。我假设您的远程仓库名称为 origin。 - Siddhartha Reddy

2

前往您的项目目录。在 .git 文件夹下找到 rebase-apply 文件夹并删除它。

注意:默认情况下,.git 文件夹是隐藏的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接