1. ホーム
  2. 記事一覧
  3. Gitの作業効率化!git stash と git diff の使い方を解説

2023.10.29

Gitの作業効率化!git stash と git diff の使い方を解説

まずはGitのおさらい

Gitは、ソフトウェア開発におけるバージョン管理システムです。ソースコードの変更履歴を記録し、簡単に過去の状態に戻したり、複数の開発者で同じコードを共有したりすることができます。

Gitは、ソフトウェア開発の効率化や品質向上に欠かせないツールです。エンジニアとしてGitを使いこなすことで、より生産的で質の高いソフトウェアを開発することができます。

具体的には、以下のようなメリットがあります。

  • 変更の追跡: いつ、誰が、どのような変更を行ったのかを一目で確認できます。
  • バージョンの管理: プロジェクトの特定の時点の状態を保存し、必要に応じてそこに戻ることができます。
  • チームでの共同作業: 複数人での同時作業でも、それぞれの変更を統合し、コンフリクトを解消する手助けをしてくれます。

GitについてはエンベーダーのLinux応用コースで詳しく学ぶことができます。

https://envader.plus/course/5/scenario/1055

git stashとgit diff コマンドの紹介

Gitを効果的に使用するためには、いくつかの基本的なコマンドを理解することが不可欠です。ここでは表題のgit diff, git stash に加え、git statusという3つの重要なコマンドをそれぞれの使い方や役割、利点について解説します。

「git status」変更の現状を確認する

使い方

git status

git status コマンドは現在のリポジトリの状態を確認するためのコマンドです。変更されたファイル、ステージされていない変更、ステージされた変更などの情報を一覧できます。

役割と利点

  • ワークツリーとインデックスの状態を表示することで、次の操作を明確にする助けとなります。
  • どのファイルが変更され、どのファイルがまだコミットされていないのかを素早く確認することができます。

出力内容の詳細

git status コマンドの出力には、以下の情報が含まれます。

  • 変更されたファイル: ワークツリーで変更されたファイルの一覧
  • ステージされていない変更: ワークツリーで変更されたファイルのうち、まだステージされていない変更
  • ステージされた変更: ワークツリーで変更されたファイルのうち、ステージされた変更
  • ワークツリーとインデックスの差分: ワークツリーとインデックスの差分を表示

コマンド使用例

$ git status
# On branch main
# Changes to be committed:
# (use "git add <file>..." to update what will be committed)
#
# new file:   README.md
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# .gitignore

この例では、README.md ファイルが新しく作成されており、.gitignore ファイルは追跡されていない状態です。

「git diff」変更内容を詳しく見る

使い方

git diff

git diff コマンドは、変更された内容の差分を表示するコマンドです。これにより、具体的にどの行がどのように変更されたのかを確認することができます。

「git diff」オプション

  • --staged: ステージされた変更の差分を表示
  • --unstaged: ワークツリー上の変更の差分を表示
  • --cached: コミット済みの内容とステージされた変更の差分を表示
  • --color: 差分を色分けして表示

他にも多くのオプションがあります。

https://git-scm.com/docs/git-diff

コマンド使用例

$ git diff
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+This is a README file.

この例では、README.md ファイルが新しく作成されたため、差分は以下のようになります。

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+This is a README file.

「git stash」作業を一時保存する

使い方

git stash save "保存メッセージ"

git stash コマンドは現在の作業を一時的に保存し、クリーンな状態に戻すためのコマンドです。保存した作業を再度取り出して続けることができます。

オプション

  • --save: 保存する作業にメッセージを指定
  • --keep-index: ステージされた変更を保存
  • --include-untracked: 追跡されていないファイルを保存

コマンド使用例

$ git stash save "WIP: ファイルの追加"
Saved working directory and index state "WIP: ファイルの追加"

この例では、WIP: ファイルの追加 というメッセージで作業を保存しています。

※WIPは、Work in Progressの略で、日本語では「作業中」という意味です。Gitでは作業中の変更を一時的に保存する際に、WIPというメッセージをよく使用します。

作業中の変更を確認する

