Welcome to Our Website

Git Interactive Rebase、Squash、Amend、および履歴を書き換える他の方法

“マスターの上にリベースして、プルリクエストをマージしてください”。”あなたは一緒にコミットをつぶしてください、きれいな、リバーシブルのギフトを手に入れることができますか?”.

“コミットのメッセージを書き直して、それが解決する問題とそれがどのように解決するかをよりよく記述できますか?”.

このような質問は、プルリクエストでよく尋ねられます。 なぜ彼らが存在する、それらを実行する方法、およびそれらの可能な問題。,

最後のコミットメッセージを書き換える

gitでできる最も簡単な履歴書き換えの一つは、lastcommitメッセージを変更することです。 コミットを行った直後に、itsdescriptionにタイプミスを見つけたり、変更セットを記述するより良い方法を見つけたとしましょう。 あなたが実行する修正を行うには:

git commit --amend 

最後のコミットメッセージでエディターを開くので、変更することができます。 保存後、同じ変更と新しいメッセージで新しいコミットが作成され、前のメッセージでコミットが置き換えられます。,

これは、追跡するのを忘れたファイルをインクルードしたり、コミットしたファイルに変更を含めたりするのに役立ちます。 これを行うには、変更を追加してから修正を実行します。

git add README.md config/routes.rb git rm notes.txt git commit --amend 

コミットメッセージの編集とは別に、新しいコミットにはgit addおよびgit rmで指定された変更が含まれます。 著者を編集することもできます。 例:

git commit --amend --author="Tute Costa and Dan Croak <[email protected]>" 

アチーブメントロック解除!, これで、リポジトリの最後のコミットを変更して、ファイルに新しい変更を含めたり、コミットメッセージを改善したりすることができます。 しかし、”危険”というタイトルのこのブログ記事の最後のセクションを理解する前に、すべてのものを修正し始めないでください。

その他のコミットメッセージを言い換える

今これについて話したいと思いますが、以前はより一般的なツールを理解する必要があります。 お楽しみに! 他のすべては、私たちが読んだら簡単になります…

Interactive Rebase

git rebase現在のブランチから別のブランチに順番にコミットを再適用します。, それはいくつかのoptionsandパラメータを受け入れるので、StackOverflowまたはGitHubコメントとgit manページの間にギャップを橋渡しするのに十分な氷山の説明のヒントです。

受け入れる興味深いオプションは、--interactive-i略して)、変更されようとしているコミットのリストを持つエディタを開きます。 Thislistはコマ

例を見てみましょう。,

他のコミットメッセージを書き換える、2を取る

このブログの最後の4つのコミットのいずれかを書き換えたいとしましょう。 次に、git rebase -i HEAD~4を実行します。

pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls pick 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend # Rebase 8db7e8b..fa20af3 onto 8db7e8b # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out 

古いものから新しいものまで、最後の四つのコミットが表示されます。 以下のコメントを参照してくださいコミットの一覧? 説明するよくやった、git! pickp略して)はデフォルトのアクションです。 この場合、コミットをそのまま再適用し、その内容やメッセージに変更はありません。 このファイルを保存(および実行)すると、リポジトリに変更はありません。,

私が言う場合reword(r略して)コミットで編集したい:

pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls r 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend 

エディタを保存して終了すると、gitは記述されたコマンドに従い、コミットを修正したかのように、再びエディタに自分自身を着陸させます。commit. 私はthatcommitメッセージを編集し、エディタを保存して終了し、出力は次のとおりです。

Calebは、あなたが子供であるかどうかにかかわらず、コミットメッセージで”すべてのハイライトを停止する”と言います。

達成ロック解除! これで、必要なanycommitのメッセージを変更できます。, “危険”セクションを理解していることを確認してください。

Squashは一緒にコミットします

他の二つのコマンドrebase interactiveは私たちを提供しています:

  • squash(s略して)、コミットを前のもの(前の行の一つ)
  • fixup(f略して)、”スカッシュ”のように動作しますが、このコミットのメッセージを破棄します

前に働いたリベースの例について引き続き取り組みます。,

pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls pick 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend 

同じ論理チェンジセットに属しているため、Calebのコミットを一緒に融合させたいとしましょう。git revertこのリポジトリにそれらの変更がないことがわかったら、簡単に—– 最初のコミットメッセージを保持し、その後の二つのコミットをpreviousoneにスカッシュしたいと思います。, 私は変更しますpicksquash適切な場合:

