ブランチで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」ブランチにあり、すでに「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
お役に立てれば!
ポットにもう1つのソリューションを追加するには:代わりにこれを使用する場合:
git format-patch master --stdout > my_new_patch.diff
その後、それはまだ8つのパッチになります...しかし、それらはすべて単一のパッチファイルにあり、1つとして適用されます:
git am < my_new_patch.diff
私はいつもgit diffを使用していますので、あなたの例では
git diff master > patch.txt
すでにご存知のように、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つのコミットすべてを表します。
これは、変更がmasterブランチにある場合のAdam Alexanderの回答の適応です。これは次のことを行います。
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)$
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
非テキストファイルを処理するときは、--binary
へのgit diff
引数を忘れないでください。画像または動画。
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