web-dev-qa-db-ja.com

git format-patchを使用して、どのようにしてコミットを1つのパッチにまとめますか?

ブランチで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
161
skiphoppy

次のように使い捨てブランチでこれを行うことをお勧めします。コミットが「newlines」ブランチにあり、すでに「master」ブランチに戻っている場合は、これでうまくいくはずです。

[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

お役に立てれば!

179
Adam Alexander

ポットにもう1つのソリューションを追加するには:代わりにこれを使用する場合:

git format-patch master --stdout > my_new_patch.diff

その後、それはまだ8つのパッチになります...しかし、それらはすべて単一のパッチファイルにあり、1つとして適用されます:

git am < my_new_patch.diff
129
Taryn East

私はいつもgit diffを使用していますので、あなたの例では

git diff master > patch.txt
20
Rob Di Marco

すでにご存知のように、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

そうすれば、 "delivery"ブランチでコミットが1つだけになり、最後の8つのコミットすべてを表します。

18
VonC

これは、変更がmasterブランチにある場合のAdam Alexanderの回答の適応です。これは次のことを行います。

  • 必要なポイントから新しいスローアウェイブランチ「tmpsquash」を作成します(「git --log」を実行する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)$
18
rec

2つのタグ間のフォーマットパッチ:

git checkout <source-tag>
git checkout -b <tmpsquash>
git merge --squash <target-tag>
git commit -a -m "<message>"
git format-patch <source-tag>
4
kashesandr

最も簡単な方法は、git diffを使用し、squashメソッドが出力する結合コミットメッセージが必要な場合はgit logを追加することです。たとえば、コミットabcd1234の間にパッチを作成するには:

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

非テキストファイルを処理するときは、--binaryへのgit diff引数を忘れないでください。画像または動画。

4
woojoo666

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
0
Julien W