用于重组私有分支的命令数量最少

时间:2013-08-30 03:37:20

标签: git rebase

我仍然在对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合并?

1 个答案:

答案 0 :(得分:4)

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

(请注意,git pull主要只是git fetch后跟git merge,除非您将其配置为例如rebase。我将仅使用{{ 1}}下面,假设你已经做了一个足够新的git merge。)

这是你将得到的,假设fetch上的持续活动和起始/开发时提交D1的起点:

origin/develop

现在你... - M6 <- master, origin/master \ D0 - D1 <- develop, origin/develop \ N0 - N1 <- HEAD=new_feature 和“他们”添加了D2和D3。我会遗漏主人和出身/主人,假设他们没有搬家(如果他们无论如何也没关系),为当地人留下更多空间:

git fetch

现在(使用 D2 - D3 <- origin/develop / D0 - D1 <- develop \ N0 - N1 <- HEAD=new_feature ,所有指向提交HEAD=new_feature)你做了:

N1

并且git执行此操作,进行两次新提交git rebase origin/develop N0'

N1'

弃置的提交最终会消失(我会将它们留在下面),同时添加 N0' - N1' <- HEAD=new_feature / D2 - D3 <- origin/develop / D0 - D1 <- develop \ N0 - N1 [abandoned] ,然后添加N2。所以,您D4git fetch,给予:

git 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'合并。你当然可以这样做:

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指向的位置无关紧要,因为它只是快进去。所以,相反,你会这样做:

merge

首先要弄清楚“我想要最终得到什么提交图”。如果你可以绘制你想要的图形,那么就可以更容易地找出如何从现在的任何地方到达那里。