最简单(对每个人来说最明显)的方法是首先更新您的master
分支,然后重新设置到更新的基础上master
,这与现在完全相同origin/master
:
$ git fetch origin # Get updates from remote.
$ git checkout master # Now bring master into sync:
$ git merge --ff-only origin/master # if this fails you have stuff
# in your master that they don't
# have in theirs, and you need
# to decide what to do about it
在这一点上,如果一切顺利,master
并且origin/master
都是相同的(如您可以通过图形查看器看到的gitk
,或使用git log --graph --oneline --decorate
),那么应该很清楚git rebase master
将如何工作。
但你实际上不必这样做。你可以只是git rebase origin/master
,而正在上develop
。(这将使您的master
未转发 - 大概在某些时候您会希望它转发 - 所以它并没有真正为您节省太多。但现在更容易做到。)
冗长乏味的“为什么”部分:git rebase
在其长篇中包含三点,文档将其描述为newbase
、upstream
和branch
:
git rebase ... [--onto <newbase>] [<upstream>] [<branch>]
如果您只指定一个参数,如 in git rebase master
,则命名 theupstream
和 bothnewbase
并branch
计算。是当前branch
分支(即,HEAD
不能分离)。如果省略--onto
,则将newbase
作为upstream
参数。因此,如果您现在在运行,develop
并且运行git rebase X
,则branch
isdevelop
和 bothnewbase
和upstream
are X
。
rebase 方法实际上是(有各种内部优化,对 reflog 的影响有点不同):
- 查看
branch
- 保存
ORIG_HEAD
对提交的引用 ( ) 指向branch
哪个
- 将它(a la
git reset --hard
)重置为newbase
- 对于
upstream..ORIG_HEAD
1中的每个提交(按最旧到最新的顺序),git cherry-pick
该提交将其添加到刚刚重置的分支。
因此,如文档中所述:
Assume the following history exists and the current branch is "topic":
A---B---C HEAD=topic
/
D---E---F---G master
当git rebase master
你得到:
A---B---C ORIG_HEAD
/
/ A'--B'--C' HEAD=topic
/ /
D---E---F---G master
(我在这里所做的只是以手册页中的示例并添加ORIG_HEAD
标签和HEAD=
,以表明原始提交“仍在其中”,这HEAD
是对 的引用topic
)。
那么,如果你有你的develop
并且master
他们有他们的master
其中有一些额外的变化,会发生什么?让我们画出:
A -- B -- C master
| \
| D origin/master
|
E -- F HEAD=develop
现在你git rebase origin/master
:
A -- B -- C master
| \
| D origin/master
| \
| E' -- F' HEAD=develop
|
E -- F ORIG_HEAD
在某些时候,您最终也将自己master
的指向提交D
(并且您放弃ORIG_HEAD
)给予:
A -- B -- C -- D master, origin/master
\
E' - F' HEAD=develop
这与一些标签移动的情况相同。
这就是分支标签的全部内容,它们只是标签。每个标签指向一个(单个)提交。提交本身指向以前的提交,这是构建提交树(或“提交 DAG”,实际上)的内容。
1语法隐藏了很多“深奥的魔法”。它的意思是“所有可以从标签到达但不能从标签到达的提交。这正是需要精心挑选的一组提交,因为那些是在“变基”操作之前打开和未打开的提交. 乍一看,它“看起来像”一个基于时间的序列,这通常在人们的脑海中起作用,但它基于提交图拓扑。有时这会让人们绊倒: repo 中的多个提交树),表示“每个版本都可以从.Git's X..Y
Y
X
branch
upstream
A..B
A
B
B