首页 > 解决方案 > 这个分支是 xy:master 之前的 x 次提交

问题描述

我在GitHub上创建了一个项目,开始推送 PR(每个都在不同的分支下)。一切都很好。然后我看到我的 :master 是 X 提交落后所以我想更新到当前的上游状态。

我试过了:

git remote add upstream https://github.com/home-assistant/brands.git
git pull upstream master
git push --force-with-lease origin master

在此处输入图像描述

我得到:

这个分支比 home-assistant:master 提前 4 次提交。

现在,每次我创建新 PR 时,它都会添加额外的提交:

在此处输入图像描述

伟大的。我在这里发现了许多类似的问题和答案,但似乎都没有工作(获取、重置 --hard origin/master)。

有没有办法解决这个问题,或者我应该删除叉子并重新开始?

标签: gitgithub

解决方案


我需要看看git log --graph --decorate --oneline才能确定,但​​这就是可能发生的事情。

git pull upstream master真的是一个git fetch upstream和一个git merge upstream/master。与任何合并一样,它将留下合并提交。这就是你所看到的。

这些合并是不必要的。与合并功能分支不同,这些更新合并对这个项目的未来编码人员没有兴趣。他们妨碍了。

您可以摆脱它们,而不是在上游/主控之上合并,而是在上游/主控之上重新定位。git rebase upstream/master. 您的本地提交将在最新的上游/主节点之上重写,而不是合并。现有的不必要的合并将被消除。

我建议为所有拉动重新设置基础。您可以配置您的 Git 以使用git config --global pull.rebase merges. 这将变基,但保留现有的合并。

最后,为避免将来出现这种情况,请不要在您的 master 分支上工作。保持主人清洁。在功能分支中完成所有工作,将其用作您的 PR,然后删除功能分支。这样可以避免很多问题。


为了说明,这就是“X 提交发散”的样子。

upstream
A - B - C - G - H - I [master]

origin
          G - H - I [upstream/master]
         /  
A - B - C - D - E [master]

而在你git pull upstream master...

$ git pull upstream master

upstream
A - B - C - G - H - I [master]

origin
          G - H - I [upstream/master]
         /         \
A - B - C - D - E - M [master]

注意合并。为了消除这种情况,请在上游/主服务器之上重新设置基准。

$ git rebase upstream/master

upstream
A - B - C - G - H - I [master]

origin

A - B - C - G - H - I [upstream/master]
                     \
                      D1 - E1 [master]

现在你的历史很好而且线性,就好像你一直在最新的大师之上工作一样。

最后,这项工作应该在一个特性分支中完成。看起来像这样。

upstream
A - B - C - G - H - I [master]

origin
          G - H - I [upstream/master]
         /  
A - B - C [master]
         \
          D - E [feature]

更新 master 现在是一个简单的快进。

$ git checkout master
$ git pull upstream master

upstream
A - B - C - G - H - I [master]

origin
                      [upstream/master]
A - B - C - G - H - I [master]
         \
          D - E [feature]

并且您可以在 master 之上重新定位您的功能分支(或跳过一个步骤并直接在上游/master 之上重新定位)。

$ git checkout feature
$ git rebase master

upstream
A - B - C - G - H - I [master]

origin
                      [upstream/master]
A - B - C - G - H - I [master]
                     \
                      D1 - E1 [feature]

推荐阅读