Git Stash
スタッシングを使用すると、後でGitリポジトリにコードを保存できます。
Gitリポジトリで作業しているときに、後でGitコミットに適用するファイルに変更を加えることができます。
そこで、gitstashコマンドが役に立ちます。スタッシングを使用すると、後日、作業ブランチにコードを保存できます。このチュートリアルでは、例を挙げて、Gitでのスタッシングの基本とgitstashコマンドの使用方法について説明します。
Git Stashとは何ですか?
スタッシングを使用すると、コードを作業ディレクトリに保存して、後で使用できるようにインデックスを付けることができます。コードを書いているときに、行った変更を保存したいが、リポジトリにはコミットしたくない場合があります。
これが発生する可能性のある1つのシナリオは、問題の修正です。バグレポートが届いたとします。あなたはすでに機能の実装に取り組んでいます。最初に機能に対して行った変更を保存してから、バグを修正することをお勧めします。
これは、バグレポートが開発中の機能よりも優先される可能性が高いためです。機能に焦点を合わせたコードをリポジトリにコミットする前に、まずバグを修正することをお勧めします。バグ修正と機能をコミットに表示したくないでしょう。これは、コミットが大きく複雑になると、他の開発者がリポジトリの履歴を読み取ることが難しくなるためです。
つまり、スタッシングを使用すると、既存のコードを破棄したりコミットしたりすることなく、Gitリポジトリ内の別の作業を行うことができます。
スタッシングを使用すると、ファイルに加えた変更を後で保存する、つまり「スタッシュ」することができます。ファイルが隠されたら、他の作業を行うことができます。その後、後で戻って、コードに隠しておいた変更を適用できます。
参加者の81%は、ブートキャンプに参加した後、自分たちの技術的な仕事の見通しについてより自信を持っていると述べました。今日のブートキャンプにマッチしましょう。
平均的なブートキャンプの卒業生は、ブートキャンプの開始から最初の仕事を見つけるまで、キャリアの移行に6か月も費やしませんでした。
スタッシングすると、現在の作業ディレクトリが最後のコミットに戻ります。これは、コードを隠しておくと、作業できるクリーンな作業ディレクトリが得られることを意味します。クリーンなディレクトリがあるということは、マージの競合を心配することなく変更を加えることができることを意味します。また、コミット間で行った変更の並べ替えについて考える必要もありません。
Gitの変更を隠しておく方法
git stashコマンドは、後でコードを隠しておくために使用されます。 git stashを実行すると、現在の作業ディレクトリのコミットにプッシュしていない変更が後で使用できるように保存されます。これには、ステージングされた変更(git addを使用してステージング領域に追加された変更)とステージングされていない変更の両方が含まれます。
gitstashコマンドの構文は次のとおりです。
git stash
ウェブサイトで作業していて、コードがGitリポジトリに保存されているとしましょう。
コード内のindex.htmlファイルとindex.jsファイルに変更を加えました。 index.htmlファイルの設計上のバグを修正する間、これらのファイルを後で隠しておく必要があります。
変更を表示するには、gitstatusコマンドを使用できます。これは、この例では次のようになります。
On branch master Your branch is up to date with 'origin/master'. Changes to be committed: new file: index.js Changes not staged for commit: modified: index.html
これは、新しいファイル(index.js)を作成し、既存のファイル(index.html)を変更したことを示しています。コードベースの別の部分で作業している間、これらの変更を後で保存したいと思います。そのためには、gitstashコマンドを使用します。
git stash
コードは次のようになります:
Saved working directory and index state WIP on master: 3b16026 feat: Launch new homepage
git stashコマンドは、後でリポジトリに加えた変更を保存しました。ここで、git statusコマンドを再度実行すると、コミットするものがないことがわかります。
On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree clean
git stashコマンドは、後でリポジトリに加えた変更を保存しました。ここで、git statusコマンドを再度実行すると、コミットするものがないことがわかります。
コードが隠されている場合、リポジトリは変更を加えずに以前のコミットに戻されます。コードに加えた変更は、後で使用できるように保存されています。 stash popコマンドを使用して、準備ができたらコードベースに適用できます。
追跡されていない変更を隠蔽する
git stashコマンドは、Gitリポジトリですでに追跡されているファイルへのステージングされた変更とステージングされていない変更のみを隠します 。デフォルトでは、stashコマンドには追跡されていない変更は含まれていません。
段階的変更は、ステージング領域に追加された変更です。隠されているステージングされていない変更は、Gitによって追跡されたファイルに加えられた変更です。 Gitによって追跡されていない新しいファイルを変更した場合、そのファイルはGitスタッシュに追加されません。無視されたファイルはスタッシュに追加されません。
これらは、gitstashコマンドを使用するときに適用されるデフォルトの設定です。ステージングされていない新しいファイルなど、追跡されていないファイルを隠したい場合は、-uフラグを使用できます。 -uフラグの構文は次のとおりです。
git stash -u
または、無視されたファイルをstashに含めたい場合は、-aフラグを使用できます。 -aフラグの構文は次のとおりです。
git stash -a
-aフラグを使用すると、無視されたファイルへの変更をstashするようにgitstashに指示します。これらは、コードリポジトリの.gitignoreファイル内で定義されているファイルです(ある場合)。
gitstashpopを使用して隠し変更を適用する
git stash popコマンドは、隠された変更をリポジトリに適用するために使用されます。前の例で行った隠し変更を適用することにしたとします。次のコマンドを使用してこれを行うことができます:
git stash pop
git stash popコマンドは次を返します:
On branch master Your branch is up to date with 'origin/master'. Changes to be committed: new file: index.js Changes not staged for commit: modified: index.html Dropped refs/stash@{0} (48afd55381cf43f2332f771349c7233fb99f80a6)
git stash popコマンドを実行すると、stashからの変更がリポジトリのローカル作業コピーに適用されます。 popコマンドは、tash内のコードをリポジトリに適用します。次に、隠し場所が空になります。
git stash popコマンドは、コードに加えた変更のリストも返します。これには、スタッシュに何が含まれていたかが示されます。
git stash applyコマンドを使用して、コードに加えた変更を適用できます。あなたはあなたの隠し場所にそれらの変更を保持することができます。次のコマンドを使用して、これを隠し場所に変更を保持できます。
git stash apply
コマンドは次を返します:
On branch master Your branch is up to date with 'origin/master'. Changes to be committed: new file: index.js Changes not staged for commit: modified: index.html
複数のブランチに変更を適用する
コードベース全体の多くのブランチに同じ隠し変更を適用することは、stashコマンドの良いユースケースです。たとえば、1つのブランチにスタッシュを適用することを決定できます。次に、別のブランチに移動し、同じスタッシュを使用して保存された変更を適用します。
複数の隠し場所
Gitで複数のスタッシュを作成できます。これは、1つのファイルに変更を加えて、後で使用できるようにそれらを隠しておくことができることを意味します。別のファイルに変更を加えて、別の隠し場所に保存することができます。
スタッシュの追跡
リポジトリ内の隠し場所のリストを返すには、次のコマンドを実行できます。
git stash list
作成したすべてのスタッシュのリストを取得したいとします。上記のコマンドを実行することでこれを行うことができます。このコマンドは次を返します:
stash@{0}: WIP on master: 3b16026 feat: Launch new homepage stash@{1}: WIP on master: 3b16026 feat: Launch new homepage
git stash listコマンドは、スタッシュのリストを返しました。
ただし、これらのスタッシュは、スタッシュに関連付けられたデフォルトのコミットメッセージのみを使用します。これは、どのスタッシュにどの変更が含まれているかを追跡するのが難しいことを意味します。これは、どの隠し場所にも説明を指定していないためです。
新しいスタッシュに説明を追加したいとします。次のコマンドを使用してこれを行うことができます:
git stash save "add new change to website"
コマンドは次を返します:
Saved working directory and index state On master: add new change to website
最後のコミットに関連付けられたデフォルトのメッセージが与えられるのではなく、スタッシュに独自のメッセージが割り当てられています。
複数のスタッシュを適用する
git stash popコマンドは、最新のstashをリポジトリー(タグstash @ {0}を持つもの)に適用します。ただし、複数のスタッシュを使用している場合は、特定のスタッシュをコードベースに適用することをお勧めします。
これを行うには、コードベースに適用するスタッシュに関連付けられた一意のIDを指定します。 stash@{1}に格納されているstashをコードベースに適用するとします。次のコマンドを使用してこれを行うことができます:
git stash pop stash@{2}
このコマンドは、stash @ {2}に保存されている変更をリポジトリに適用し、stashを削除します。
スタッシュを使用したブランチの作成
スタッシングは、コードベースに加えた変更を、別の変更を行う際に便利に保存する方法です。
ただし、隠し場所を維持する代わりに、コードを独自のブランチに移動したい場合があります。
このシナリオは、コードをマージするときに発生する競合がある場合に発生する可能性があります。コードベースに大きな変更を加える場合は、コードを別のブランチに移動することもできます。そこで、gitstashbranchコマンドが登場します。
git stash branchコマンドを使用して、stashの変更が適用される新しいブランチを作成できます。このコマンドの構文は次のとおりです。
git stash branch <new-branch> <stash-id>
「new-branch」パラメーターは、作成する必要のあるブランチのIDを参照します。 「stash-id」とは、新しいブランチにコードを適用するスタッシュのIDを指します。
stash @{2}stashからの変更を「update-site」という新しいブランチに適用するとします。次のコマンドを使用してこれを行うことができます:
git stash branch update-site stash@{2}
コマンドは次を返します:
Switched to a new branch 'update-site' On branch update-site Changes to be committed: new file: index.js Changes not staged for commit: modified: index.html Dropped stash@{2} (9a15b9cd20f8988937134d1267fafbea4c6a8647)
まず、git stash branchコマンドは、隠された変更用の新しいブランチを作成します。リポジトリに加えた変更は、新しいブランチに適用されます。次に、そのブランチの表示に切り替えられます。最後に、隠されたコードが独自のブランチに保存されているため、隠されたコードは削除されます。
Gitスタッシュを削除する
stashでコードを使用したら、gitstashdropコマンドを使用してstashを削除できます。 gitstashdropコマンドの構文は次のとおりです。
git stash drop <stash>
ID stash@{2}のスタッシュを削除するとします。次のコマンドを使用してこれを行うことができます:
git stash drop stash@{2}
コマンドは次を返します:
Dropped stash@{2} (82079798c950b053fac0efb7b1d5693864dc96e7)
または、git stash clearコマンドを使用して、リポジトリに関連付けられているすべてのスタッシュを削除することもできます。このコマンドの構文は次のとおりです。
git stash clear
このコマンドは、リポジトリ内のすべてのスタッシュを削除します。
特定のファイルの隠し場所
git stashコマンドは、デフォルトで現在の作業ディレクトリにあるすべての追跡ファイルを隠します。ただし、場合によっては、特定のファイルまたはファイルのセットを隠しておくことを決定することもあります。
git stash pushコマンドを使用して、特定のファイルを隠しておくことができます。このコマンドを使用するための構文は次のとおりです。
git stash push -m "<message>" <file>
「メッセージ」パラメータは、スタッシュに関連付けられるメッセージを指します。 「file」パラメータは、隠したいファイルの名前です。
コード内のindex.htmlファイルに加えた変更のみをスタッシュに追加するとします。次のコマンドを使用してこれを行うことができます:
git stash push -m "feat: changed index.html file" index.html
コマンドは次を返します:
Saved working directory and index state On master: feat: changed index.html file
このコマンドは、コミットメッセージ「feat:changedindex.htmlfile」を含むindex.htmlファイルをスタッシュに追加しただけです。コードに加えた他のすべての変更は追加されていません。
スタッシュ間の違いを表示
スタッシュを使用している場合、スタッシュしたコードに戻る前に、複数のコミットにわたってコードベースにさまざまな変更を加える可能性があります。
たとえば、コードを隠してバグを修正した場合、隠されたコードに戻る前に、いくつかのコミットをプッシュしてバグを修正することができます。これは、スタッシュとコードの最新のコミットとの違いの要約を確認したい場合があることを意味します(したがって、コードをスタッシュしてから行った変更を知ることができます)。
stashと最新のコミットの違いを表示するには、gitstashshowコマンドを使用できます。このコマンドの構文は次のとおりです。
git stash show <stash-id>
「stash-id」パラメーターは、ブランチの最新のコミットと比較する変更を行うstashのIDです。 stash @{1}stashのコードをコードの現在の状態と比較したいとします。次のコマンドを使用してこれを行うことができます:
git stash show stash@{1}
コマンドは次を返します:
index.html | 2 +- index.js | 0 2 files changed, 1 insertion(+), 1 deletion(-)
この出力は、コードに2つの変更を加えたことを示しています。1つは挿入、もう1つは削除です。ファイル間の違いを表示したい場合は、-pstashフラグを使用してそれらを確認できます。このフラグの構文は次のとおりです。
git stash show -p stash@{1}
上記のコマンドを実行すると、次の結果が返されます。
diff --git a/index.html b/index.html index 4dd1ef7..e859c68 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -</div> +</html> diff --git a/index.js b/index.js new file mode 100644 index 0000000..e69de29
この出力により、stash内のコードとブランチの最新のコミットの完全な比較を確認できます。たとえば、上記の出力は、index.htmlファイルから