重新建立我們的本地和遠端
一個 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")
這意味著合併/差異工具將上游分支顯示為 local
(master
:你正在重新定位的分支),而工作分支為 remote
(topic
:分支正在重新分配)
+-----------------------------------------+
| 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