重新建立我們的本地和遠端

一個 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