重新建立我们的本地和远程
一个 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