【问题标题】:git rebase upstream/master vs git pull --rebase upstream mastergit rebase upstream/master vs git pull --rebase upstream master
【发布时间】:2013-03-14 04:19:57
【问题描述】:

git rebase upstream/mastergit pull --rebase upstream master 之间有区别吗?如果有,是什么?远程可以是任何远程,不一定是上游。

【问题讨论】:

    标签: git git-rebase git-pull


    【解决方案1】:

    git pull --rebase 将首先fetch (git fetch),更新upstream/master 提交。

    如果你只是变基而不首先更新upstream/master,你将不会得到相同的结果。

    我在“master branch and 'origin/master' have diverged, how to 'undiverge' branches'?”中说明了它


    SnakE 提到 in the comments git pull --rebase 不是完全 git fetch && git rebase origin/master
    见“what does "git pull --rebase" do?

    (origin/master)
       |
    A--B--C (master)
     \ 
      B'--D (actual origin/master after changing B and force pushing)
    

    git pull --rebase 在这种情况下所做的是:

    git fetch origin
    git rebase --onto origin/master B master
    

    这里:

    • origin/master 是新更新的origin/master (B')
    • B 是旧的 origin/master(在 fetch 更新之前)
    • master 是在 origin/master 之上重放的分支

    这与git fetch + git rebase origin/master 的不同之处在于,pull --rebase 命令试图找出哪些提交是真正您的本地提交,以及哪些提交是在较早的提取中来自上游。

    为此,它会查看远程跟踪分支的 reflog(在本例中为origin/master)。此 reflog 表示在 origin 上的连续 git fetch 操作的提示,按“最近的优先”顺序。

    对于每个 reflog 条目(origin/master@{1},然后是 ...{2},等等),它会检查该提交是否是当前分支头 master 的祖先。一旦找到它,它就会选择它作为变基的起点(在上面的示例中为B)。

    【讨论】:

    • 所以git pull --rebase upstream master 类似于git fetch upstream && git rebase upstream/master?
    • 其实没有。想象一下,您提取了历史记录 A-B 并在其之上进行了更改,A-B-C。然后其他人将B 修改为B' 并重点推送他们的更改,以便原点现在是A-B'-D。现在,如果您执行git fetch && git rebase origin/master,rebase 将因冲突而失败。然而git pull --rebase 会解决它并以A-B'-D-C 结束。在pull --rebase 的地毯下肯定会发生一些神奇的事情。编辑:prooflink
    • @SnakE 好点,你。我在答案中包含了pull --rebase 算法以获得更多可见性。
    • 魔法可以直接在git merge-base --fork-point获得
    • @jthill 自从获得 1.9.0+,我想,因为我在那里记录了 fork-point:stackoverflow.com/a/20423029/6309
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2017-12-07
    • 2021-11-17
    • 1970-01-01
    • 2016-10-27
    • 2017-07-27
    相关资源
    最近更新 更多