【Git】git unstageコマンドでステージ追加を取り消す方法をわかりやすく説明

Web開発

はじめに

皆さんはGitで変更をステージ(インデックス)に追加した後、やっぱり取り消したいと考えたことはないでしょうか。 コードを書いていると「あれ、このファイルはまだコミットしないほうがいいかも」というケースがあります。 そんなときに便利なのがgit unstageに関わる操作です。

とはいえ、Gitに不慣れな方にとっては「unstage」という言葉そのものが初めてかもしれません。 ここでは具体的な操作例を交えながら、初心者でも理解しやすい形で説明していきます。 実務での活用シーンもイメージしやすいように触れていきますので、開発現場でのトラブルを減らす一助になれば嬉しいです。

この記事を読むとわかること

  • Gitにおけるステージングエリアの役割
  • git unstageが必要となる主なケース
  • git unstageを実現するためのコマンド例
  • 複数ファイルや部分的にunstageする方法
  • 実務での注意点や活用のポイント

Gitのステージングエリアとは?

初心者の方は「ステージングエリア」という概念を聞く機会があるかもしれません。 これはコミットする前に“候補”として変更を一時的に置いておく場所です。

皆さんが作業用ディレクトリでファイルを編集すると、まず作業ツリーに変更が加わります。 その後、git addコマンドで特定のファイルやディレクトリをステージングエリアへ追加します。 このステージングエリアにある変更だけが次のコミットに含まれる仕組みです。

例えば下記のような流れが典型的です。

  1. ファイルを編集して作業ツリーが変更される
  2. git add <ファイル名> でステージングエリアに変更を登録
  3. git commit -m "コミットメッセージ" でコミットを確定

ここで一度ステージングエリアに追加した変更を取り消す操作が、いわゆるgit unstageにあたります。 Gitには正式に「git unstage」というコマンドはないものの、実質的に「unstage」を行うための方法がいくつか存在します。

git unstageが必要になるケース

実際の現場では、以下のような状況でunstage(ステージング解除)したいと感じることが多いです。

誤って不要なファイルをステージしてしまった

ログファイルやテスト用のファイルを間違えて git add してしまった、という場合です。

まだ作業が中途半端なファイルをステージしてしまった

ローカルで作業中のファイルをコミットすると、他の人に影響を与えるかもしれません。

コミットの粒度を細かくしたい

複数の変更をまとめてステージしたものの、後からコミットを分けたいと思い直すケースです。

これらのケースでいきなりコミットを取り消す方法もありますが、コミット前に「やっぱりステージから外したい」というときはunstage操作を使うほうが安全でスムーズだと感じる方も多いでしょう。

git unstageを実現するためのコマンド

git unstageを実現する具体的なコマンドとして、以下の2通りがよく使われます。

  1. git restore --staged <ファイル名>
  2. git reset HEAD <ファイル名>

ステージに追加された変更を作業ツリーに戻し、コミットに含まれない状態へ変更することです。

git restore --staged

比較的新しめのGitコマンドで、初心者の方にもわかりやすいと感じる方がいるかもしれません。 ファイル名を指定すると、そのファイルがステージから外されます。

git restore --staged index.html

これにより、index.html というファイルはステージングエリアから外され、作業ツリーの変更として残ります。 その後、もし再度追加したい場合は git add index.html でOKです。

git reset HEAD ファイル名

こちらは昔から使われている方法です。 git reset HEAD index.html のように打つと、index.html をステージングエリアから取り消します。

git reset HEAD index.html

見た目としてはgit restore --stagedと同じ結果になるため、どちらを使ってもかまいません。 現場によっては習慣的に git reset HEAD <ファイル名> が好まれることもありますので、使いやすい方を選ぶといいでしょう。

複数ファイルをunstageする場合

複数のファイルをまとめてステージングから外したい場合は、ファイルを複数指定するか、ディレクトリを指定できます。 例えば以下のように、main.cssapp.js の2つを同時にunstageします。

git restore --staged main.css app.js

あるいはディレクトリをまとめて指定しても問題ありません。 Gitではワイルドカードも使えるため、指定が多い場合は活用する方法もあります。

git restore --staged src/

こうすると src/ ディレクトリ以下の変更がすべてunstageされます。 ただし、必要なファイルだけを戻したい場合は、個別にファイルを指定したほうが安全です。

