作業中の作業の保存

GitGitBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

お帰りなさい、Git エクスプローラー!今日は、作業中の作業を管理するための Git の最も便利な機能の 1 つであるスタッシュについて掘り下げましょう。機能の作業の途中で急に別のタスクに切り替える必要があったことはありますか?Git スタッシュがあなたを救います!

Git スタッシュを、未完成の作業を一時的に保管できる魔法の引き出しのように考えてみてください。これにより、途中半端な作業をコミットすることなく、迅速にコンテキストを切り替えることができます。ブランチを切り替えたり、更新をプルしたり、緊急のバグ修正を行う必要がある場合、これは非常に便利です。

この実験では、Git スタッシュを使って作業中の作業を保存する方法、スタッシュされた変更を適用する方法、スタッシュからブランチを作成する方法、複数のスタッシュを管理する方法、およびスタッシュをクリーンアップする方法を学びます。この実験が終わるとき、Git ツールキットに強力な新しいツールが追加され、ワークフローが円滑で柔軟になります。

始めましょう!Git スタッシュの力を解き放ちましょう!


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/SetupandConfigGroup(["Setup and Config"]) git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git(("Git")) -.-> git/DataManagementGroup(["Data Management"]) git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git/SetupandConfigGroup -.-> git/init("Initialize Repo") git/BasicOperationsGroup -.-> git/commit("Create Commit") git/DataManagementGroup -.-> git/stash("Save Changes Temporarily") git/BranchManagementGroup -.-> git/branch("Handle Branches") subgraph Lab Skills git/init -.-> lab-387492{{"作業中の作業の保存"}} git/commit -.-> lab-387492{{"作業中の作業の保存"}} git/stash -.-> lab-387492{{"作業中の作業の保存"}} git/branch -.-> lab-387492{{"作業中の作業の保存"}} end

作業環境のセットアップ

スタッシュに取り組む前に、実験用の作業環境をセットアップしましょう。新しいディレクトリを作成し、Git リポジトリを初期化し、いくつかの初期コンテンツを追加します。

ターミナルを開き、次のコマンドを入力します。

cd ~/project
mkdir git-stash-lab
cd git-stash-lab
git init
echo "## Git Stash Lab" > README.md
git add README.md
git commit -m "Initial commit"

これらのコマンドが何をするか解説しましょう。

  1. cd ~/project:これにより、現在のディレクトリがホームディレクトリ内の「project」フォルダに変更されます。
  2. mkdir git-stash-lab:これにより、「git-stash-lab」という名前の新しいディレクトリが作成されます。
  3. cd git-stash-lab:これにより、新しく作成されたディレクトリに移動します。
  4. git init:これにより、現在のディレクトリに新しい Git リポジトリが初期化されます。
  5. echo "## Git Stash Lab" > README.md:これにより、「## Git Stash Lab」というコンテンツが含まれる「README.md」という名前の新しいファイルが作成されます。
  6. git add README.md:これにより、新しいファイルがコミットのためにステージングされます。
  7. git commit -m "Initial commit":これにより、ステージングされた変更が含まれる最初のコミットが作成されます。

素晴らしい!これで 1 つのコミットが含まれるリポジトリができました。ステータスを確認しましょう。

git status

作業ツリーがクリーンであるというメッセージが表示されるはずです。これは、Git スタッシュを使って実験を始める準備ができていることを意味します!

問題がある場合は、正しいディレクトリにいることと、システムに Git が正しくインストールされていることを確認してください。git --version を実行することで、Git のインストールを確認できます。

変更のスタッシュ化

これで作業環境がセットアップできたので、いくつかの変更を作成して、それをスタッシュ化する方法を学びましょう。

まず、README.md ファイルにいくつかの変更を加えましょう。

echo "This is a work in progress" >> README.md

このコマンドは、README.md ファイルに新しい行を追加します。また、新しいファイルも作成しましょう。

echo "Some important notes" > notes.txt

この時点で git status を実行すると、変更されたファイルと追跡されていないファイルが両方あることがわかります。

git status

README.md が変更されており、notes.txt が追跡されていないことを示す出力が表示されるはずです。

この時点で、急遽別のタスクに切り替える必要があるが、これらの変更をコミットする準備ができていないと想像してみてください。ここで git stash が便利になります!

変更をスタッシュ化するには、次のコマンドを実行します。

git stash

次のような出力が表示されるはずです。

Saved working directory and index state WIP on master: 1234567 Initial commit

この時点で、もう一度 git status を実行すると、興味深いことがわかります。

git status

README.md はもはや変更されていると表示されなくなりましたが、notes.txt は依然として追跡されていないファイルとしてリストアップされています。これは git stash に関する重要なポイントです。

重要なこと:デフォルトでは、git stash は次のもののみをスタッシュ化します。

  1. 追跡ファイル(既に Git が追跡しているファイル)の変更
  2. ステージングされた変更

