2

我仍然在对 Git 充满信心,所以我仍然小心翼翼地处理它的一些元素。

我在工作时重新调整我的私人分支的命令列表(所以在我完成时它不会过时)是:

# Prepare the new private branch
git checkout develop
git pull origin develop
git checkout -b new-feature
# work, commit, work commit, time to rebase...
git checkout develop
git pull develop origin
git checkout new-feature
git rebase develop
# continue working...

我想知道的是,当我想重新设置基准时,是否可以节省一些步骤并执行以下操作:

# on the new-feature branch
git fetch
git rebase origin/develop
# continue working....

或者当我将我的私人分支与开发合并时,这会导致问题吗?如果没问题,如果我已经在我的私人分支中完成了,我是否需要将 origin/develop 与 develop 合并?

4

1 回答 1

4

概述的 fetch-and-rebase 很好。对于第二个问题,我不太确定您在问什么,因此以下内容涵盖了所有基础。

(请注意,除非您将其配置为例如,否则git pull主要git fetch紧随其后。我将仅在下面使用,假设您已经完成了足够近的.)git mergerebasegit mergefetch

假设origin/develop在 origin/develop 上的提交 D1 上正在进行活动并且起点为:

... - M6                          <- master, origin/master
        \
         D0 - D1                  <- develop, origin/develop
                \
                 N0 - N1          <- HEAD=new_feature

现在你做git fetch了,“他们”已经添加了 D2 和 D3。我将省略 master 和 origin/master ,假设他们没有移动(如果他们有它也没关系),为本地东西留出更多空间:

        D2 - D3                   <- origin/develop
       /
D0 - D1                           <- develop
       \
        N0 - N1                   <- HEAD=new_feature

所以现在(HEAD=new_feature所有都指向 commit N1)你做:

git rebase origin/develop

和 git 这样做,进行两个新的提交N0'N1'

                N0' - N1'         <- HEAD=new_feature
               /
        D2 - D3                   <- origin/develop
       /
D0 - D1                           <- develop
       \
        N0 - N1                   [abandoned]

被放弃的提交最终会消失(我将在下面将它们排除在外),同时您添加N2,他们添加D4. 所以,你git fetchgit rebase origin/develop,给出:

                N0' - N1' - N2    [abandoned]
               /
              |     N0''-N1''-N2' <- HEAD=new_feature
              |     /
        D2 - D3 - D4              <- origin/develop
       /
D0 - D1                           <- develop

和以前一样,“废弃”的东西可以被遗忘,这为您提供了从origin/develop.

在此过程中的任何时候,您都可以,但不必:

git checkout develop && git merge origin/develop && git checkout new_feature

由于您尚未在 上添加任何提交D1,因此这只是快进,因此develop指向与 . 相同的提交origin/develop

假设您还没有操作本地develop,但是是时候合并了new_feature,您现在有了这个:

                    N0''-N1''-N2' <- HEAD=new_feature
                    /
        D2 - D3 - D4              <- origin/develop
       /
D0 - D1                           <- develop

大概你会想通过N2'上图中的commit 与origin/develop. 你现在当然可以这样做:

git checkout develop           # get HEAD onto develop breanch
git merge origin/develop       # fast-forward local develop branch

这给了你这个(我会理顺D1和之间的扭结D2):

                    N0''-N1''-N2'     <- new_feature
                    /
...D1 - D2 - D3 - D4                  <- HEAD=develop, origin/develop

但更有趣的问题是,您是否希望最终结果是:

                    N0''-N1''-N2'     <- new_feature, HEAD=develop, origin/develop
                    /
...D1 - D2 - D3 - D4

还是应该看起来像这样:

                    N0''-N1''-N2'     <- new_feature
                    /            \
...D1 - D2 - D3 - D4 ------------ M   <- HEAD=develop, origin/develop

? 如果您想要合并提交M,您的最终git merge命令将需要一个--no-ff参数,并且您需要先获取本地develop指向以提交D4。在这种情况下,您必须进行快进合并以使develop标签指向D4

git checkout develop           # set HEAD=develop
git merge origin/develop       # fast-forward develop to origin/develop
git merge --no-ff new_feature  # create merge commit M on local develop
git push origin develop        # and push local develop to origin/develop

但是,如果您develop想要合并提交,那么当您执行 final 时指向的位置并不重要merge,因为它只是快进。所以,相反,你会这样做:

git checkout develop           # set HEAD=develop
# git merge origin/develop     # optional: not needed, but harmless
git merge new_feature          # fast-forward local develop to new_feature
git push origin develop        # and push local develop to origin/develop

总是首先弄清楚“我想最终得到什么提交图”。如果你能画出你想要的图表,那么无论你现在身在何处,都更容易弄清楚如何到达那里。

于 2013-08-30T04:52:27.047 回答