概述的 fetch-and-rebase 很好。对于第二个问题,我不太确定您在问什么,因此以下内容涵盖了所有基础。
(请注意,除非您将其配置为例如,否则git pull
主要git fetch
紧随其后。我将仅在下面使用,假设您已经完成了足够近的.)git merge
rebase
git merge
fetch
假设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 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'
上图中的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
总是首先弄清楚“我想最终得到什么提交图”。如果你能画出你想要的图表,那么无论你现在身在何处,都更容易弄清楚如何到达那里。