如何将当前分支的修改内容变基到正在被合并的修改之上?

202

好的。如果我在一个分支(比如说working),并且我想要合并另一个分支(比如说master)的更改,那么我可以在working分支上运行命令git-merge master,这样更改就会被合并而不需要重新设置历史记录。如果我运行git-rebase master,那么master中的更改将被重新设置为放在我的working分支顶部。但是如果我想要合并来自master的更改,同时将我的working分支中的更改重新设置为位于顶部呢?我该怎么办?能做到吗?

我可以在我的master分支上运行git-rebase working将我的更改放在master分支的顶部,但我想在working分支上完成这个操作,我不知道该怎么做。我能想到的最接近的方法是从master创建一个新分支,然后将working的更改重置为其顶部,但是这样我会得到一个新分支,而不是修改working分支。

4个回答

320

你对rebase的操作方向有误。 git rebase master所做的正是你所要求的——获取当前分支(自其与master分岔以来)上的更改,并在master之上重新播放它们,然后将当前分支的头设置为该新历史记录的头。 它不会将master上的更改重新播放到当前分支之上。


5
@Jonathan,这很棒。这是一个有点棘手的话题。顺便说一下,“git rebase working”会将“主分支”的更改(在“工作分支”分叉后的点之后)移动到“工作分支”的顶部 - 但对于“主分支”来说,这不是一个非常明智的做法 :) - hobbs

85

另一种看待它的方式是将 git rebase master 视为:

将当前分支 置于 master之上。

这里,'master' 是上游分支,这就解释了为什么在rebase期间,ourstheirs 被颠倒


这也解释了为什么LOCAL和REMOTE被颠倒了。谢谢。 - AVIDeveloper
@AVIDeveloper 在本地和远程上,你还可以阅读 https://dev59.com/K3A75IYBdhLWcg3w4tV7#3052118 - VonC
5
@@VonC: 谢谢。是的,在我自言自语了一个下午之后,“REMOTE 是我的分支...LOCAL 不是我的”这个概念终于搞懂了。老实说,我更喜欢看到分支名称(或缩写 SHA)而不是 REMOTE/LOCAL/ours/theirs/mine。对于 git difftool 中可怕的左/右问题,我的想法也是一样的。有点跑题,但对于 difftool,我坚持使用 git-meld,并享受像“working-dir”、“stash@{0}”等名称。 - AVIDeveloper
1
@VonC:你能解释一下为什么在执行 git checkout branch_to_update git rebase master 后,我在 git log 中得到的是本地分支上顶部的主分支提交,而不是相反的吗? - JavaSa
1
@JavaSa 这很奇怪,除非rebase没有正确完成?你可能需要问一个单独的问题,并提供更多详细信息。 - VonC
显示剩余2条评论

4

当你想要在现有变更的基础上使用master分支时,你可以:

  1. 拉取最新的master分支:git pull <remote_name> master
  2. 切换到你想要将变更合并到的分支:git checkout <branch_name>
  3. 执行变基操作:git rebase master

另一种从远程分支(例如origin/master)将变更变基到本地分支而不在本地更新远程分支的替代方法为:git rebase origin/master


0
如果一个维护者要求你在CLI上进行"rebase"和"re-push"你的PR,你可以按照以下步骤进行操作:
git switch blead # making sure I'm in "main"
git pull # update local with remote
git switch blead-3 # branch of this PR

git rebase blead # put this commit on top
git push --force # re-push after rebasing

在Windows上尝试时,GitHub要求通过Web浏览器进行授权。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接