我仍然在对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 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
您可能希望通过上图中的commit
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
是吗?如果您想要合并commit
M
,那么最后的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/