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