連載
» 2016年08月29日 05時00分 公開

こっそり始めるGit/GitHub超入門(5):Gitコミット現場あるある――やり直し、取り消し、変更したいときに使えるコマンド (2/2)

[平屋真吾,クラスメソッド]
前のページへ 1|2       

ステージし忘れていたファイルをコミットに追加する

 次に「ステージし忘れていたファイルをコミットに追加する」方法を解説していきます。

【準備】「ファイルをステージし忘れた」という状況を作る

 「ステージし忘れていたファイルをコミットに追加する」方法を解説するために、「ファイルをステージし忘れた」という状況を作っていきます。

 2つのテキストファイルを追加します。ここでは「hello-5-2.txt」と「forgotten-file.txt」を追加しました。

$ echo hello-5-2 > hello-5-2.txt
$ echo forgotten > forgotten-file.txt
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
 
    forgotten-file.txt
    hello-5-2.txt
 
nothing added to commit but untracked files present (use "git add" to track)

 次に、追加したファイルをステージします。ここでは片方のファイルだけステージします。もう片方のファイルは後でステージします。

$ git add hello-5-2.txt
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
 
    new file:   hello-5-2.txt
 
Untracked files:
  (use "git add <file>..." to include in what will be committed)
 
    forgotten-file.txt

 そして、コミットを行います。

 「hello-5-2.txt」はコミットされましたが、「forgotten-file.txt」は未追跡のままの状態です。

$ git commit -m "second commit"
[master ceb3e81] second commit
 1 file changed, 1 insertion(+)
 create mode 100644 hello-5-2.txt
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
 
    forgotten-file.txt
 
nothing added to commit but untracked files present (use "git add" to track)

「git commit --amend --no-edit」コマンドで直前のコミットに「ステージし忘れていたファイル」を追加する

 「git commit --amend」コマンドを使用して、「forgotten-file.txt」も先ほどのコミットに含めてしまいましょう。

 まずは「forgotten-file.txt」をステージします。

$ git add forgotten-file.txt
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
 
    new file:   forgotten-file.txt

 そして、先ほどのコミットをやり直します。今回はコミットメッセージはそのままで良さそうなので、「--no-edit」オプションを使用してみます。

 以下のように「--no-edit」オプションを使用すれば、コミットメッセージは変更せずにコミットの内容だけを書き換えられます。

$ git commit --amend --no-edit

修正結果

 コミットログを確認すると、2回目のコミットに「forgotten-file.txt」の追加が含まれていることを確認できます。

$ git log -p
commit 92a1228b0d82cff312d10698ca752902ef8e0382
Author: Shingo Hiraya <shingohiraya@example.com>
Date:   Thu Aug 11 23:23:00 2016 +0900
 
    second commit
 
diff --git a/forgotten-file.txt b/forgotten-file.txt
new file mode 100644
index 0000000..295869f
--- /dev/null
+++ b/forgotten-file.txt
@@ -0,0 +1 @@
+forgotten
diff --git a/hello-5-2.txt b/hello-5-2.txt
new file mode 100644
index 0000000..2d6d8c6
--- /dev/null
+++ b/hello-5-2.txt
@@ -0,0 +1 @@
+hello-5-2
 
commit 1437f48aa1755c6a5814961e702df881530c3127
Author: Shingo Hiraya <shingohiraya@example.com>
Date:   Thu Aug 11 22:56:18 2016 +0900
 
    first commit
 
diff --git a/hello-5.txt b/hello-5.txt
new file mode 100644
index 0000000..e965047
--- /dev/null
+++ b/hello-5.txt
@@ -0,0 +1 @@
+Hello

ファイルの変更の取り消し

 「実験的にファイルを変更したけど、元の状態に戻したい」という状況はよくあります。ファイルをGitで管理しているなら、変更を元に戻すのは簡単です。

 このセクションでは、ステージされていないファイルの変更を取り消す方法を解説していきます。

【準備】任意のファイルをGitの管理下に置く

 まずは、任意のファイルがGitによって管理されるようにします。ここでは以下のように「hello-5-3.txt」を追加し、ステージとコミットを行います。

$ echo hello > hello-5-3.txt
$ git add hello-5-3.txt
$ git commit -m "add hello-5-3.txt"
[master 1a7b6ad] add hello-5-3.txt
 1 file changed, 1 insertion(+)
 create mode 100644 hello-5-3.txt
$ git status
On branch master
nothing to commit, working directory clean

 今、「hello-5-3.txt」の内容は以下のようになっています。

$ cat hello-5-3.txt
hello

ファイルを変更する

 ここで「hello-5-3.txt」にテキスト「goodbye」を追加します。

$ echo goodbye >> hello-5-3.txt

 1行追加されました。

$ cat hello-5-3.txt
hello
goodbye

 ここで、「git status」コマンドを実行してみます。作業ディレクトリ上の「hello-5-3.txt」は変更されたけど、その変更内容はステージされていない状態になっていることが分かります。

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
 
  modified:   hello-5-3.txt
 
no changes added to commit (use "git add" and/or "git commit -a")

「git checkout -- {ファイル名}」コマンドで変更を取り消す

 ここで、「hello-5-3.txt」に対して行った変更を取り消してみましょう。使用するコマンドは、「git status」コマンドを実行した際に表示されたメッセージ内に書かれています。

- use "git checkout -- <file\>..." to discard changes in working directory

 以下のように「git checkout -- {ファイル名}」コマンドを使用すれば、「特定のファイルのステージされていない変更」を取り消すことができます。

$ git checkout -- hello-5-3.txt
$ git status
On branch master
nothing to commit, working directory clean

修正結果

 ファイルの変更(2行目の追加)が取り消されていることを確認できます。

$ cat hello-5-3.txt
hello

ファイルの変更の取り消しにおける注意点

 ファイルの変更の取り消しに関して、1つだけ注意点があります。

 「git checkout -- {ファイル名}」コマンドを実行すると、ファイルに対して行った変更は完全に消えてしまいます。「ファイルの変更の取り消しの取り消し」はできないので、ファイルの変更が確実に不要だと分かっている場合のみ実行しましょう。

本稿で紹介したGitの基本的なコマンド一覧

 本稿では「コミットのやり直し」と「ファイルの変更の取り消し」の手順を解説しました。

 本記事で初めて登場したGitのコマンドは以下の通りです。

  • git commit --amend:直前のコミットをやり直す
  • git commit --amend --no-edit:コミットメッセージを変更せずに直前のコミットをやり直す
  • git checkout -- {ファイル名}:特定のファイルのステージされていない変更を取り消す

 次回の記事では「git reset」コマンドを使用して作業のやり直しを行う方法を解説する予定です。お楽しみに!

参考書籍

  • Pro Git』(written by Scott Chacon and Ben Straub and published by Apress)

著者紹介

平屋真吾

クラスメソッド株式会社 iPhoneアプリサービス事業部所属のプログラマーです。iOSアプリの開発がメインですが、デザインやAWSなども勉強中です。

ブログ:http://dev.classmethod.jp/author/hiraya-shingo/


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。