「softでもhardでもHEADとブランチを付けたまま」――git resetで作業の取り消しこっそり始めるGit/GitHub超入門(6)(3/3 ページ)

» 2016年10月27日 05時00分 公開
[平屋真吾クラスメソッド]
前のページへ 1|2|3       

「--mixed」オプションを使用してステージングエリアを巻き戻し、コミットをやり直す

 次は「--mixed」オプションを試します。「『--soft』オプションを使用してコミットをまとめる」で使用したリポジトリに対して引き続き操作を行っていきます。

 「--mixed」オプションを指定した場合、「--soft」オプションを指定した場合の動作に加え、「ステージングエリアを指定コミット時の状態と一致させる」処理が実行されます。作業ディレクトリの状態は変わらないので、HEADとステージングエリアの状態だけを巻き戻したい場合に使えます。

 この動作を利用してステージングエリアを1つ前のコミットの状態まで戻し、再度コミットを行う手順を解説していきます。

図7 ステージングエリアの巻き戻しとコミットのやり直しを行う前のコミット履歴
図8 ステージングエリアの巻き戻しとコミットのやり直しを行った後のコミット履歴

準備

 「--mixed」オプションを試すためにnumbers.txtに少し変更を加えます。4行目「four」を追加し、ステージとコミットを行います。

$ echo four >> numbers.txt
$ git add numbers.txt
$ git commit -m "add four"
[master d25d95f] add four
 1 file changed, 1 insertion(+)

 ここで、ステータスとコミットログを確認してみます。3つ目のコミットが追加されています。

$ git status
On branch master
nothing to commit, working directory clean
 
$ git log --oneline --decorate
d25d95f (HEAD -> master) add four
4187dcf add two and three
96c3a6a first commit

ステージングエリアを巻き戻す

 準備ができましたので、「--mixed」オプションを試してみます。

 「準備」で4行目「four」を追加しましたが、ここで気が変わって最新のコミットに「5行目の文字列追加」という変更も含めたくなったとします。「--mixed」オプションとともに「git reset」コマンドを使用して「HEADの移動」と「ステージングエリアのリセット」を実行し、5行目の文字列追加とコミットを行います。

 「--mixed」オプションはデフォルトのオプションなので明示的に指定する必要はありません。実際は以下のように「git reset{コミット}」コマンドを使用します。また、「HEAD~」は1つ前のコミットを指します。

$ git reset HEAD~
Unstaged changes after reset:
M   numbers.txt

 「リセットしたので、numbers.txtへの変更がステージングエリアから取り除かれた」旨のメッセージが表示されました。

 ステータスとコミットログを表示してみると、masterがコミット「4187dcf」を指すようになり、numbers.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:   numbers.txt
 
no changes added to commit (use "git add" and/or "git commit -a")
 
$ git log --oneline --decorate
4187dcf (HEAD -> master) add two and three
96c3a6a first commit

 5行目「five」を追加し、ステージとコミットを行います。

$ echo five >> numbers.txt
$ git add numbers.txt
$ git commit -m "add four and five"
[master 4896491] add four and five
 1 file changed, 2 insertions(+)

 作業ディレクトリがクリーンになり、コミット履歴が3件になりました。

$ git status
On branch master
nothing to commit, working directory clean
 
$ git log --oneline --decorate
4896491 (HEAD -> master) add four and five
4187dcf add two and three
96c3a6a first commit

 「--mixed」オプションを使用してステージングエリアを巻き戻し、コミットをやり直す操作はこれで完了です。

「--hard」オプションを使用して直前のコミットを破棄する

 最後に「--hard」オプションを試します。「『--mixed』オプションを使用してステージングエリアを巻き戻し、コミットをやり直す」で使用したリポジトリに対して引き続き操作を行っていきます。

 「--hard」オプションを指定した場合、「--mixed」オプションを指定した場合の動作に加え、「作業ディレクトリを指定コミット時の状態と一致させる」処理が実行されます。

 例えば「実験的な変更をコミットしたけどその変更が不要になった場合」などに使用できます。1度もコミットしていない変更は取り戻すことができないので、「--hard」オプションは取り扱いを注意する必要があります。

図9 直前のコミットを破棄する操作を行う前のコミット履歴
図10 直前のコミットを破棄する操作を行った後のコミット履歴

 それでは「--hard」オプションを使用して、直前のコミットを破棄する操作を行ってみます。現在のコミット履歴は以下のようになっています。

$ git log --oneline --decorate
4896491 (HEAD -> master) add four and five
4187dcf add two and three
96c3a6a first commit

 「git reset --hard HEAD~」コマンドを使用して、最新のコミット「4896491」を破棄します。masterが1つ前のコミット「4187dcf」を指すようになり、ステージングエリアと作業ディレクトリがコミット「4187dcf」を記録したときの状態になります。

$ git reset --hard HEAD~
HEAD is now at 4187dcf add two and three

 コミット履歴を表示すると、コミット「4896491」がコミット履歴から消え、masterがコミット「4187dcf」を指すようになったことを確認できます。

$ git log --oneline --decorate
4187dcf (HEAD -> master) add two and three
96c3a6a first commit

 また、ステージングエリアと作業ディレクトリの両方がコミット「4187dcf」を記録したときの状態にリセットされています。

$ git status
On branch master
nothing to commit, working directory clean
 
$ cat numbers.txt
one
two
three

 「git reset」コマンドと「--hard」オプションを使用して直前のコミットを破棄する操作はこれで完了です。

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

 本稿では「git reset」コマンドを使用して作業の「やり直し」や「取り消し」を行う方法を解説しました。

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

  • git reset --soft {コミット}:指定したコミットまでHEADを移動する
  • git reset (--mixed) {コミット}:「git reset --soft」を行ったときの動作に加え、ステージングエリアを指定コミット時の状態と一致させる
  • git reset --hard {コミット}:「git reset (--mixed)」を行ったときの動作に加え、作業ディレクトリを指定コミット時の状態と一致させる
  • git {任意のコマンド名} -h:指定したコマンドの使い方を表示する

 本稿で紹介した「git reset」コマンドの使い方は一部に過ぎません。ぜひ、機会がありましたら他の使い方も試してみてください。

 次回はGitHubを使い始めるための環境構築の手順を解説する予定です。お楽しみに!

参考書籍

  • 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|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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