28

たとえば、devブランチとstableブランチがあります。

devからまでのいくつかのコミットをチェリーピックした場合stable

devチェリー ピックされたコミットを Git に認識させ、重複した範囲を後でマージ、リベース、またはチェリー ピックした場合に二重にマージしないようにする方法はありますstableか? (これはSVNの基本的なマージ追跡機能です)

4

3 に答える 3

15

また、コミット メッセージの末尾に元のコミットの 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>
于 2012-05-23T06:32:37.007 に答える
12

git cherry-pickgit rebaseではなく面白いケースなgit mergeので、チェリーピックしたコミットを実際に書き換えて、チェリーピックしたブランチのトップに同じ変更を適用します。git のコミット ID はコミットの内容に基づいているため、新しいコミットは異なる ID を持つため、git ではまったく異なるコミットと見なされます。

git merge一方、マージコミットを作成します。これは、git がマージ追跡を実装する手段です。マージ コミットは、2 つ (またはそれ以上) の異なる履歴が収束した時点を示します。git merge [commit-id]明示的にマージ コミットを作成する代わりに呼び出すことは許容されますgit cherry-pick [commit-id]が、これにより、チェリー ピックされた単一のコミットの効果だけでなく、そのブランチの分岐履歴の変更のセット全体ももたらされます。

とはいえ、「二重マージ」は通常、git では問題になりません。すでに存在する変更セットを含む履歴とマージしようとすると、履歴が一緒に接着されたときにノーオペレーションになります。git は実際には各コミットのツリーの状態のみを気にし、ツリーをその状態にした変更については気にしません。

于 2010-09-21T03:40:38.947 に答える
5

実際には、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 はコミットが既にチェリーピックされていることを認識しません。

于 2013-09-11T16:15:05.603 に答える