4

次のような一連のコミットが与えられた場合

b9dc80c commit msg 1 #530
88a4d3c another commit
1010bce commit msg 2 #530
040ac6d commit msg 3 #530
6b72683 another commit
ed17416 another commit
f49bbbd commit msg 4 #530

を使用したコミットのすべての変更の差分を確認したいと思い#530ます。これまでのところ、すべての適切なハッシュを便利な形式で取得しています。

git log --oneline | grep #530 | awk -F" " '{print $1}' | xargs echo
# b9dc80c 1010bce 040ac6d f49bbbd

これらのコミットを 1 つの差分に「マージ」することはできますか? つまり、元のリポジトリに実際に影響を与えることなく、メモリ内でマージします。これらのコミットを別のブランチで選択して差分を取ることができることはわかっていますが、それは複雑すぎます。

使用例は、指定されたチケット ID ですべての変更を表示することです。

例:

echo a > file
git add file && git commit "first"
echo b > file
git add file && git commit "second #XX"
echo a > file
git add file && git commit "third #XX"
the-special-command

私が念頭に置いていた「差分」を使用すると、#XXコミットを「比較」すると、2つの個別の変更ではなく空の出力が得られるはずfileです.

4

3 に答える 3

1

次の 2 つのオプションがあります。

  • コミットから一時ブランチへのマージ ダンスのスクリプトを作成します。
  • patchutilsパッケージのcombinediffコマンドを使用します。

編集:「log | grep」を単純化して、log --grepハッシュのみを求めることができます--format

于 2013-08-28T13:31:08.620 に答える
0

git show見つかったすべてのコミット sha-1 の出力を印刷すると、うまくいきますか?:

git log --oneline | grep #530 | awk -F" " '{print $1}' | xargs git show --oneline

出力を「マージ」したい場合は、不要なコミット メタデータのみを抽出する必要があります...

または、より「マージしやすい」もの: git log --oneline | grep a | awk -F" " '{print $1}' | xargs git show --pretty=format:

于 2013-08-28T13:06:20.030 に答える
0

少し異なるアプローチを次に示します。

git checkout -b tempbranch b9dc80c
git rebase -i f49bbbd^
# remove all the commits that you don't want from the editor, and
# replace all the other "pick" commands except the first with "squash"
git log -1 -p

これにより、現在のブランチと同じ一連のコミットを最初に含む新しいブランチが作成されます。次に、そのブランチで、rebase不要なコミットを削除し、残りを 1 つのコミットにまとめます。次に、このgit log -1 -pステップで結果のパッチが表示されます (パッチをgit diff HEAD^ HEAD何に使用するかに応じて、わずかに異なる出力が得られる、または他のいくつかの代替手段を使用することもできます)。各コミットの変更の性質によっては、実行中にいくつかの競合を解決する必要があるかもしれませんがrebase、それは必ずしも異常ではありません...

これが完了したら、一時ブランチを破棄できます。

git checkout otherbranch
git branch -D tempbranch
于 2013-08-28T14:49:40.587 に答える