最も簡単な (誰にとっても最も明白な) 方法は、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
unforward-ed のままになります — おそらくある時点で forward-ed したくなるでしょう — そのため、あまり節約にはなりませんが、今ではより簡単に実行できます。)
長く退屈な「なぜ」の部分:git rebase
長い形式では、ドキュメントではnewbase
、upstream
、 と説明されている 3 つのポイントが必要branch
です。
git rebase ... [--onto <newbase>] [<upstream>] [<branch>]
のように引数を 1 つだけ指定すると、と の両方にgit rebase master
名前が付けられ、が計算されます。は現在のブランチです (つまり、切り離してはなりません)。を省略した場合、が引数となります。したがって、今実行していて を実行すると、isと bothとare になります。upstream
newbase
branch
branch
HEAD
--onto
newbase
upstream
develop
git rebase X
branch
develop
newbase
upstream
X
実際には、リベース メソッドは次のとおりです (さまざまな内部最適化があり、reflog への影響は少し異なります)。
- チェックアウト
branch
- ポイント
ORIG_HEAD
へのコミットへの参照( )を保存しますbranch
- それを(a la
git reset --hard
)にリセットしますnewbase
upstream..ORIG_HEAD
1のすべてのコミットに対して(最も古いものから新しいものへ)、git cherry-pick
そのコミットはそれを just-reset ブランチに追加します。
したがって、ドキュメントのように:
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
(ここで行ったのは、man ページの例を取り上げ、元のコミットが「まだそこにある」ことを示すために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
これは、一部のラベルが移動した場合と同じです。
ブランチ ラベルはこれですべてです。これらは単なるラベルです。各ラベルは 1 つの (単一の) コミットを指します。コミット自体は、以前のコミットを指し示します。これは、コミット ツリー (実際には「コミット DAG」) を構築するものです。
1 つの構文には、多くの「深い魔法」が隠されています。これは、「 labelから到達できないすべてのコミットが label から到達可能であることを意味します。これらは、「リベース」操作の前にon であり、 on ではなかったコミットであるため、まさにチェリーピックする必要があるコミットのセットです。一見時間ベースのシーケンスのように見えますが、これは一般的に人々の頭の中で機能しますが、コミット グラフ トポロジに基づいています。リポジトリ内の複数のコミット ツリー) は、「から到達可能なすべてのリビジョン.Git's X..Y
Y
X
branch
upstream
A..B
A
B
B