私のローカル リポジトリには、テーマ的に類似したコミットがたくさんあります。リモートにプッシュする前に、それらを単一のコミットに結合したいと思います。どうすればいいのですか?私rebase
はこれを行うと思いますが、ドキュメントを理解できません。
8 に答える
あなたがやりたいことは、gitでは「スカッシュ」と呼ばれています。これを行う場合、多くのオプションがあります (多すぎますか?) が、プッシュされていないすべてのコミットを 1 つのコミットにマージするだけの場合は、次のようにします。
git rebase -i origin/master
これにより、テキスト エディター ( -i
「インタラクティブ」用) が次のようなファイルで表示されます。
pick 16b5fcc Code in, tests not passing
pick c964dea Getting closer
pick 06cf8ee Something changed
pick 396b4a3 Tests pass
pick 9be7fdb Better comments
pick 7dba9cb All done
最初のものを除くすべてpick
をsquash
(または) に変更します。s
pick 16b5fcc Code in, tests not passing
squash c964dea Getting closer
squash 06cf8ee Something changed
squash 396b4a3 Tests pass
squash 9be7fdb Better comments
squash 7dba9cb All done
ファイルを保存してエディターを終了します。次に、別のテキスト エディターが開き、すべてのコミットからのコミット メッセージを 1 つの大きなコミット メッセージに結合できます。
出来上がり!「git squashing」をグーグルで検索すると、利用可能な他のすべてのオプションの説明が表示されます。
ここにはかなりの数の実用的な答えがありますが、これが最も簡単であることがわかりました。このコマンドはエディターを開きます。ここで、それらを削除/マージして1つにpick
置き換えることができますsquash
git rebase -i HEAD~4
ここで、4
1 つに押しつぶしたいコミットの数です。こちらでも説明されています。
git rebase -i
「ルート」として使用するリビジョンを渡して、これを行うことができます。
git rebase -i origin/master
での最後のコミット以降に行ったすべてのコミットを表示するエディタ ウィンドウが開きますorigin/master
。コミットを拒否したり、コミットを 1 つのコミットにまとめたり、以前のコミットを編集したりできます。
おそらくこれをより適切に説明できるリソースがいくつかあり、他の例を示しています。
http://book.git-scm.com/4_interactive_rebaseing.html
と
http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html
私が見つけた最初の 2 つの良いページです。
Interactive Rebaseを使用してコミットをスカッシュ (結合) できます。コマンドラインまたはSmartGitでこれを行う方法を示す非常に優れた YouTube ビデオがあります。
すでに SmartGit ユーザーである場合は、(Ctrl キーを押しながら) すべての発信コミットを選択し、コンテキスト メニュー (右クリック) を開いてコミットをスカッシュできます。
とても快適です:
Atlassianの非常に優れたチュートリアルもあり、それがどのように機能するかを示しています。
そして、私のsquashing
複数の方法push
は(おそらく、自分のブランチに多くのコミットをプッシュし、プルリクエストを実行したいが、すでにプッシュした多くのコミットでそれらを混乱させたくない)です。私がそれを行う方法(私が知る限り、他のより簡単なオプションはありません)。
squash
(プルリクエスト先の元のブランチからのブランチ)のために新しいブランチを作成します。- 新しく作成したブランチをプッシュします。
- コミット (すでにプッシュ済み) を含むブランチを新しいブランチにマージします。
- 新しいブランチとスカッシュをリベースします。
- 新しいブランチをプッシュします。
- 単一のコミットを持つ新しいブランチの新しいプル リクエストを作成します。
例:
git checkout from_branch_you_wish_to_pull_request_to
git checkout -b new_branch_will_have_single_squashed_commit
git push -u new_branch_will_have_single_squashed_commit
git merge older_branch_with_all_those_multiple_commits
git rebase -i (here you squash)
git push origin new_branch_will_have_single_squashed_commit
リクエストをプルできるようになりましたfrom_branch_you_wish_to_pull_request_to
そのリンクで詳しく説明されているInteractive Rebasingを使用することをお勧めします。
「git rebase interactive」を検索すると、他の優れたリソースを見つけることができます。