git rebase基础知识

Dav*_*dža 47 git git-rebase

git rebase最近开始使用,并不是100%肯定我做得对.为了这个问题,原点有两个分支,master并且next分支来自master.

自上次两者同步以来,master有2次提交和next6次:

$ git log --oneline origin/next..origin/master
59b5552 master commit #2
485a811 master commit #1

$ git log --oneline origin/master..origin/next
4ebf401 next commit #6
e9b6586 next commit #5
197ada0 next commit #4
4a2c3c6 next commit #3
040a055 next commit #2
84537bf next commit #1
Run Code Online (Sandbox Code Playgroud)

当我结账next并执行时git rebase -i origin/master,我得到以下内容:

$ git status
# On branch next
# Your branch and 'origin/next' have diverged,
# and have 8 and 6 different commits each, respectively.
Run Code Online (Sandbox Code Playgroud)

最后做后git pull --rebase,从两次提交masternext:

$ git log --oneline origin/next..next 
8741d09 master commit #2
485a811 master commit #1
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 这是正确的方法吗?
  2. 为什么在运行8 and 6之前会有不同的提交pull --rebase
  3. 是否有可能简化流程?

非常感谢 :)

Mik*_*itz 56

让我们从头开始.这是您原始状态的图表:

A-B-C  (master, origin/master)
 \
  D-E-F-G-H-I  (next, origin/next)

当你签出next和重建基础nextorigin/master,这两个上已有之后创建的6次新的提交origin/master.这些新的提交有"master commit#2"(C在我的图中)作为他们的祖先,而不是他们的原始祖先在哪里origin/masterorigin/next分歧(A在我的图中),所以他们的哈希将是不同的.我相信这就是为什么你会看到next有8个不同的提交origin/next:2个origin/master和6个"重新提交"的提交origin/next.

之后git checkout next ; git rebase -i origin/master,你应该有这个:

A-B-C  (master, origin/master)
 \   \
  \   D'-E'-F'-G'-H'-I' (next)
   \
    D-E-F-G-H-I  (origin/next)

您可以看到next有8个未提交的提交origin/next,并且origin/next确实有6个未启用的提交next.当然这只是根据提交的SHA-1哈希值.如果你git diff origin/next next- diff应该只显示来自B和的变化C(如图中标记的那样),实际内容应该非常接近.

当你git pull --rebase继续打开时next,它从源(远程origin/next)获取更改并将当前分支(next)重新绑定到该远程.这导致了在变化next,但不是origin/next后出现origin/next的新的next分支.它应该如下所示:

A-B-C  (master, origin/master)
 \
  D-E-F-G-H-I  (origin/next)
             \
              B'-C' (next)

如果这是您想要的历史图表,那么您已经成功了.

但是,我怀疑你真的希望看起来像中间图,特别是如果你next是一个功能分支,你正在处理项目的下一个部分,并且master是为了稳定代码和小错误修复.如果是这样,那么你应该做的git push不是git pull --rebase让遥控器反映你的历史版本而不是反过来.