174

まだ git に慣れていない人にメールで送りたいブランチに 8 つのコミットがあります。これまでのところ、私が行うことはすべて、8 つのパッチ ファイルを提供するか、ブランチの歴史の最初からのすべてのコミットに対してパッチ ファイルを提供し始めるかのいずれかです。私は git rebase --interactive を使用してコミットを無効にしましたが、今ではすべての試行で最初から無数のパッチが提供されます。私は何を間違っていますか?

git format-patch master HEAD # yields zillions of patches, even though there's 
                             # only one commit since master
4

8 に答える 8

195

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

[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
于 2009-03-05T21:46:58.997 に答える
140

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

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

それでも8つのパッチになります...しかし、それらはすべて単一のパッチファイルになり、次のように1つとして適用されます。

git am < my_new_patch.diff
于 2009-12-12T08:28:45.487 に答える
22

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

または、それがより良い解決策であり、新しいブランチで(8つのコミットの前のコミット)から8つのコミットすべてを再生しますX

git branch delivery X
git checkout delivery
git merge --squash master
git format-patch HEAD

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

于 2009-03-05T21:46:02.150 に答える
19

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

  • 必要なポイントから新しい使い捨てブランチ「tmpsquash」を作成します(「git --log」を実行するか、gitg を使用して SHA キーを探します。tmpsquash ヘッドにしたいコミットを選択します。マスター内のその後のコミットは押しつぶされたコミット)。
  • master から tmpsquash への変更をマージします。
  • 押しつぶされた変更を tmpsquash にコミットします。
  • 押しつぶされたコミットでパッチを作成します。
  • master ブランチに戻る

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)$
于 2010-10-17T15:52:38.423 に答える
8

Easiest way is to use git diff, and add in git log if you want the combined commit message that the squash method would output. For example, to create the patch between commit abcd and 1234:

git diff abcd..1234 > patch.diff
git log abcd..1234 > patchmsg.txt

Then when applying the patch:

git apply patch.diff
git add -A
git reset patch.diff patchmsg.txt
git commit -F patchmsg.txt

Don't forget the --binary argument to git diff when dealing with non-text files, e.g. images or videos.

于 2015-09-03T10:31:39.440 に答える
7

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

git checkout <source-tag>
git checkout -b <tmpsquash>
git merge --squash <target-tag>
git commit -a -m "<message>"
git format-patch <source-tag>
于 2013-09-02T11:39:16.970 に答える
0

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
于 2012-12-30T22:25:56.557 に答える