gpt4 book ai didi

git - 如何更新 fork 以发出干净的 pull 请求?

转载 作者:行者123 更新时间:2023-12-04 14:59:37 24 4
gpt4 key购买 nike

我正在为 github 上的一个 fork 副本的开源仓库做出贡献

我通常只会每隔几个月修复一次我发现的奇怪错误,与此同时,还会发生许多其他开发。我将 pull 请求放入我的分支中以获取新的更改。

现在它们出现在我的 pull requests back to the original repo 中. enter image description here

如何发出仅包含每次修复提交的干净 pull 请求?我试过 git 在本地获取原始 repo 并从中进行 merge ,但我遇到了同样的问题。

最佳答案

tl;dr:从上游/master 分支出来。不要向你本地的主人 promise 。

如果您的分支有本地更改,而您只是与上游 merge ,您仍然会有那些本地更改。当您基于此 merge 的母版提交 PR 时,它将包含这些本地更改。

让我们来演示一下。这是 merge 本地更改后的样子。

# Your situation after merging with local changes.
# D - E - F are new changes from upstream.
# 1 - 2 - 3 is your local changes.

A - B - C - D - E - F [upstream/master]
\ \
1 - 2 - 3 - M [master]

现在您从 master 创建一个分支并添加一些提交。

A - B - C - D - E - F [upstream/master]
\ \
1 - 2 - 3 - M [master]
\
4 - 5 - 6 [feature]

如果您以 upstream/master 为基础将特性作为 PR 提交,它将拖入 1 - 2 - 3 以及 4 - 5 - 6,因为它们都包含与 upstream/master 的差异。

这就是为什么要避免直接提交给 master 的原因,因为你不再有新分支的共同基础。相反,在分支机构中完成所有工作并将它们作为 PR 提交。


最简单和最安全的事情是将你的工作从 upstream/master 分支出来,而不是从 master 分支出来。那么你的 fork 处于什么状态并不重要。

$ git checkout -b feature upstream/master
# then make a few commits

4 - 5 - 6 [feature]
/
A - B - C - D - E - F [upstream/master]
\ \
1 - 2 - 3 - M [master]

如果你有一个现有的 master 分支,将其 rebase 到 upstream/master。这将重写每个提交,就像您将它写在上游/主控之上一样。可能存在冲突,请根据需要进行修复。

# Before with feature based on master.

A - B - C - D - E - F [upstream/master]
\ \
1 - 2 - 3 - M [master]
\
4 - 5 - 6 [feature]

# Rebase onto upstream/master the commits from master to feature.
$ git rebase --onto upstream/master master feature

4A - 5A - 6A [feature]
/
A - B - C - D - E - F [upstream/master]
\ \
1 - 2 - 3 - M [master]
\
4 - 5 - 6

原来的4-5-6最终会被删除。


要恢复你的 fork 的 master,将你的 master 返回给你的上游的 master。

首先,在您现有的 master 上创建一个新分支以保留任何本地更改。

$ git checkout master
$ git branch dev # or whatever you want to call it

A - B - C - D - E - F [upstream/master]
\ \
1 - 2 - 3 - M [master]
[dev]

现在您对 master 所做的任何本地更改都将保留在您的 dev 分支中。您可以随意命名它,但要避免使用上游已经存在的分支名称。

然后将本地 master 移动到上游的 master。

$ git checkout master
$ git reset --hard upstream/master

[master]
A - B - C - D - E - F [upstream/master]
\ \
1 - 2 - 3 - M [dev]

Git 中的分支只是指向提交的标签。 git reset 是您随意移动它们的方式。这会将您的本地 master 移动到 upstream/master 指向的位置。 --hard 指的是如何处理暂存区和 check out 文件(工作副本)。 --hard 表示也将它们重置为 upstream/master。

现在你的主人是他们的上游/主人。 dev 将您的本地更改交给 master。

最后,将新的本地 master 推送到 origin。既然动了,就得用力。 不要使用 --force 使用更安全的 git push --force-with-lease .

如果你想更新你的本地master,简单的git pullgit pull 只是一个 git fetch 加上一个 git merge。我们将执行 git pull 作为两个单独的步骤来进行演示。

# Fetch new commits, that's G and H.
$ git fetch upstream

G - H [upstream/master]
/
A - B - C - D - E - F [master]
\ \
1 - 2 - 3 - M [dev]

$ git checkout master
$ git merge upstream/master

[master]
G - H [upstream/master]
/
A - B - C - D - E - F
\ \
1 - 2 - 3 - M [dev]

因为 master 是 upstream/master 的直接祖先,所以不需要 merge 提交。 Git 会将 master“快进”到 upstream/master。

关于git - 如何更新 fork 以发出干净的 pull 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67234269/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com