我有一个本地 git 存储库,它在 Github 中有一个远程上游。我在我的本地存储库中为我正在处理的新功能创建了一个 branchA,然后为该分支提交了一个 Pull Request。在等待这个 PR 在上游合并时,我想研究更多基于 branchA 的功能。因此,我从 branchA 创建了一个新的 branchA1 并在该分支中进行了一些更改。
现在我对 branchA 的 PR 是壁球并合并到 Github 中的远程上游,我想为我的 branchA1 提交 PR。我所做的是首先将更改从远程上游获取到本地主分支。然后我尝试git rebase master在 branchA1 中执行但此命令似乎删除了我在 branchA1 中所做的所有更改。
如果我想从 branchA1 提交 PR,现在最好做什么?
如果我在我的工作流程中做错了什么,在等待来自父分支的 PR 合并时处理新功能的正确方法是什么?
TL;DR:你可能想要git rebase --onto(这需要一些额外的参数)。
当您——或其他人;我将在这里使用“他们”并假设有人对您的原始拉取请求进行了“挤压和合并”,他们用一个他们认为比原始提交更好的新提交替换了您的提交。
但是,您仍然拥有原始提交。这是现在你的工作使用git rebase复制只有好的提交您A1没有任何的,替换与-更好地提交了这两个A1和A,现在只A1。
把它用图片的形式,你有,例如:
...--o--o--A <-- master, origin/master
\
B--C--D <-- branch-A
\
E--F--G <-- branch-A1
Run Code Online (Sandbox Code Playgroud)
其中每个大写字母代表在提交,即A是对哈希ID提交这是你(和他们)的提示master你开始的时候,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
Run Code Online (Sandbox Code Playgroud)
如果您git checkout master和git merge origin/master,您将自己master向前移动以匹配您的origin/master:
...--o--o--A--o--H <-- master, origin/master
\
B--C--D <-- branch-A
\
E--F--G <-- branch-A1
Run Code Online (Sandbox Code Playgroud)
你的branch-A仍然存在,除非你特意删除了它。但即使你删除了它,你仍然有你的B-C-D提交:
...--o--o--A--o--H <-- master, origin/master
\
B--C--D--E--F--G <-- branch-A1
Run Code Online (Sandbox Code Playgroud)
如果你现在git checkout branch-A1和——git rebase master无论你的名字是否仍然branch-A指向你的提交D,他们放弃了他们的支持——H你的 Git 现在将尝试复制所有六个提交,B-C-D-E-F-G, atop 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]
Run Code Online (Sandbox Code Playgroud)
但是B在上面复制H不会顺利:它会与自身发生冲突,而且它需要C和D 删除的效果。因此,这看起来就像你正在试图删除自己的代码,只把它放回去时,会再次复制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]
Run Code Online (Sandbox Code Playgroud)
告诉 Git的方法是使用git rebase --onto,它需要两个参数而不是一个。你想变基*上master,并且要排除提交D和任何早期(C,B,A,和所有的无聊提交到左A)。所以,如果你也仍然有名称branch-A标识提交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
Run Code Online (Sandbox Code Playgroud)
如果您没有name branch-A,您可以使用原始提交哈希 ID 作为限制器而不是 name branch-A,或者您可以运行git rebase -i master和删除不需要的pick命令;或者你可以运行git log --all --decorate --oneline --graph并计算提交,或者你需要的任何东西,以找到提交。
请注意,在 rebase 之后,您有一个新的 branch-A1(与您之前的历史完全无关branch-A1,即使复制了三个提交以具有相同的效果)。因此,您需要将其强制推送到您用于处理拉取请求的任何 Web 服务(显然是 GitHub)。--force-with-lease如果您担心其他人可能会branch-A1在 GitHub 服务器上向您添加提交,则可以使用。
| 归档时间: |
|
| 查看次数: |
1208 次 |
| 最近记录: |