33

メインとマージする前に、ブランチのコミットを単一のコミットに凝縮することは可能ですか? これはかなり一般的なシナリオだと思いましたが、適切な検索用語を使用していない可能性があります。

シナリオを詳しく説明します。多くの場合、ブランチの変更に取り組んでいるときに、変更の包括的な履歴を確実に保持するために、多くのローカル コミットを行いたいと思います。しかし、ブランチの変更が完了したら、メインにマージするときに、ブランチのコミットを 1 つに減らしてからメインにマージしたいと考えています。Git ではコミットが低コストであることは理解していますが、状況によっては、これを行うことを好むかもしれません。

*   merge to main
|\
* | commit 2 on main
* | commit 1 on main
| * commit 2 on branch
| * commit 1 on branch
|/
*   branch from main

のように見えるようにする

*   merge to main
|\
* | commit 2 on main
* | commit 1 on main
| * commit on branch (branch commits flattened to one)
|/
*   branch from main

私はgitに関しては初心者です。用語の使用に誤りがありましたら、お詫び申し上げます。

4

4 に答える 4

31

インタラクティブなリベースの使用方法を学ぶことをお勧めしますが、複雑すぎると思われる場合は、単純に使用できます

git reset --soft <diverging-commit>

インデックスを変更せずに分岐点までのすべてのコミットを元に戻す

git commit -s

すべての変更を 1 回コミットします。

于 2012-07-31T04:02:31.123 に答える
15

インタラクティブなリベースを使用します。ブランチがマスターから分岐したコミットを見つけ(使用する場合がありgit merge-baseます;コミットを呼び出しましょう<diverge>)、次に

git rebase -i <diverge>

エディターがポップアップ表示され、履歴をインタラクティブに書き換えることができます。コミットを潰したくなるでしょう。

于 2012-07-30T15:35:46.643 に答える
13

git merge --squash <branch>コミットを実行せずにブランチをマージするために使用することもできます:

$ git checkout master
$ git merge --squash mybranch
...
Squash commit -- not updating HEAD
Automatic merge went well; stopped before committing as requested
$ git commit

(更新: 履歴の書き換えを避けることを提唱する記事へのリンクを削除しました。今では、レビューの前に小さな機能ブランチをつぶすことをお勧めします。)

于 2012-12-16T21:14:02.553 に答える
2

を見てくださいgit rebase。この-iオプションを使用すると、コミットを編集、スカッシュ (必要なもの)、または削除することさえできます。

たとえば、私が一般的に使用する方法は次のとおりです。

git rebase -i origin/master
....
git push
于 2012-07-30T15:37:29.013 に答える