たとえば、dev
ブランチとstable
ブランチがあります。
dev
からまでのいくつかのコミットをチェリーピックした場合stable
。
dev
チェリー ピックされたコミットを Git に認識させ、重複した範囲を後でマージ、リベース、またはチェリー ピックした場合に二重にマージしないようにする方法はありますstable
か? (これはSVNの基本的なマージ追跡機能です)
たとえば、dev
ブランチとstable
ブランチがあります。
dev
からまでのいくつかのコミットをチェリーピックした場合stable
。
dev
チェリー ピックされたコミットを Git に認識させ、重複した範囲を後でマージ、リベース、またはチェリー ピックした場合に二重にマージしないようにする方法はありますstable
か? (これはSVNの基本的なマージ追跡機能です)
また、コミット メッセージの末尾に元のコミットの SHA を追加する-x
ためのフラグも注目に値します。cherry-pick
ログを見たときにチェリーピックされたコミットを元のコミットと関連付けやすくするために、省略された SHA もコミットの概要の最後に追加するのが好きです。-s
サインオフ フラグを使用して、誰がチェリー ピックを行ったかを示すことも役立ちます。
例:
> git cherry-pick -sex 27d4985
#333: fixes all the things (27d4985)
- how it fixes all the things
(cherry picked from commit 27d49855238364d0184ad344884a366b5b16e)
Signed-off-by: Chuck Norris <chuck@example.com>
git cherry-pick
git rebase
ではなく面白いケースなgit merge
ので、チェリーピックしたコミットを実際に書き換えて、チェリーピックしたブランチのトップに同じ変更を適用します。git のコミット ID はコミットの内容に基づいているため、新しいコミットは異なる ID を持つため、git ではまったく異なるコミットと見なされます。
git merge
一方、マージコミットを作成します。これは、git がマージ追跡を実装する手段です。マージ コミットは、2 つ (またはそれ以上) の異なる履歴が収束した時点を示します。git merge [commit-id]
明示的にマージ コミットを作成する代わりに呼び出すことは許容されますgit cherry-pick [commit-id]
が、これにより、チェリー ピックされた単一のコミットの効果だけでなく、そのブランチの分岐履歴の変更のセット全体ももたらされます。
とはいえ、「二重マージ」は通常、git では問題になりません。すでに存在する変更セットを含む履歴とマージしようとすると、履歴が一緒に接着されたときにノーオペレーションになります。git は実際には各コミットのツリーの状態のみを気にし、ツリーをその状態にした変更については気にしません。
実際には、2 つのブランチ間でマージされていないすべてのコミットを出力するgit cherryという名前のコマンドがあります。
印刷されたコミットごとに、「+」記号はそれをマージできることを意味し、「-」記号はそのコミットをすでに選択していることを意味します。
出力はきれいではありません。
SVN から来てsvnmerge.pyに慣れている人のために、「svnmerge avail -l」と同等の git 用の bash スクリプトを作成しました。これを gitavail と呼びます。
#!/bin/bash
# get current branch
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
# get tracked branch (1st argument), if no arg or arguments are only options, assume master
if test -z $1 || grep -q '^-' <<< $1;
then TRACKED_BRANCH=master
else TRACKED_BRANCH=$1; shift
fi
# Log commits available for merge from tracked branch
LOG_OPTIONS=$*
for i in $(git cherry $CURRENT_BRANCH $TRACKED_BRANCH | egrep '^\+' | awk '{print $2}'); do git --no-pager log -n1 $i ${LOG_OPTIONS}; echo; done
ブランチにいて、マスター ブランチからマージできるものを一覧表示したい場合は、次のコマンドを実行します。
gitavail --name-status
そして、「svnmerge avail -l」と非常によく似た出力が得られます。
チェリーピックのコミットは手動で変更してはいけないと思います (競合についてはどうですか?)。パッチ IDが変更された場合、git cherry はコミットが既にチェリーピックされていることを認識しません。