Git rebase 一次又一次地回到同一个地方

Posted

技术标签:

【中文标题】Git rebase 一次又一次地回到同一个地方【英文标题】:Git rebase circles back to same place again and again 【发布时间】:2015-06-08 03:31:04 【问题描述】:

我在使用 Git rebase 时遇到问题,我必须一次又一次地合并代码但仍然不成功。

我从主人那里剪掉了我的分支 (A)。我开始在我的分支上工作并进行了更多的提交。与此同时,master 也发生了变化,并经历了一堆提交。现在我正在尝试将我的分支合并回 master。

所以我给,

git co master
git pull 
git co branch-A
git rebase master

现在我收到类似 CONFLICT : Merge conflict in 的消息

有了这个,它分支到一个新的分支名称(没有分支,变基分支-A) 在这之后我解决了所有的冲突,然后我给了所有这些文件的 git add。

现在我得到了状态

rebase in progress; onto ad0da3f
You are currently rebasing branch 'branch-A' on 'ad0da3f'.
  (all conflicts fixed: run "git rebase --continue")

在此之后,我运行 git rebase --continue 并且我为解决冲突所做的所有更改都消失了,它会像以前一样回到合并和抛出大量冲突的初始状态!

我的问题是,

    如何取回我在发出 git rebase --continue 之前完成的所有冲突解决方案? 我怎样才能不陷入需要一次又一次合并以将更改从 master 拉到我的分支的同一个循环中?

    在我成功将所有从master的更改合并到我的分支之后,将我的分支合并回master,我可以简单地使用吗,

    git 合作大师 git 合并分支-A

或者我需要发出更多命令吗?

请帮忙...

【问题讨论】:

你试过答案了吗? 【参考方案1】:

对我来说,很难说你有什么问题,但请按照以下步骤操作:

首先,备份您的项目所在的文件夹,如果 出了点问题,你还有原来的本地仓库。

在 master 中使用 rebase 进行拉取:

git checkout master

git pull --rebase origin master

用 master 重新定位你的分支:

git checkout branch-A

git rebase master

当然,如果有一些冲突,请按照你已经在做的方式解决。

当我说自己重新建立一个分支时,我想说的是用远程更新你的分支。当然,如果只使用分支-A,则不需要在本地分支中执行 pullpull --rebase。但是在 master 中,使用 rebase 到 avoid merge commits that result from git pull 是一个很好的做法。当然,rebase 会导致一些影响,例如,当您在执行 rebase 之前推送提交时。因此,理想的做法是将所有内容都本地化,并且只有在 rebase 之后,您才能推送您的分支或将其与 master 合并。见The Perils of Rebasing。

在我的情况下,我喜欢做的是:在使用 master 重新定位我的功能分支后,我结帐到 master 并执行 git merge <my-branch> --no-ff。这样我的 git 历史就有一个提交 merge branch 'my-branch'。而且我喜欢我的 git 历史记录。

有关合并与变基的更多信息,请参阅this answer 的问题“git merge”和“git rebase”有什么区别?

【讨论】:

您好 androider,感谢您花时间帮助我。实际上,我发现我并没有丢失所有的更改,只是我需要在每个提交级别中合并以决定接受哪个提交以及忽略哪个提交。因此,我仍在解决这些问题并继续运行 rebase。我不知道如果我们自己 rebase 一个分支会发生什么。您能否提供一些信息,将我指向一篇解释该问题的文章?再次感谢您提供宝贵的建议来解决我的问题:) 我更新了答案。没有必要执行我命名为 rebase 的步骤 with itsel。但是,如果您还有问题,并且无法正确执行 rebase,那么改进答案会很有用,请参阅您的两个分支(master 和 branch-A)的日志。至少是这些分支的最后一次提交。 非常感谢您提供更多信息。由于 master 和我的分支上都有大量提交,我必须解决每个提交并运行 git add 和 rebase --continue 而不是提交(因为 rebase --continue 本身正在这样做)。之后,所有的冲突都解决了,我将我的分支与 master 合并了。【参考方案2】:

虽然总是可以rebase 一个新分支(在第一次推送到远程之前),但稍后再次变基(随着主分支的进展)和第二次推送似乎 git 不完全支持。

确切地说,在后一种情况下,git 抱怨说您需要先拉动,然后才能推送(到您自己的远程分支,没有其他人提交任何更改!),但是一旦拉动,您就会突然遇到合并冲突(与谁 - 和我自己?),地狱从这里开始......我知道很少有团队因为这些问题从rebase切换回merge

因此,一旦您的分支被推送到远程,提交并推送以下更改是合理的(可能是为了响应审阅者 cmets),但永远不要再次变基。如果主分支进展到维护者要求第二次变基,那么它所能做的就是变基,然后重命名分支。然后它可以作为新的推送,同时打开一个新的拉取请求。

或者,您可以使用 --force 推送来擦除远程副本并将其替换为当前本地内容。但是 --force 有点不受欢迎,所以我不能说“推荐的解决方案”。

git 针对快速审查和合并拉取请求进行了优化。繁殖和孵化它们数周和数月仍处于良好状态的可能性是有限的。

【讨论】:

以上是关于Git rebase 一次又一次地回到同一个地方的主要内容,如果未能解决你的问题,请参考以下文章

OnNavigationItemsSelected 侦听器一次又一次地启动相同的活动

由于我的基本 URI 不固定,在 Webflux 中一次又一次地创建 Webclient 是不是明智?

我的音乐播放器应用程序一次又一次地崩溃

为啥客户端不能一次又一次地获取输入;它只是在一个输入和一个来自服务器的响应后变为空白?

Swift,如何通过按下按钮一次又一次地播放声音

如何避免要求用户一次又一次地登录(连接)到我的 Facebook 应用程序?