git format-patchを使用してコミットを1つのパッチにまとめるにはどうすればよいですか?
-
03-07-2019 - |
質問
ブランチで8つのコミットがあり、まだgit enlightenedでない人にメールを送りたいと思っています。これまでのところ、私がすることはすべて、8つのパッチファイルを提供するか、ブランチの履歴にあるすべてのコミットのパッチファイルを提供し始めます。 git rebase --interactiveを使用してコミットを押しつぶしましたが、今では、最初から何十万ものパッチが提供されています。私は何を間違えていますか?
git format-patch master HEAD # yields zillions of patches, even though there's
# only one commit since master
解決
次のように、使い捨てブランチでこれを行うことをお勧めします。コミットが" newlines"にある場合ブランチを開き、「マスター」に戻りました。すでにブランチ、これはトリックを行う必要があります:
[adam@mbp2600 example (master)]$ git checkout -b tmpsquash
Switched to a new branch "tmpsquash"
[adam@mbp2600 example (tmpsquash)]$ git merge --squash newlines
Updating 4d2de39..b6768b2
Fast forward
Squash commit -- not updating HEAD
test.txt | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
[adam@mbp2600 example (tmpsquash)]$ git commit -a -m "My squashed commits"
[tmpsquash]: created 75b0a89: "My squashed commits"
1 files changed, 2 insertions(+), 0 deletions(-)
[adam@mbp2600 example (tmpsquash)]$ git format-patch master
0001-My-squashed-commits.patch
これがお役に立てば幸いです!
他のヒント
ポットにもう1つのソリューションを追加するだけです。 代わりにこれを使用する場合:
git format-patch master --stdout > my_new_patch.diff
それでも8つのパッチになります...しかし、それらはすべて単一のパッチファイルに含まれ、次のものと一緒に適用されます:
git am < my_new_patch.diff
常にgit diffを使用するため、例では次のようになります
git diff master > patch.txt
これは、変更がmasterブランチにある場合のAdam Alexanderの回答の適応です。これは次のことを行います。
- 新しいスローアウェイブランチ&quot; tmpsquash&quot;を作成します。必要な時点から(&quot; git --log&quot;を実行するSHAキーを探すか、gitgを使用します。tmpsquashヘッドにしたいコミットを選択します。その後のマスターでのコミットは、スカッシュコミットになります)。
- マスターからtmpsquashへの変更をマージします。
- つぶれた変更をtmpsquashにコミットします。
- スカッシュコミットでパッチを作成します。
- マスターブランチに戻る
laura@rune:~/example (master)$ git branch tmpsquash ba3c498878054e25afc5e22e207d62eb40ff1f38
laura@rune:~/example (master)$ git checkout tmpsquash
Switched to branch 'tmpsquash'
laura@rune:~/example (tmpsquash)$ git merge --squash master
Updating ba3c498..40386b8
Fast-forward
Squash commit -- not updating HEAD
[snip, changed files]
11 files changed, 212 insertions(+), 59 deletions(-)
laura@rune:~/example (tmpsquash)$ git commit -a -m "My squashed commits"
[test2 6127e5c] My squashed commits
11 files changed, 212 insertions(+), 59 deletions(-)
laura@rune:~/example (tmpsquash)$ git format-patch master
0001-My-squashed-commits.patch
laura@rune:~/example (tmpsquash)$ git checkout master
Switched to branch 'master'
laura@rune:~/example (master)$
ご存じのとおり、 git format-patch -8 HEAD
は8つのパッチを提供します。
8つのコミットを1つとして表示し、ブランチの履歴を書き換える必要がない場合( o-o-X-A-B-C-D-E-F-G-H
)、次のようにできます:
git rebase -i
// squash A, B, C, D, E ,F, G into H
または、それはより良い解決策です、新しいブランチで X
から8つのコミットをすべて再生します(8つのコミットの前のコミット)
git branch delivery X
git checkout delivery
git merge --squash master
git format-patch HEAD
そのようにして、「配信」でコミットするのは1つだけです。ブランチ、最後の8つのコミットすべてを表します
2つのタグ間のフォーマットパッチ:
git checkout <source-tag>
git checkout -b <tmpsquash>
git merge --squash <target-tag>
git commit -a -m "<message>"
git format-patch <source-tag>
最も簡単な方法は、 git diff
を使用し、squashメソッドが出力する結合コミットメッセージが必要な場合は git log
を追加することです。たとえば、コミット abcd
と 1234
の間にパッチを作成するには:
git diff abcd..1234 > patch.diff
git log abcd..1234 > patchmsg.txt
次に、パッチを適用するとき:
git apply patch.diff
git add -A
git reset patch.diff patchmsg.txt
git commit -F patchmsg.txt
非テキストファイルを処理するときは、 git diff
への-binary
引数を忘れないでください。画像または動画。
Adam Alexanderの回答に基づく:
git checkout newlines
## must be rebased to master
git checkout -b temporary
# squash the commits
git rebase -i master
git format-patch master