gpt4 book ai didi

git - 父分支 merge 到上游后,从子分支提交 pull 请求

转载 作者:行者123 更新时间:2023-12-02 09:07:32 26 4
gpt4 key购买 nike

我有一个本地git存储库,在Github中有一个远程上游。我在本地存储库中为正在使用的新功能创建了branchA,然后为该分支提交了请求请求。在等待此PR在上游合并时,我想使用基于branchA的更多功能。因此,我从branchA创建了一个新的branchA1,并对该分支进行了一些更改。

现在我的branchA的PR已被压缩并合并到Github中的远程上游,我想为我的branchA1提交PR。我所做的是,我首先从远程上游到本地master分支获取了更改。然后我尝试在branchA1中执行git rebase master,但是此命令似乎正在删除我在branchA1中所做的所有更改。

如果我想从branchA1提交PR,最好的做法是什么?

如果我在工作流程中做错了什么,那么在等待合并来自父分支的PR时,使用新功能的正确方法是什么?

最佳答案

TL; DR:您可能需要git rebase --onto(需要一些额外的参数)。

当您-或其他人时;我在这里使用“他们”,并假设有人—在您的原始请求请求中进行了“压缩并合并”,他们用一个新的提交替换了您的提交,他们认为这比您的原始提交更好。

但是,您仍然拥有原始提交。现在,使用git rebase只复制A1上的良好提交,而不是同时在A1A上且现在仅在A1上进行的替换为更好的提交,这是您的工作。

要将其以图片形式显示,例如:

...--o--o--A   <-- master, origin/master
\
B--C--D <-- branch-A
\
E--F--G <-- branch-A1

每个大写字母代表一个提交,即 A是您(和他们) master开头时提交的哈希ID, B是您对 branch-A进行的第一个提交,依此类推。

然后他们说:好的,我们喜欢您的 B-C-D提交。但是,我们将通过制作新的提交 H来“改善”它们,这是 B + C + D全部合并为一个大提交的结果,我们将其放在 master(您的 origin/master)的末尾。同时,他们可能也可能未在 master中添加更多提交,因此,我们来回合一轮 o来表示任何此类无趣的提交。一旦运行 git fetch origin,就会将他们的 新的提交(您已经有他们的旧提交)放入存储库中,从而更新 origin/master:
             o--H   <-- origin/master
/
...--o--o--A <-- master
\
B--C--D <-- branch-A
\
E--F--G <-- branch-A1

如果您使用 git checkout mastergit merge origin/master,则将自己的 master向前移动以匹配 origin/master:
...--o--o--A--o--H   <-- master, origin/master
\
B--C--D <-- branch-A
\
E--F--G <-- branch-A1

您的 branch-A仍然存在,除非您专门删除了它。但是,即使删除了它,仍然可以提交 B-C-D:
...--o--o--A--o--H   <-- master, origin/master
\
B--C--D--E--F--G <-- branch-A1

如果现在您现在使用 git checkout branch-A1git rebase master,无论您是否仍将名字 branch-A指向他们的提交 D,他们都放弃了它们,以支持 H,您的Git现在将尝试复制所有六个提交,即 B-C-D-E-F-G,在 H上方,以尝试产生这个:
                   B'-C'-D'-E'-F'-G'   <-- branch-A1 (rebased)
/
...--o--o--A--o--H <-- master, origin/master
\
B--C--D--E--F--G [abandoned]

但是在 B上面复制 H不会很顺利:它将与自身发生冲突,并且还需要删除 CD的效果。因此,这看起来就像您在尝试删除自己的代码,只是将 C复制到 C',然后再将 D复制到 D'时再次放回去。无论如何,所有这些都是无用的。

您现在要告诉Git的不是:将所有不在 branch-A1上的提交提交到 master上,以在 H的顶端跟随 master,而是:只复制 的我的一些提交不在 branch-A1上的 master,在 H的顶端跟随 master。在此特定示例中,您要复制的提交集为 E-F-G。您要结束于:
                   E'-F'-G'   <-- branch-A1 (rebased)
/
...--o--o--A--o--H <-- master, origin/master
\
B--C--D--E--F--G [abandoned]

告诉Git的方法是使用 git rebase --onto,它接受两个参数而不是一个参数。您想将* t基于 master,并希望排除 D和更早的内容( CBA,以及所有无聊的提交到 A的左侧)。因此,如果您仍然具有名称 branch-A来标识commit D,则可以使用:
git checkout branch-A1             # make sure you're on the right branch
git rebase --onto master branch-A # tell Git: copy only commits after branch-A

如果您没有名称 branch-A,则可以使用原始提交哈希ID代替名称 branch-A来作为限制器,或者可以运行 git rebase -i master并删除不需要的 pick命令;或者,您可以运行 git log --all --decorate --oneline --graph并计算提交次数(或任何需要的次数)以查找提交。

请注意,重新设置基准后,您将拥有一个新的 branch-A1(即使复制了三个提交以具有相同的效果,从历史上看,它也与先前的 branch-A1完全无关)。因此,您将需要强制将其推到用于处理请求请求的任何Web服务(显然是GitHub)。如果您担心其他人可能在GitHub服务器上向您的 --force-with-lease添加提交,则可以使用 branch-A1

关于git - 父分支 merge 到上游后,从子分支提交 pull 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56351648/

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