機能ブランチを別の機能ブランチにリベースしたところ(すべてをマスターのヘッドにリベースする準備として)、かなりの数のトリッキーなマージ解決が含まれていました。
リベースはコミットとしてどこかに自動的に保存されますか?
それらの変更はどこにありますか?gitk、またはで何も表示されませんgit log --oneline
。
(リベース後にブランチをマージして戻す場合も同じ質問です。)
Rebaseは、コミットを別のブランチの上に移動しています。移動されたコミットによってマージの競合が発生した場合、このコミットはマージの解決を反映するように変更されます。
リベースの目的は、コミットをリベース先のブランチへの変更であるかのように見せることです。したがって、最も論理的な方法は、これらのコミットにマージの競合を組み込むことです。したがって、追加のコミットは必要ありません。
マージは、分岐したブランチをマージする明示的なアクションであるため、異なります。各ブランチのコミットは変更されません。競合の解決は、マージコミットに反映されます。
はい、リベースとマージが成功するとコミットされます。解決が必要な競合があることをコミットすることはありませんが、リベース(またはマージ)の出力は、これが発生したことと、それを解決する方法を示します。
リベースの場合は、インデックス内の競合を解決してから、を解決する必要がありますgit rebase --continue
。
マージの場合、コミット(git commit
)を行う必要がありますが、それがマージであるという事実が記憶され、編集するための適切なデフォルトのコミットメッセージが提供されます。
昔(2006年、1.5.3以前とそのユーザーマニュアル)は、次のようgit rebase
に提示されていました:
チェリーピッキングの特殊なケースは、ブランチ全体を新しい「ベース」コミットに移動する場合です。
これはによって行われgit-rebase
ます。
移動するブランチ(デフォルトHEAD
)と移動先(デフォルトなし)を指定し、次のようにします。
git cherry-picks
そのブランチからのすべてのパッチ、- ターゲットの上にそれを適用し、
refs/heads/<branch>
ポインタを新しく作成されたコミットに移動します。
したがって、定義上、コミットが行われます(コミットを行う必要はありません)
リベースの特殊なケースは、作業を分割し、コミットを移動(および再作成)する場合です。
同じチュートリアルから(リベース後にそれ以上コミットする必要がないことの例として):
現在のHEAD、「dev」と呼ばれるブランチで2つの機能の開発を混同したとします。
x-x-x-x (master)
\
-f1a-f1b-f1c-f2a-f2b-f2c (dev, HEAD)
それらを「dev1」と「dev2」に分割します。
HEAD
それがマスターからの分岐であると仮定すると、どちらかを調べることができます
git log master..HEAD
または、コミットの生のリストを取得します
git rev-list master..HEAD
いずれにせよ、必要なコミットのリストを見つけて、
dev1
そのブランチを作成するとします。
git checkout -b dev1 master
for i in `cat commit_list`; do
git-cherry-pick $i
done
-f1a'-f1b'-f1c' (dev1, HEAD)
/
x-x-x-x (master)
\
-f1a-f1b-f1c-f2a-f2b-f2c (dev)
編集したリストの残りの半分を使用して
dev2
ブランチを生成できますが、何かを忘れたかどうかわからない場合、または単にその手動作業を実行したくない場合は、git-rebaseを使用して実行できますあなたのために。
git checkout -b dev2 dev # Create dev2 branch
git-rebase --onto master dev1 # Subreact dev1 and rebase
dev
これにより、含まれているパッチと含まれていないパッチがすべて検索されdev1
、マスターの上に適用され、結果が呼び出されますdev2
。
-f1a'-f1b'-f1c' (dev1, HEAD)
/
x-x-x-x (master)
\
-f2a-f2b-f2c (dev2, HEAD)