Git 从项目分支中删除提交
Git Remove commits from a project fork
所以,我在 Github 上分叉了一个项目,并进行了 2 次提交。我也将这些提交推送到我的叉子上。
同时,上游项目也有2次commit。
假设分叉时,两个分支都在头A
A
然后我做了两个提交 B 和 C 并将它们推入我的叉子
A - B - C
并且上游提交了 D 和 E
A - D - E
在我的 fork 克隆回购中,我从上游获取,所以状态是
A - D - E
\
B - C
然后我做了一个变基,使状态变为
A - D - E
\
B - C - D' - E'
现在,我想把它放在我的叉子里,这样 D 和 E 就不存在了,头在 E'。我是唯一一个用我的叉子的人。
我在这里检查了其他几个答案,但我没有看到任何具有多头(E 和 E')问题的问题。
您的图片中遗漏的是 refs - 分支和标签(以及远程分支引用,可能还有一些其他内容)。
当你变基时,如果你有一个分支检出(或指定在变基开始时检出一个分支),默认行为是将检出的分支引用移动到重写的提交中。原始提交始终存在;但如果没有引用仍然指向它们,默认日志输出将不会显示它们。
但是,一个 ref 肯定仍然指向它们:您重写的分支的远程分支 ref。当您将更新推送到源时,这将得到纠正。这必须是 "forced" 推送 (git push -f
),但由于您是该存储库的唯一用户,所以这无关紧要。
如果其他分支仍然指向原始提交,您可以使用 git reset
将它们移动到新提交。
git checkout branch
git reset <new-commit-id>
如果分支指向可以从中访问原始提交的其他提交,那么这些提交也必须重写。这是一个更大的话题,所以请告诉我们它是否适用。
与标签类似,如果它们指向原始提交,您可以移动它们 (git tag -f ...
)。
正如您所提到的,您有 - 您的分叉分支 - 让我们将其称为 'Origin' 在 A-B-C- 状态(假设它推送到您的 Origin),
现在 Main Branch(称之为 'upstream')几乎没有变化 A-D-E,所以你要做的是,从上游拉取代码,如果你使用的是 Eclipse/or Local,你将拥有你的代码(A-B-C ++ D-E)如果您没有任何冲突,请将其推送到您的 Origin 分支,这样您的回购将处于同步状态,然后您还可以为 B-C 的更改发出拉取请求,
现在你的 Upstream 是 main 分支,你的 Origin 是 Forked 分支。
所以,我在 Github 上分叉了一个项目,并进行了 2 次提交。我也将这些提交推送到我的叉子上。
同时,上游项目也有2次commit。
假设分叉时,两个分支都在头A
A
然后我做了两个提交 B 和 C 并将它们推入我的叉子
A - B - C
并且上游提交了 D 和 E
A - D - E
在我的 fork 克隆回购中,我从上游获取,所以状态是
A - D - E
\
B - C
然后我做了一个变基,使状态变为
A - D - E
\
B - C - D' - E'
现在,我想把它放在我的叉子里,这样 D 和 E 就不存在了,头在 E'。我是唯一一个用我的叉子的人。
我在这里检查了其他几个答案,但我没有看到任何具有多头(E 和 E')问题的问题。
您的图片中遗漏的是 refs - 分支和标签(以及远程分支引用,可能还有一些其他内容)。
当你变基时,如果你有一个分支检出(或指定在变基开始时检出一个分支),默认行为是将检出的分支引用移动到重写的提交中。原始提交始终存在;但如果没有引用仍然指向它们,默认日志输出将不会显示它们。
但是,一个 ref 肯定仍然指向它们:您重写的分支的远程分支 ref。当您将更新推送到源时,这将得到纠正。这必须是 "forced" 推送 (git push -f
),但由于您是该存储库的唯一用户,所以这无关紧要。
如果其他分支仍然指向原始提交,您可以使用 git reset
将它们移动到新提交。
git checkout branch
git reset <new-commit-id>
如果分支指向可以从中访问原始提交的其他提交,那么这些提交也必须重写。这是一个更大的话题,所以请告诉我们它是否适用。
与标签类似,如果它们指向原始提交,您可以移动它们 (git tag -f ...
)。
正如您所提到的,您有 - 您的分叉分支 - 让我们将其称为 'Origin' 在 A-B-C- 状态(假设它推送到您的 Origin),
现在 Main Branch(称之为 'upstream')几乎没有变化 A-D-E,所以你要做的是,从上游拉取代码,如果你使用的是 Eclipse/or Local,你将拥有你的代码(A-B-C ++ D-E)如果您没有任何冲突,请将其推送到您的 Origin 分支,这样您的回购将处于同步状态,然后您还可以为 B-C 的更改发出拉取请求,
现在你的 Upstream 是 main 分支,你的 Origin 是 Forked 分支。