77

マージを行うたびに、マージコミットを生成する必要があり、すべてのコミットの要約以上のものが必要です。

私の質問は、git-fmt-merge-msgをフォーマットする方法、またはこの自動メッセージを決定するものです(コミット後に、メッセージを修正してgit-log --pretty = format:'...'を使用することにより、手動でこれを行うことができます)

たとえば、次のようにフォーマットしたいと思います。

 Merge branch 'test'  
    * test:  
      [BZ: #123] fifth commit subject  
      [BZ: #123] fourth commit subject  
      [BZ: #123] third commit subject  
      [BZ: #123] second commit subject  
      [BZ: #123] first commit subject  

 __________________________________________
 Merge details:  
     [BZ: #123] fifth commit subject  
               at 2010-06-30 11:29:00 +0100  
       - fifth commit body  

     [BZ: #123] fourth commit subject  
               at 2010-06-30 11:22:17 +0100  
       - fourth commit body  

     [BZ: #123] third commit subject  
               at 2010-06-30 11:21:43 +0100  
       - third commit body  

     [BZ: #123] second commit subject  
               at 2010-06-30 11:21:30 +0100  
       - second commit body  

     [BZ: #123] first commit subject  
               at 2010-06-30 11:29:57 +0100  
       - first commit body
4

10 に答える 10

56

これは元の質問に答えていないことは承知していますが、現在このページにアクセスするgit noobsの利益のために、これは現在「git change merge commit message」の最初のGoogle検索結果であるため、可能であると述べます。に:

git commit --amend -m"New commit message"

マージコミットの親へのリンクを失うことなく、マージコミットのコミットメッセージを変更します。

于 2012-04-17T13:54:51.213 に答える
22

バージョンGit1.7.8git merge --edit ...の時点で 、コミットメッセージを指定するために実行 できるように見えます。

また、1.7.10以降、編集モードへのドロップがデフォルトの動作になります

このリリース以降、インタラクティブセッションの「gitmerge」コマンドは、「git commit」コマンドが指定されていない場合と同様に、ユーザーが結果のコミットを説明するためにマージを自動的に解決するときにエディターを起動します。コミットメッセージ。

(Windowsのmsysgitでは表示されませんが)

于 2012-11-13T00:38:46.993 に答える
18

この問題を解決するには2つの方法があることがわかりました

:コミットがマージに失敗した場合、ログが再び下部に追加されるため、両方を同時に使用しないでください。

個人的なメモ:最初のソリューションは、外部スクリプトではなく、gitのフックと構成プロパティに完全に依存しているため、使用しています。
実際のソリューションでは、「fmt-merge-msg」という名前のgitコマンドを拡張して、-logオプションを渡すときに1行の説明を生成する必要があります(このソリューションが本当に必要な場合は、独自のパッチを作成する必要があります( git)そしてソースからコンパイルします)。

1. VonCが提案
したようにprepare-commit-messageを使用すると 、このソリューションには、コミットを中断してから手動でコミットする必要があるという問題があります。

目的のコミットメッセージを作成するエイリアスを設定します。

[alias]  
lm = log --pretty=format:'%s%n   by %C(yellow)%an%Creset (%ad)%n %n%b' --date=local

$ GIT_DIR / hooks /に実行可能prepare-commit-msgを作成して、prepare-commit-msgフックを作成します(以下のスクリプト例)

#!/bin/sh
#...

case "$2,$3" in  
  merge,)  
  echo "Merge details:" >> $1  
  echo "" >> $1  
  git lm ORIG_HEAD..MERGE_HEAD >> "$1" ;;  
*) ;;  
esac  

次のようなエイリアスコミットメッセージを定義する必要があります

[alias]  
m = merge --no-ff --no-commit

2.マージを自動的に生成するカスタムコマンドを
使用します(1で作成したlmエイリアスを使用)。

#!/bin/sh

echo ""
echo "merge with commit details -- HEAD..$1"
git merge --no-ff --no-log -m "`git lm HEAD..$1`" --no-commit $1

次に、かなり厳密なコマンドを実行します。

./cmd-name <branch to merge>

それでもコミットの1行の説明が必要な場合は、新しいコマンドなどを-m引数に追加する必要があります(--logを使用すると、下部に生成されます)

于 2010-07-16T11:30:55.670 に答える
14

こんなことをしたかった。仕事に取り掛かる合理的な方法が見つかりませんでしgit fmt-merge-msgた。私が望んでいたようには機能しないと思います(メッセージに使用する完全にカスタムのテキストを渡す)。-no-commitそこで、代わりにandcommit -Fコマンドを使用して別の方法を考え出しました。出力はもちろんカスタマイズ可能ですが、出力を希望したと言ったことをほぼ正確に反映しています。

サンプルのコミットメッセージ出力:

Merge branch fix4 into master

::SUMMARY::
Branch fix4 commits:
Add fix4b-4
Add fix4b-3
Add fix4b-2
Add fix4b-1

Branch master commits:
fix4b-5 on master

* * * * * * * * * * * * * * * * * * * * * * * * *
::DETAILS::
commit < 98ffa579e14610b3566e1a3f86556a04dc95a82b
Author: -----
Date:   Fri Aug 17 17:23:26 2018 -0400

    fix4b-5 on master

commit > 7e386dddee16a7c2588954d25dd6793cdaa1b562
Author: -----
Date:   Fri Aug 17 15:18:17 2018 -0400

    Add fix4b-4

    use log output as commit message

    commit 2e630b1998312ec1093d73f9fe77b942407f45e8
    Author: -----
    Date:   Fri Aug 17 15:15:28 2018 -0400

        Add fix4b-3

commit > 2e630b1998312ec1093d73f9fe77b942407f45e8
Author: -----
Date:   Fri Aug 17 15:15:28 2018 -0400

    Add fix4b-3

commit > c9bb199be49c17ca739d019d749263314f05fc46
Author: -----
Date:   Fri Aug 17 15:15:27 2018 -0400

    Add fix4b-2

commit > 5b622a935c9d078c7d0ef9e195bccf1f98cce5e4
Author: -----
Date:   Fri Aug 17 15:15:27 2018 -0400

    Add fix4b-1

そして、使用法は次のようになります。

$ git mergelogmsg branch-name

ここにエイリアスをコピーします:

[alias]
    mergelogmsg = "!f() { var=$(git symbolic-ref --short HEAD) && printf 'Merge branch %s into %s\n\n::SUMMARY::\nBranch %s commits:\n' $1 $var $1 > temp_merge_msg && git log --format=format:'%s' $var..$1 >> temp_merge_msg && printf '\n\nBranch %s commits:\n' $var >> temp_merge_msg && git log --format=format:'%s' $1..$var >> temp_merge_msg && printf '\n\n* * * * * * * * * * * * * * * * * * * * * * * * *\n::DETAILS::\n' >> temp_merge_msg && git log --left-right $var...$1 >> temp_merge_msg && git merge --no-ff --no-commit $1 && git commit -eF temp_merge_msg; rm -f temp_merge_msg;}; f" 

コピーして貼り付けてカスタマイズする場合は、上記を使用してください。以下のバージョンには、不要な改行がありますが、私が行っていることを説明するために使用します。

[alias]
1   mergelogmsg = "!f() { var=$(git symbolic-ref --short HEAD) && 
2        printf 'Merge branch %s into %s\n\n::SUMMARY::\nBranch %s commits:\n' $1 $var $1 > temp_merge_msg && 
3        git log --format=format:'%s' $var..$1 >> temp_merge_msg && 
4        printf '\n\nBranch %s commits:\n' $var >> temp_merge_msg && 
5        git log --format=format:'%s' $1..$var >> temp_merge_msg && 
6        printf '\n\n* * * * * * * * * * * * * * * * * * * * * * * * *\n::DETAILS::\n' >> temp_merge_msg && 
7        git log --left-right $var...$1 >> temp_merge_msg && 
8        git merge --no-ff --no-commit $1 && 
9        git commit -eF temp_merge_msg; rm -f temp_merge_msg;}; f"

大丈夫...

1行目はカスタム関数をbashシェルスクリプトとして開始するため、gitはそれがgitコマンドではないことを認識します。現在のブランチ(別のブランチをマスターにマージする場合はマスター)を変数に設定して、後で使用できるようにします。
2行目は、現在のブランチと元のコマンドに付けたブランチ名を使用して最初の行を印刷します(通常のマージコマンドの場合と同じように)。これを一時ファイルに書き込みます。
3行目は、現在のブランチにない着信ブランチのコミットのログを取得し、それらのコミットのサブジェクトのみを一時ファイルに書き込みます。
4行目は、次の行をtempに出力します。
5行目着信ブランチにない現在のブランチのコミットのログを取得し、それらのコミットのサブジェクトのみを一時ファイルに書き込みます。
6行目では、要約部分と詳細部分の間に小さな水平方向の区切り文字が印刷されています。
7行目は、現在のブランチと着信ブランチのすべてのコミットのログを、それらが互いに分岐した直後、または最後に祖先を共有した直後の時点までさかのぼって取得します。左右には、コミットがどのブランチからのものかを示す矢印が表示されます。<は現在のブランチを意味し、>は着信ブランチを意味します。
8行は、早送りなし(コミットを取得するため)およびコミットなし(したがって、自分で作成する必要がある...ああ、しかし、作成しない)で、着信ブランチとのマージコマンドを実行します。
-eおよびパラメータを指定してcommitコマンドを実行し、-F編集を可能にし、指定されたファイルのテキストをメッセージに入力するようにcommitに指示します。必要に応じてコミットメッセージを終了すると、マージがコミットされ、一時ファイルが削除されます。

多田!その長いコマンドの最後にある2つ;は、printf関数がコンソールに書き出さず、ファイルにのみ書き出すようにします。

于 2018-08-20T19:45:44.043 に答える
10

をにマージする<branch A>と、gitは「ブランチをに<branch B>マージします」というメッセージを自動的にコミットします。<branch A><branch B>

gitのマージコミットメッセージをカスタマイズしたい場合は、次のことを試すことができます。

$ git commit --amend -m "Your merge message"

このコマンドは、gitのマージコミットメッセージをコミットメッセージに更新します。

あなたも試すことができます:

$ git merge <branch A> --no-commit

とをマージ<branch B>し、コミットメッセージとコミットメッセージ<branch A>のリスト を表示します<Branch B>'s

早送りに失敗した場合は、次のようになります。

Automatic merge went well; stopped before committing as requested

# check this with git status 
$ git status

コミットはすでにステージに追加されていますが、まだコミットされていないため、実行せずにコミットできますgit add

$ git commit -m "your merge commit message"

の最後のコミットメッセージを変更したい場合は<branch B>、もう一度試すことができます。

$ git commit --amend -m "your new commit message"

ただし、通常、他のコミットメッセージは、正しくない場合を除いて更新されません。

git mergeの後に競合が発生し、競合を解決して次のように実行するとします。

$ git add .
$ git commit -m "your commit message"
于 2014-01-22T10:17:53.053 に答える
7

--log今のところ、必要なことの半分を実行するオプションもありますgit-merge。これは、マージメッセージにショートログ(コミットサマリー)を配置します。ただし、完全なソリューションでは、VonCの回答のようにフックを使用する必要があります。

于 2010-07-01T17:28:10.820 に答える
5

prepare-commit-msgフックを定義してみることができます(サンプルはカスタムの「デフォルトのコミットメッセージ」を生成します)

于 2010-06-30T12:34:22.737 に答える
3

パーティーに遅れて来るが、今日では、
git merge --squash <branch>
別のブランチを現在のブランチの単一のコミットにマージし、マージされたすべてのコミットメッセージをコミットメッセージに事前入力するために使用できます-ワンライナーだけでなく、詳細なメッセージも。
このコマンドの年齢を探しました。

于 2018-05-14T14:50:33.913 に答える
2

Christian Severin回答git merge --squashで言及されていることに加えて、コミットメッセージ(のごく一部)をカスタマイズする新しい方法としての構成があります。merge.suppressDest

Git 2.29(2020年第4四半期)では、 " git merge" maninto <branch>は、構成を含むデフォルトのマージメッセージのタイトルの最後にある""を選択的に省略することを学習しましたmerge.suppressDest

コミット6e6029a(2020年7月29日)およびJunio C Hamano()によるコミット2153192(2020年7月30日)を参照してください。濱野純雄による合併---コミット341a1962020年8月1日gitster
gitster

fmt-merge-msg:マージ先を再度省略できるようにする

支援者:Linus Torvalds
支援者:Jeff King

Git 2.28では、メッセージの最後にあるmaster「」をスケルチするコードを削除するだけで、デフォルトのマージメッセージを生成するときに、特別な大文字小文字の区別を停止しました。into 'master'

マージが行われるブランチの名前と一致するグロブのセットを提供する複数値のmerge.suppressDest構成変数を導入し、ユーザーがどのブランチのfmt-merge-msgの出力を短縮するかを指定できるようにします。
設定されていない場合master、デフォルトでは変数の唯一の値として''が使用されます。

上記の移動は、関連する構成がないリポジトリーの2.28より前のデフォルトをほとんど元に戻します。

git config現在、そのマニュアルページに含まれています:

merge.suppressDest

統合ブランチの名前に一致するグロブをこの複数値の構成変数に追加することにより、これらの統合ブランチへのマージに対して計算されるデフォルトのマージメッセージinto <branch name>は、タイトルから「」を省略します。

空の値を持つ要素を使用して、以前の構成エントリから蓄積されたグロブのリストをクリアできます。変数が定義されていない場合、下位互換性のためにmerge.suppressDestデフォルト値のが使用されます。master

と:

Revert "fmt-merge-msgmaster:特別な扱いをやめる」

これにより、コミット489947cee5095b168cbac111ff7bd1eadbbd90ddmasterが元に戻り、デフォルトのマージメッセージを準備するときに''ブランチへのマージを特別なものとして扱うのを停止しました。
目標は単一のブランチを特別なものとして指定することではなかったinto <branchname>ため、すべてのブランチのデフォルトのマージメッセージのタイトルの最後に「」を残すことで解決しました。
すべての人を平等に扱うための明白で簡単な代替手段は、すべてのブランチでそれを削除することでしたが、それは情報の損失を伴います。

エンドユーザーがデフォルトのマージメッセージのタイトルから""を省略したマージを指定できるようにする新しいメカニズムを導入し、メカニズムがinto <branchname>構成されていない場合は、従来の' master'を再び特別なものにするため、すべてのこれらのテストは前述の新しいメカニズムを構成せずに実行されるため、以前に行ったテストへの変更は不要になります。

于 2020-08-09T22:28:51.607 に答える
0

デフォルトのメッセージを設定し、引数を追加する非常に単純なbash関数。--edit変更が必要な場合は、スイッチでエディターが開きます。

〜/.bashrcまたはbash_aliasesを編集します。(忘れないsource ~/.bashrcでください)bashrcに変更を適用します

function mergedevelop()
{
    git merge --no-ff --edit -m "master <-- develop: $1" develop;
}

使用する:

mergedevelop "PR #143..."メッセージを持っている:

マスター<-開発:PR#143..。

于 2017-03-17T11:41:43.907 に答える