pick 07c5abd Introduce OpenPGP and teach basic usage s de9b1eb Fix PostChecker::Post#urls s 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend 

保存し、エディタに着陸して、meldedthreeコミットのコミットメッセージを決定します(それらが次々に連結される方法を参照してください):

# This is a combination of 3 commits. # The first commit's message is: Introduce OpenPGP and teach basic usage Besides demystifying a relatively complex tool, protocol, and etiquette, this post is intended to help with problems such as the one outlined in this tweet: > Emailed sensitive info to someone with PGP. They replied, with my > original email, all in clear text. They didn't realize it. # This is the 2nd commit message: Fix PostChecker::Post#urls # This is the 3rd commit message: Hey kids, stop all the highlighting # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Author: Caleb Hearth # Date: Tue Sep 2 09:39:07 2014 -0500 # # rebase in progress; onto 71d4789 # You are currently editing a commit while rebasing branch 'tc-git-rebase' on '71d4789'. 

私は第三のコミットメッセージを削除し、第二のコミットメッセージにより関連性の高いメモを追加することにしました。 エディタを保存すると、四つのコミットが二つに変換されました:Calebからのもの、そして私の後のもの。 よし!,

fixupコマンドを使用することができました。 その場合、コマンドは次のようになります。

pick 07c5abd Introduce OpenPGP and teach basic usage s de9b1eb Fix PostChecker::Post#urls f 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend 

保存すると、エディタにはすでにコミットされた第三のコミットメッセージが含まれていました。

保存し、出力します。

結果は同じです:2つのコミットではなく4つのコミットで、それぞれが単一の異なるブログポストを持ちます。

達成ロック解除! これで、コミットをマージできます。 として常に、危険セクションに注意してください。,

masterの上にRebase

オープンソースライブラリをフォークし、機能ブランチで作業を開始し、上流プロジェクトでmasterを先に進めます。 私たちの歴史は次のようになります。

 A---B---C feature / D---E---F---G upstream/master 

ライブラリメンテナは”マスターの上にリベースする”ように尋ねるので、両方のブランチ間で発生する可能性のあるマージコンフリクトを修正し、チェンジセットをまとめておきます。メンテナは次のような履歴を見たいと思います。

 A'--B'--C' feature / D---E---F---G upstream/master 

コミットを順番にアップストリームのマスターに再適用したいと思います。,Rebaseコマンドの説明のように聞こえます!

# Point our `upstream` remote to the original fork git remote add upstream https://github.com/thoughtbot/factory_girl.git # Fetch latest commits from `upstream` (the original fork) git fetch upstream # Checkout our feature branch git checkout feature # Reapply it onto upstream's master git rebase upstream/master # Fix conflicts, then `git rebase --continue`, repeat until done # Push to our fork git push --force origin feature 

達成はロック解除されました! あなたの機能ブランチは、元のフォークの最新のマスターのトップに適用されます。

そして、私たちは…

危険:あなたは歴史を書き換えています

最後の--forceを参照してくださいgit pushコマンド? つまり、私たちはrepositoryの歴史を上書きしていることを意味します。, これは、他のチームメンバーと共有しないコミットや、私たちに属するブランチで常に安全です(このブログ記事の例の私の頭文字を参照してください)。

しかし、すでにチームと共有されているpushエディション(pgp commitsthatに加えた変更がすでに共有されているように、リポジトリの外部に存在するcommitsthat)を強制すると、みんなのブランチが同期しなくなります。

履歴を書き換えることは、既存のコミットを放棄して新しいコミットを作成することを意味します。, 他の人が以前のコミットに基づいて作業を行い、コミットを書き直して強制的にプッシュすると、チームメンバーは自分の作業を再マージする必要があります(潜在的な損失に気づいた場合)。

thosecommitsが書き換えられる可能性があり、他の人がブランチにコミットを追加すべきではないことを知らせます。

thoughtbotでは、ブランチに頭文字を付けます。 マスターまたは共有ブランチにlandをコミットすると、再び書き換えることはありませ

だから、書き換えられたコミットがyourrepositoryにのみ存在する場合、git履歴を書き換えるか、あなたとあなたのチームは、他の誰もそれらの作業をベースにすべきで,

達成ロック解除! あなたは今、良い市民である間にリベースする方法を知っています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です