部分的にunstageするには?

ステージに追加しすぎたものの、全部外してしまうのはもったいないと感じるケースがあるかもしれません。 たとえば、1ファイル内の一部変更だけをコミットしたいときです。 このような場合はインタラクティブモードが有効活用できます。

インタラクティブモードでの操作例

具体的には git add -p(パッチモード) を使用して、コミットしたい行だけをステージングすることが可能です。 逆に、間違えてステージした行を外すこともできます。

git add -p

すると、変更差分を行単位で表示してくれます。 その表示を見ながら「ステージに残すか外すか」を選択するイメージです。

  • y : ステージに追加(コミット対象にする)
  • n : 追加しない
  • e : エディット(差分を手動で編集)

もし既にファイル全部をステージしてしまっても、パッチモードを使えば変更の一部だけを取り除くこともできます。 ファイル全体を一旦コミットから外してから再度 git add -p してもいいですが、状況に合わせて使い分けると良いでしょう。

実務での活用シーン

それでは、ステージングを取り消す操作がどのように実務で役立つのか、もう少し深掘りしてみましょう。

まだ公開できない秘密のコードを混ぜてしまった

皆さんが新機能の開発中にAPIキーやテストコードなどを一緒にステージしてしまった場合、コミットしてしまうと他のメンバーにもコードが共有されます。 意図しないタイミングで共有されるとプロジェクト全体に混乱が生じる可能性があります。 git restore --staged <ファイル名> もしくは git reset HEAD <ファイル名> ですぐに取り消すことで、リスクを最小限に抑えられます。

コミットメッセージの粒度を調整したい

たとえばCSSの修正とJavaScriptの修正をまとめてステージしてしまった場合、後からCSSだけ先にコミットして別のタイミングでJavaScriptをコミットしたい、といった要望が出てくるかもしれません。 このときは一度全てのファイルをunstageしてから、必要なものだけを改めてステージし直すとコミットを分割できます。

やみくもに大きなコミットをまとめてしまうと、後で差分を追うときに原因追求がしにくくなります。小さめのコミットを心がけるためにも、unstageの操作が役立つでしょう。

作業途中のリファクタリングや追加実装を分けたい

機能開発の合間にコードを整理したり変数名をリネームしたりすることがあります。 ところが、作業に集中しているうちに開発中の機能実装とリファクタリングが混在し、どちらもステージされてしまうケースは珍しくありません。 そこでリファクタリングだけ先にコミットし、続けて機能実装分をコミットすると、変更履歴がより明確になります。

よくある質問へのヒント

ここでは、はじめてgit unstageに触れる方が抱きやすい疑問に少し触れておきます。

コミットしてしまった場合はどうする?

もし誤ってコミットした後なら、コミットをやり直す手段があります。 しかし、すでにリモートリポジトリにプッシュしてチームが参照しているなら、履歴を上書きする操作は注意が必要です。 まだプッシュ前なら git commit --amend を使い、コミットに含めるファイルを修正することも可能です。

ファイルを削除したのに、ステージングのままになっている

ファイルを削除するとステージングエリアには「削除の変更差分」が記録されます。 もしこれを取り消したい場合も、git restore --stagedgit reset HEAD を活用できます。 ファイルがディスク上で削除されるかどうかは、あくまで“作業ツリー”の状態に左右される点も覚えておくと良いでしょう。

まとめ

git unstageの操作は一見マイナーな機能に感じるかもしれません。 しかし、現場での作業効率やリスク管理を考えると、ステージングから不要なファイルや行を素早く外せるのはとても便利です。

  • ステージングエリアはコミットの準備をする場所
  • 誤ってステージした場合は「git restore --staged」や「git reset HEAD」で取消可能
  • 部分的にステージする(あるいは外す)場合はインタラクティブモード(git add -p)が便利

Gitでの作業はコミット単位が細かいほうが後から履歴をたどりやすくなり、チームにも分かりやすい形で共有できます。 そういった意味でステージングを取り消すテクニックは、作業途中の修正やコミットメッセージの整理に大いに役立つでしょう。

もし皆さんのプロジェクトで「あ、コミット前にこれ外したい」と思ったときは、今回紹介した方法を試してみてください。 その一手間が、後々のトラブルを回避するうえで大切なポイントになり得ます。

Gitをマスターしよう

この記事で学んだGitの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。