プログラミングやドキュメントの編集中にどの部分を変更したのか、それがどのように現在のリポジトリに影響するのかを確認することは非常に重要です。これらの変更を確認するために、git statusgit diff コマンドを用いて、作業中の変更内容を確認する方法を実例とともに解説します。

「git status」変更状態の確認

使い方

git statusコマンドを実行すると現在のリポジトリの状態が表示されます。

  • 変更されたファイル
  • ステージされていない変更
  • ステージされた変更など

これらの情報が一覧されます。

実際のコマンド使用例

例えば、example.txt というファイルを変更した後、git status を実行したとします。

$ git status

On branch main
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:   example.txt

この出力から、example.txt が変更されているが、まだステージされていないことが分かります。

出力内容の詳細

git status コマンドの出力には、以下の情報が含まれます。

項目説明
変更されたファイルワークツリーで変更されたファイルの一覧
ステージされていない変更変更されたファイルのうち、まだステージされていない変更
ステージされた変更変更されたファイルのうち、ステージされた変更
ワークツリーとインデックスの差分ワークツリーとインデックスの差分を表示します。この差分には、追加、削除、変更された行が含まれる

これらの情報を理解することで、現在のリポジトリの状態をより正確に把握することができます。

「git diff」詳細な変更内容の確認

使い方

git diffコマンドを使用すると変更された内容の差分が表示されます。変更前と変更後の行が色分けされて表示されるため、どの部分がどのように変更されたのかが一目瞭然となります。

実際のコマンド使用例

先ほどのexample.txtの変更内容をgit diffで確認してみましょう。

$ git diff

diff --git a/example.txt b/example.txt
index e012d44..a987f3c 100644
--- a/example.txt
+++ b/example.txt
@@ -1,2 +1,2 @@
-This is an example file.
+This is a modified example file.

この出力から、example.txt の "This is an example file." という行が "This is a modified example file." に変更されたことが確認できます。

作業の中断と再開「git stash」の活用

開発中に別のタスクに取り組む必要が出てきたり、現在の作業を一時的に中断したい場面はよくあります。git stash はそうした場面での作業の一時保存と再開時に使用するコマンドです。

なぜ変更を一時的に保存するのか

Git では変更をコミットするまで、ワークツリーとインデックスの状態は不安定な状態になります。別のタスクに取り組む場合や現在の作業を一時的に中断する場合は、変更を一時的に保存しておくことで、ワークツリーとインデックスを「変更されていない状態」に保つことができます。

スタッシュの説明

スタッシュはワークツリーとインデックスの状態を保存する機能です。ワークツリーとは、ローカルにダウンロードされたファイルのことです。インデックスとは、コミットする前に保管されるファイルの状態のことです。

スタッシュを保存すると、ワークツリーとインデックスの変更が記録されます。スタッシュされた状態を適用すると、ワークツリーとインデックスの状態が適用したスタッシュから復元されます。

スタッシュの基本的な使い方

スタッシュの基本的な使い方は、以下のとおりです。

1. 保存 (save)

git stash save "任意のメッセージ"

このコマンドで、現在の変更を一時的に保存します。

2. 一覧表示 (list)

git stash list

保存されたスタッシュの一覧を表示します。

3. 適用 (apply)

git stash apply stash@{0}

最新のスタッシュを適用しますが、スタッシュからは削除されません。

4. 適用と削除 (pop)

git stash pop

最新のスタッシュを適用し、同時にスタッシュからその変更を削除します。

5. スタッシュの削除 (drop)

git stash drop stash@{0}

最新のスタッシュを削除します。

作業の確認

開発している最中に動作確認をしたい場合もあります。スタッシュにより現在の変更を一時的に退避させ、クリーンな状態(変更されていない状態)で動作確認を行うことができます。

  1. 現在の作業をスタッシュに保存します。

    git stash save "新機能の開発中"
  2. 動作確認を行います。

  3. 動作確認が完了したら、スタッシュを適用します。

    git stash apply stash@{0}

実際の作業フロー中でのスタッシュの活用例

