ハックガールズと学ぼう!ゼロから学ぶGit講座

第5回 Git操作をなかったことにする!

この記事を読むのに必要な時間:およそ 2 分

git commitを戻したい!

上司:
今追加してもらってる機能,表示文言だけ修正してくれないかな?
あなた:
それならすぐできるので,対応しますよ! sample.txtの文言を修正してgit add,これでOKだからgit commitと……
(5分後)
上司:
やっぱりさっきの修正なくて大丈夫!
あなた:

続いては,作業ディレクトリで何らかのファイルに変更を加え(新規作成でも同様⁠⁠,git add,さらにはgit commitまでしたあとに,それらの変更を元に戻すコマンドを紹介します。

git revert

git revert は,commitを打ち消すためのコマンドです。

打ち消すと言っても,revertは「コミットをなかったものとする」のではなく,特定のコミットによって加えられた「変更元に戻すためのを新しいコミットを追加する」ことにより,事実上元に戻すという動きをします。

動作を確認してみましょう。

touch sample.txt
git add sample.txt
git commit sample.txt
git revert(commit hash)

実行後にgit logでcommit履歴を見ると

commit 11baa6c0a5fdxxxxxxxxxxxxxxx
Author: hanako
Date: Tue Mar 31 16:17:13 2014 +0900

revert "READMEを最新に修正"
This reverts commit 1ebd2768edxxxxxxxxxxxxxxx.

commit 1ebd2768edxxxxxxxxxxxxxxx
Author: hanako
Date: Tue Mar 31 16:14:13 2014 +0900

READMEを最新に修正

このように「commit 1ebd2768edxxxxxxxxxxxxxxx を打ち消したcommmit」として,新規commitが追加されているのが確認できると思います。

図3 git revert

図3 git revert

illustration by Youko Watanabe

git reset

git resetは,1つ前のgit revertとは違って,⁠事実上戻す」のではなく「本当に戻す」挙動をします。

revertは「事実」を残したまま進んでいきますが,resetは「事実」自体がなくなるということなので,復元不可能になります(※リモートリポジトリにcommitが残っている時点では復元できます⁠⁠。

revertより危険な方法ですが,commit履歴が煩雑になる事を避けることができるという意味ではメリットがある方法です。

但し,複数人で共同開発している際,他の人のcommitを許可なくresetし,リモートリポジトリにまでpushしてしまうと取り返しがつかないので扱いには十分注意しましょう。

図4 git reset

図4 git reset

illustration by Youko Watanabe

git resetでも,与えるオプションで挙動が違うので注意が必要です。

git reset --soft HEAD^

HEAD^とは直前のcommitのこと。HEAD^^とすれば,さらに1つ前のcommitを指します。

--softオプションは,作業ディレクトリの内容はそのままで,コミットだけを取り消すときに使います。このコマンドを実行しても作業ディレクトリ・ステージングエリアの状態には一切影響を与えません。その代わり,git logで確認できるcommitの状態が変わります。引数にHEAD^を指定した場合は,直前のcommitがgit logで見ると消えているはずです。

git reset --hard HEAD^

作業ディレクトリの内容を取り消し,コミットも取り消すときに使います。Git管理下にあるすべてに影響を与えます。

touch sample.txt sample2.txt
git add sample.txt
git reset --hard HEAD^

この場合,git addでGit管理下に入れたsample.txtは抹消され,Git管理下にまだ入っていなかったsample2.txtには影響を与えません。それと同時に,--softでの実行時と同じように,git logで確認できるcommitの状態は,直前のcommitが消えた状態になります。

さやみんとはまーのGitトーク

さやみん:
今回は役割が異なる色々なコマンドを紹介したけど,総じて「間違えちゃった!戻さなきゃ!」となったときに活躍するコマンドだよ!
はまー:
まだ使い分けがイメージしづらいけど……使い始めで慣れていないときに,うっかり間違った操作をしてしまっても慌てなくて良いんだね。
さやみん:
そうそう! git resetとかは復元不可能で他人にも影響を与えてしまう可能性があるから,うっかり実行しないように気をつけないといけないけど,安全に対処できる方法もきちんとあるから,まずは慌てずに調べてみれば大丈夫!
はまー:
良かった! 安全に元に戻したりできる,ってわかってれば,むしろ安心して開発できるね。Gitを使っていたほうが安心,っていうのが実感できてきたよ!

著者プロフィール

堤沙也(つつみさや)

早稲田大学政治経済学部卒業。ハックガールズ・パズルガールズでの活動を経て,都内のWebサービス全般を扱う企業にてWebアプリケーションやスマートフォンアプリの設計・開発を担当。主に扱っている言語は,Ruby,Python,PHPなど。


濱ヶ崎美季(はまがさきみき)

立命館大学国際関係学部卒業後,大手外資系SIer企業に入社。ハックガールズ・パズルガールズ・クエスチョンでの活動を経て,現在は株式会社SCRAPのIT・広報担当として勤務。最近は編集部上がりの厳格な先輩(コンパイラ)の下で日本語の文法と格闘中。

Twitter:@HUMMER_Q