我仍然在对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....

或者,当我将我的私人分支机构与development合并时,这会引起问题吗?如果可以的话,如果我已经在我的私人分支中完成了,我需要合并origin/development和development吗?

最佳答案

如前所述的取回和回扣是很好的。对于第二个问题,我不太确定你在问什么,所以下面的内容涵盖了所有的基础。
(注意git pull主要是git fetch后跟git merge,除非您将其配置为执行rebase等操作。我只使用下面的git merge,前提是您最近做了一个fetch
假设在origin/develop上正在进行的活动,并且在提交d1的起始点是origin/development,那么您将得到:

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

现在你确实git fetch和“他们”已经添加了d2和d3。如果主人和原籍/主人没有搬家(如果他们搬家了也没关系),我就把他们排除在外,给当地的东西留下更多的空间:
        D2 - D3                   <- origin/develop
       /
D0 - D1                           <- develop
       \
        N0 - N1                   <- HEAD=new_feature

所以现在(对于HEAD=new_feature,所有指针都指向commitN1)您可以:
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

您可能希望通过上图中的commitN2'合并到origin/develop的端点。你现在当然可以这样做了:
git checkout develop           # get HEAD onto develop breanch
git merge origin/develop       # fast-forward local develop branch

这给了你这个(我会理顺D1D2之间的扭结):
                    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

是吗?如果您想要合并commitM,那么最后的git merge命令将需要一个--no-ff参数,您需要首先获取指向commitdevelop的本地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操作时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

总是先弄清楚“我想得到什么样的提交图”。如果你能画出你想要的图表,那么你就可以更容易地从你现在所在的地方找到方法。

关于git - 最少的命令来重新建立私有(private)分支,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18524512/

10-10 07:03