git - 这个分支是 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)。
有没有办法解决这个问题,或者我应该删除叉子并重新开始?
解决方案
我需要看看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]
推荐阅读
- android - 如何在 Android 应用程序中将阿拉伯语文本转换为语音?
- math - MATLAB|OCTAVE - 不一致的参数
- php - Ajax 成功消失不显示
- java - 如何将 ArrayList 参数添加到 ArrayList 然后添加到当前类 ArrayList
- ssl - MariaDB 10.4.13 添加 ssl_crl 导致读取授权包出错
- java - 删除 `ArrayList` 的一个元素,并通过自定义 `Dialog` 的命令将信息设置为 `MainActivity` 中的布局
- reactjs - 无法渲染复杂的 React 元素以用 id 替换 DOM 元素
- mysql - mysql 在行上选择分组依据和 datdiff
- c# - Task-Like 和 ConfigureAwait(false),有可能吗?
- android - Firebase Auth 在 Android 手机上不起作用 - 弹出窗口闪烁