【问题标题】:What happens when I 'git pull --rebase origin development' from within a feature branch?当我从功能分支中“git pull --rebase origin development”时会发生什么?
【发布时间】:2014-04-15 16:05:42
【问题描述】:

假设我有一个名为FeatureA 的功能分支,它与它所基于的(远程)development 不同步。通常我会通过调用git rebase development 来重新定位我的分支(在将我的本地开发与origin/development 自然同步之后)。

今天,我做了不同的事情,而是从我的功能分支调用 git pull --rebase origin development。现在,有什么区别?

【问题讨论】:

    标签: git rebase feature-branch


    【解决方案1】:

    git pull --rebase origin development 是这些命令的快捷方式:

    git fetch origin development
    git rebase origin/development
    

    也就是说,获取origin/development,然后在其之上重新设置当前分支。

    更新

    正如@torek 指出的那样:

    是的,除了 fetch 的两个参数版本不更新 git 1.8.3 或更早版本中的 origin/development。 (rebase 的结果是一样的,但是 origin/development 不动。)

    【讨论】:

    • 是的,除了 fetch 的两个参数版本不会在 git 1.8.3 或更早版本中更新 origin/development。 (变基结果是一样的,但是origin/development不动。)
    • 实际上,正如我在下面的长答案中指出的那样,它仍然重新定位到正确的点,它只是通过存储在 FETCH_HEAD 参考中的 SHA-1 ID 来实现。这并不容易解释,但无论如何它“做了正确的事”!
    • @torek 哦,我明白了,我只是逐字引用你的话,这是最准确的,没有意义的释义。
    【解决方案2】:

    短版:如果变基顺利,它工作正常。如果没有,它仍然可以正常工作,只是在图形查看器中可能会有点混乱。


    与往常一样,git pull 基本上是 git fetch 后跟 ... 好吧,在这种情况下,git rebase 而不是 git merge。所以:

    • origin获取
    • 仅获取development 分支并将其放入FETCH_HEAD
    • 然后,使用带有该 ID 的 git rebase 代替 git merge <commit-ID-from-FETCH_HEAD>

    假设您的本地树中的提交图如下所示(我们假设您在某个时刻运行了 git fetch,并使用他们的提交 EF 更新了 origin/development):

            C - D   <-- FeatureA
          /
    A - B           <-- development
          \
            E - F   <-- origin/development
    

    并且,让我们进一步假设在origin 上,现在他们的分支上还有一个名为development 的提交。 fetch-from-origin 步骤将拾取它并使FETCH_HEAD 指向它,所以让我们将其绘制为节点G

            C - D       <-- FeatureA
          /
    A - B               <-- development
          \
            E - F       <-- origin/development
                  \
                    G   <-- FETCH_HEAD
    

    (如果你的git足够新,1.8.4或更高版本,origin/development此时也会更新,指向节点G。如果没有,你的本地副本development,存储在你的 origin/development 落后了。这对于 rebase 并不重要,它只会改变你在 git log --graph 视图或图形提交树查看器中查看结果的方式。)

    现在rebase 将以通常的方法复制您的FeatureA 提交以进行变基,并使FeatureA 指向副本,放弃原始提交。我们将调用重新定位的C'D'

            C - D       [abandoned]
          /
    A - B               <-- development
          \
            E - F       <-- origin/development
                  \
                    G   <-- FETCH_HEAD
                      \
                        C' - D'   <-- FeatureA
    

    如果您此时运行普通的 git fetch,或者如果您有足够新的 git 以使 origin/development 已移动;如果我们去掉“废弃”的部分并简化绘图,它就变成了:

    A - B               <-- development
          \
            E - F - G   <-- origin/development
                      \
                        C' - D'   <-- FeatureA
    

    如果您快进合并本地分支标签development 以匹配origin/development,则绘制更简单(将扭结从B 放到E 并将developmentorigin/development 放到指向G的箭头右侧)。

    【讨论】:

    • 谢谢!这确实很好解释!
    猜你喜欢
    • 2012-02-03
    • 2023-03-20
    • 2017-12-07
    • 2013-12-04
    • 2021-02-05
    • 1970-01-01
    • 2019-05-26
    • 2022-01-15
    • 2022-12-03
    相关资源
    最近更新 更多