私は現在自分のmaster
ブランチにいますが、私のステージは汚れています。私はコミットしたくありませんし、すでに変更を隠しておくにはあまりにも多くの隠し場所があります (または私はあまりにも怠け者ですか?)。
いくつかのブランチに切り替えずに早送りしたいと思います(ステージが汚れていることを思い出してください)。
どうすれば早送りできoptim
ますmobile
か? または(現在のブランチ)にoptim
?master
私は現在自分のmaster
ブランチにいますが、私のステージは汚れています。私はコミットしたくありませんし、すでに変更を隠しておくにはあまりにも多くの隠し場所があります (または私はあまりにも怠け者ですか?)。
いくつかのブランチに切り替えずに早送りしたいと思います(ステージが汚れていることを思い出してください)。
どうすれば早送りできoptim
ますmobile
か? または(現在のブランチ)にoptim
?master
注: ブランチ名は、(単一の) コミットへの単なるポインターです。私たちが「ブランチ」と考えがちなもの、つまりコミットのチェーン全体は、各コミットからその親にさかのぼって作業することによって見つけられます。親は、ブランチ名ではなく、コミット自体にのみ記録されます。ブランチ名は、特定のコミットに貼り付けられる付箋のようなものと考えるとよいでしょう。文字では描けないので下に矢印(<--
)で描いています。
画像をテキストに変換し、回転させ、仮定を1つまたは2つ作成し、この回答にうまく収まるように少し切り詰めると、次のようになります。
o...
/
--o--M--o--o--o--o--o--o--o--o--o--o--o <-- mobile
/
---o <-- optim, origin/optim
(ここでは、「新しい」ものは上ではなく右にあり、さまざまなコミット メッセージのテキストは省略されています。)
「早送り」は次の場合に発生します。1
HEAD
ブランチ名へのシンボリック参照ですHEAD
コミットは「マージされる」コミットの祖先です。)optim
単一の子孫が merge commit であるコミットを指し、そのM
コミットにはそれぞれ少しずつ右側に 1 つの子孫があるため、git はそのコミットのチェーンに沿ってo
ブランチ名を前方にスライドできます。optim
したがって:
$ git checkout optim; git merge mobile
ラベルを M まで上下にスライドさせ、次にさらに右の wheremobile
ポイントにスライドさせます。次のようになります。
o...
/
--o--M--o--o--o--o--o--o--o--o--o--o--o <-- mobile, optim
/
---o <-- origin/optim
それを「手動で」行いたい場合は、他に何もせず、そのブランチに「参加」することさえせずに、git に「名前optim
と同じコミットをターゲットにするようにブランチ名を再指定してくださいmobile
:
$ git branch -f optim mobile
( -f
or --force
) フラグは、エラーを出すのではなく、既存のラベルのターゲット コミットを変更するように指示します。
このコマンドは、操作が早送りであることをチェックしません。(もちろん、plaingit merge
はそれをチェックして、早送りマージを行うか、それとも「実際の」マージを行うかを決定します。ただし、操作が早送りでない場合は、実行するように要求できます。git merge
つまり--ff-only
、操作が早送りでない場合はエラーになります。)
1フェッチとプッシュも同じ種類の「早送り」の概念を適用するため、これは「いつ」であり、「いつのみ」ではありません。
git push . mobile:optim
に早送りするには (はい、ドットです) をoptim
使用しますmobile
。