追跡されていないファイル(私たちの例では notes.txt)は、デフォルトではスタッシュに含まれません。この動作により、リポジトリに含めたくない新しいファイルが偶然隠されることがないようになっています。

追跡されていないファイルをスタッシュに含めたい場合は、-u(または --include-untracked)オプションを使用できます。

git stash -u

このコマンドを実行すると、README.md の変更と新しい notes.txt ファイルの両方がスタッシュ化されます。

スタッシュに何が含まれているかを確認するには、次のコマンドを使用できます。

git stash list

使用したオプションに応じて、1 つまたは 2 つのスタッシュ エントリが表示されるはずです。

スタッシュ リスト ビューを終了するには、q を押します。

忘れないでください。スタッシュ化は、迅速なコンテキスト切り替えに最適です。ただし、長期的なワークフローにおけるコミットの代わりにはなりません。スタッシュは一時的な保管場所です。

スタッシュされた変更の適用

これで変更をスタッシュ化したので、それらを戻す方法を学びましょう。このための主なコマンドは 2 つあります。git stash applygit stash pop です。

まず git stash apply から始めましょう。

git stash apply

このコマンドを実行した後、予期しないことが起こるかもしれません。ステータスを確認しましょう。

git status

次のような出力が表示されるはずです。

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        notes.txt

nothing added to commit but untracked files present (use "git add" to track)

驚いたことに、README.md の変更は見られず、notes.txt のみが追跡されていないファイルとして表示されます。このような動作が起こる理由は次の通りです。

  1. 手順 2 では、最初に -u オプションなしで git stash を使用し、README.md の変更のみをスタッシュ化しました。
  2. その後、git stash -u を使用して、README.md の変更と追跡されていない notes.txt ファイルの両方をスタッシュ化しました。
  3. スタッシュを適用するとき、Git は最新のスタッシュ(-u で作成されたもの)を適用しますが、README.md の変更は表示されません。なぜなら、それらの変更は既に前のスタッシュに含まれていたからです。

README.md の変更を含むすべての変更を表示するには、次のコマンドを使用できます。

git stash apply stash@{1}

この時点で、もう一度ステータスを確認すると、README.md の変更と notes.txt の追跡されていないファイルが表示されるはずです。

この状況は、スタッシュを使用する際の重要な側面を浮き彫りにしています。スタッシュを作成して適用する順序が結果に影響を与える可能性があります。特に複数のスタッシュを扱う場合、適用する前にスタッシュの内容を確認するのは良い習慣です。

applypop の違いは、apply はスタッシュ内の変更を残したままにし、pop は適用後にスタッシュから削除するという点です。

git stash clear
git stash -u
git stash list

まず、すべてのスタッシュをクリアして新しく始め、次に -u オプションを使って変更をスタッシュ化して追跡されていないファイルを含めます。最後に、作成されたスタッシュを確認するためにスタッシュを一覧表示します。

もう一度変更をスタッシュ化して pop を試してみましょう。

git stash pop

以前と同じような出力が表示されますが、この時点で git stash list を実行すると、スタッシュが空になっていることがわかります。

なぜ applypop の両方が必要なのでしょうか?apply は、同じスタッシュ化された変更を複数のブランチに適用したい場合に便利です。pop は、同じブランチで作業を再開する際により一般的に使用されます。

スタッシュからブランチを作成する

時々、スタッシュ化した変更が実際には独自のブランチにあるべきだと気付くことがあります。Git は git stash branch コマンドを使ってこれを簡単に行えます。

まず、新しい変更を作成してスタッシュ化しましょう。

echo "Feature in progress" >> README.md
echo "More notes" >> notes.txt
git stash -u

次に、これらの変更を使って新しいブランチを作成しましょう。

git stash branch feature-branch

このコマンドは、「feature-branch」という名前の新しいブランチを作成し、それをチェックアウトした後、スタッシュ化された変更をそのブランチに適用します。その後、スタッシュはスタッシュ リストから削除されます。

次のような出力が表示されるはずです。

Switched to a new branch 'feature-branch'
On branch feature-branch
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   README.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        notes.txt

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (1234567890abcdef1234567890abcdef12345678)

この機能は、実験的な変更をスタッシュ化しておき、後でそれらが独自のブランチで追求する価値があると判断した場合に特に便利です。

忘れないでください。スタッシュからブランチを作成した後、変更を残したい場合はコミットする必要があります。

git add README.md notes.txt
git commit -m "Start new feature"

マスター ブランチに戻るには、次のコマンドを使用します。

git checkout master

複数のスタッシュの管理

Git を使って作業する際、複数のセットの変更をスタッシュ化することがあります。Git は、複数のスタッシュを簡単に管理できるようにしています。複数のスタッシュを作成、一覧表示、管理する方法を見ていきましょう。

