我仍然在对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合并?
答案 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
。所以,您D4
和git 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
首先要弄清楚“我想要最终得到什么提交图”。如果你可以绘制你想要的图形,那么就可以更容易地找出如何从现在的任何地方到达那里。