重新建立我们的本地和远程

一个 rebase 切换我们的他们的的含义:

git checkout topic
git rebase   master    # rebase topic branch on top of master branch

无论 HEAD 指出的是我们的****

rebase 的第一件事就是将 HEAD 重置为 master; 在樱桃采摘之前从旧分支 topic 提交到新分支(前 topic 分支中的每个提交都将被重写并将由不同的哈希标识)。

关于合并工具使用的术语(不要与本地参考或远程参考混淆 )

=> local is master ("ours"),
=> remote is topic ("theirs")

这意味着合并/差异工具将上游分支显示为 localmaster:你正在重新定位的分支),而工作分支为 remotetopic:分支正在重新分配)

+-----------------------------------------+
| LOCAL:master |    BASE   | REMOTE:topic |
+-----------------------------------------+
|             MERGED                      |
+-----------------------------------------+

倒置说明

合并时:

c--c--x--x--x(*) <- current branch topic ('*'=HEAD)
    \
     \
      \--y--y--y <- other branch to merge

我们不会更改当前的分支 topic,所以我们所拥有的仍然是我们正在处理的(并且我们从另一个分支合并)

c--c--x--x--x---------o(*)  MERGE, still on branch topic
    \       ^        /
     \     ours     /
      \            /
       --y--y--y--/  
               ^
              theirs

在一个变种:

但是在一个 rebase 上我们会改变方向,因为 rebase 做的第一件事就是检查上游分支以重放当前的提交!

c--c--x--x--x(*) <- current branch topic ('*'=HEAD)
    \
     \
      \--y--y--y <- upstream branch

一个 git rebase upstream 将首先设置 HEAD 至上游分支,因此,我们的他们的的开关相比,以前的当前工作分支。

c--c--x--x--x <- former "current" branch, new "theirs"
    \
     \
      \--y--y--y(*) <- set HEAD to this commit, to replay x's on it
               ^       this will be the new "ours"
               |
            upstream      

然后,rebase 将重播我们的topic 分支上的他们的提交:

c--c..x..x..x <- old "theirs" commits, now "ghosts", available through "reflogs"
    \
     \
      \--y--y--y--x'--x'--x'(*) <- topic  once all x's are replayed,
               ^                      point branch topic to this commit
               |
        upstream branch