まず、異なる変更を持つ 3 つのスタッシュを作成しましょう。

## 最初のスタッシュ
echo "Change 1" >> README.md
git stash push -m "First change"

## 追跡されていないファイル付きの 2 番目のスタッシュ
echo "Change 2" >> README.md
echo "Note 2" >> notes.txt
git stash push -u -m "Second change"

## 3 番目のスタッシュ
echo "Change 3" >> README.md
git stash push -m "Third change"

やったことを解説しましょう。

  1. README.md に変更を加えて最初のスタッシュを作成
  2. README.md に変更を加え、新しい追跡されていないファイルを作成して 2 番目のスタッシュを作成
  3. README.md に別の変更を加えて 3 番目のスタッシュを作成
  4. -m フラグを使って説明的なメッセージを追加
  5. 2 番目のスタッシュに -u フラグを使って追跡されていないファイルを含める

次に、スタッシュを一覧表示しましょう。

git stash list

次のような出力が表示されるはずです。

stash@{0}: On master: Third change
stash@{1}: On master: Second change
stash@{2}: On master: First change

スタッシュを適用せずにその内容を調べることができます。

git stash show stash@{1}

より詳細に見るには、完全な差分を表示するために -p フラグを追加します。

git stash show -p stash@{1}

より多くの変更を管理する練習のために、さらに 2 つのスタッシュを作成しましょう。

## 4 番目のスタッシュ
echo "Change 4" >> README.md
git stash push -m "Fourth change"

## 5 番目のスタッシュ
echo "Change 5" >> README.md
git stash push -m "Fifth change"

もう一度スタッシュ リストを確認しましょう。

git stash list

この時点で、リストに 5 つのスタッシュが表示されるはずです。

stash@{0}: On master: Fifth change
stash@{1}: On master: Fourth change
stash@{2}: On master: Third change
stash@{3}: On master: Second change
stash@{4}: On master: First change

一度に複数のタスクをこなす際、複数のスタッシュを管理することは便利です。ただし、スタッシュが多すぎると混乱するので、できるだけ避けるようにしましょう。長期的な作業にはブランチを使うことを検討してください。

忘れないでください。スタッシュは一時的なものです。長期間スタッシュを保持している場合は、機能ブランチを使うか、変更をコミットすることを検討してください。

スタッシュのクリーンアップ

ワークフローでスタッシュを使用する際、必要なくなったスタッシュが蓄積されることがあります。物事を整理しておくために、定期的にスタッシュをクリーンアップするのは良い習慣です。

単一のスタッシュを削除するには、先ほど見た drop コマンドを使用できます。

git stash drop stash@{2}

これにより、リスト内の最古のスタッシュが削除されます。

一度にすべてのスタッシュを削除したい場合は、次のコマンドを使用できます。

git stash clear

このコマンドは非常に注意が必要です!すべてのスタッシュが削除され、元に戻すことはできません。

もう 1 つの便利なコマンドは、先ほど見た git stash pop です。これは最新のスタッシュを適用した後、スタッシュ リストから削除します。

git stash pop

忘れないでください。一般的には、スタッシュ リストを短く保つのが良い習慣です。スタッシュは作業中の作業を一時的に保管するためのものです。スタッシュがたくさん蓄積されている場合、変更をより頻繁にコミットするか、長期的な作業には機能ブランチを作成する必要があるかもしれません。

まとめ

おめでとうございます、Git スタッシュの達人!あなたは今、Git ツールキットに強力な新しいツールを追加しました。ここで扱った重要な概念を振り返りましょう。

  1. 変更のスタッシュ化git stash を使って作業中の作業を一時的に保存する方法を学びました。
  2. スタッシュ化された変更の適用git stash applygit stash pop を使ってスタッシュ化された変更を戻す方法を学びました。
  3. スタッシュからブランチを作成するgit stash branch を使ってスタッシュ化された変更のセットを新しいブランチに変える方法を学びました。
  4. 複数のスタッシュの管理:複数のスタッシュを扱う方法を学び、必要に応じて特定のスタッシュを適用して表示する方法を学びました。
  5. スタッシュのクリーンアップ:個々のスタッシュを削除したり、すべてのスタッシュをクリアする方法を学ぶことで、良好なスタッシュの管理習慣を身につけました。

Git スタッシュは非常に便利な機能で、途中半端な作業をコミットすることなく迅速にコンテキストを切り替えることができます。タスクやブランチを迅速に切り替える必要があるときに最適です。

忘れないでください。スタッシュは便利ですが、一時的なものです。長期的な作業の場合は、変更をコミットするか、新しいブランチを作成する方が通常良いでしょう。スタッシュを賢く使えば、ワークフローを円滑で柔軟に保つのに役立ちます。