例えば新しい機能の開発を行っている最中に、バグ修正が必要になったとします。

  1. まず、現在の作業をスタッシュに保存します。

    git stash save "新機能の開発中"
  2. バグ修正のための新しいブランチを作成し、そのブランチに移動します。

    git checkout -b bugfix-branch
  3. バグを修正し、コミットします。

  4. メインブランチに戻り、先ほどの作業を再開します。

    git checkout main
    git stash pop

以上で緊急のタスクと通常の開発を効率的に行うことができます。

他のブランチやコミットへの移動

ここではブランチの基本的な概念、ブランチやコミット間での移動方法、そしてブランチ間の変更内容の比較方法について学習します。

ブランチとは

ブランチとはプロジェクトの異なるバージョンや機能を同時に開発するための独立した作業スペースです。ブランチを使用することで、メインの開発ラインから独立して新しい機能の開発やバグの修正を行い、作業が完了したらメインの開発ラインにマージすることができます。

「git checkout」ブランチやコミットへの移動

基本的な使い方

git checkout [ブランチ名 or コミットハッシュ]

git checkout コマンドは指定したブランチやコミットへ移動するためのコマンドです。異なる開発ラインや過去のプロジェクトの状態を簡単に確認することができます。

新しいブランチの作成と移動

git checkout -b [新しいブランチ名]

このコマンドで新しいブランチを作成し、そのブランチに移動します。

ブランチ間での変更内容の比較

ブランチ間の変更内容を比較するには、git diff コマンドを使用します。

基本的な使い方

git diff [ブランチ名1]..[ブランチ名2]
# シンプルな表示
git diff [ブランチ名1] [ブランチ名2]

このコマンドにより2つのブランチ間の差分を確認することができます。各ファイルでの変更点や追加・削除された行などが表示されます。

コンフリクトの解消

Gitを使用してチームでの開発を行う際、コンフリクトは避けて通れない問題の一つです。ここではコンフリクトがなぜ起こるのか、どのように確認しどのように解消するのかについて解説します。

コンフリクトが起こる原因

コンフリクトは、以下のようなシチュエーションで発生します。

1. 同じファイルの同じ場所を複数の人が変更

二人以上の開発者が同じファイルの同じ部分を異なる方法で変更し、その後マージまたはリベースを試みた場合、Gitはどちらの変更を優先すべきか判断できません。

2. ファイルの削除と変更

一方のブランチでファイルが削除され、もう一方のブランチでそのファイルが変更された場合もコンフリクトが発生します。

git status でのコンフリクト確認方法

コンフリクトが発生した場合 git status コマンドを使用してその情報を確認することができます。

$ git status

On branch feature-branch
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

    both modified:   example.txt

上記の出力から、example.txt ファイルにコンフリクトが発生していることが確認できます。

実際のコンフリクト解消の手順

1. コンフリクトの箇所を確認

コンフリクトが発生しているファイルをエディタで開きます。コンフリクトの箇所は以下のようなマークで示されます。

<<<<<<< HEAD
[変更された内容A]
=======
[変更された内容B]
>>>>>>> branch-name

変更されたAを採用する場合には次のように上記から不要な部分を削除します。

[変更された内容A]

2. コンフリクトの解消

上記のマークを参考にどちらの変更を採用するか、または独自の変更を加えるかを決定します。そして不要なマークを削除します。

3. 変更のステージング

コンフリクトを解消したファイルをステージングします。

git add example.txt

4. コミットの完了

コンフリクトの解消が完了したら、コミットを行います。

git commit

学んだ内容のまとめ

  • Gitの基本的な概念とその重要性
  • 基本的なコマンド (git status, git diff, git stash) の使い方と役割
  • 作業中の変更の確認と一時保存の方法
  • ブランチとコミットへの移動方法
  • コンフリクトの原因とその解消方法

Gitの学びはここで終わりではありません。実際のプロジェクトでの使用や、さらなる高度なコマンドの探求が待っています。 エンベーダーで実際のGitコマンドを試すことができるのでぜひ学習に役立ててください。

https://envader.plus/course/5/scenario/1055

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事