Gitを使った分散開発管理5 – revert&resetで履歴管理

2011.07.14

小さな修正

今回も履歴に関するいろいろな操作を行ってみましょう。
その前に、前回コミットの訂正を行ってみましたが、わざわざメッセージに理由を添えてコミットをし直すまでもない修正も数多くあると思います。
そういった修正を行う場合に簡単な方法があります。 まずは、hello.htmlにGItホームへのリンクを追加します。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Hello Git!</title>
</head>
<body>
  <h2 id="toc-hello-git">Hello Git!</h2>
  <a href="http://git-scm.com/">Git Home</a>
</body>
</html>

そのファイルをコミットしましょう。

$ git commit -a -m "add Git Home Link"
[master 53326bd] add Git Home Link
 1 files changed, 1 insertions(+), 0 deletions(-)

しかし、コミットした後にリンクにピリオドがないことに気づきました。 これだけのために修正コミットをするのは無駄なので、訂正コミットを行います。

$ git commit -C HEAD -a --amend
[master 1346355] add Git Home Link
 1 files changed, 1 insertions(+), 0 deletions(-)

--amend オプションをつけると、直前におこなったコミットの訂正を行うことができます。
また、-Cは指定したコミットのログメッセージを使うためのオプションです。ここではHEAD、すなわち直近のコミットを指定しています。

$ git log
commit 13463552702378babbff4cd2d13c35d153936730
Author: syuta <nakamura.shuta@gmail.com>
Date:   Thu Jul 14 18:53:11 2011 +0900

    add Git Home Link
・・・・・・・・・

git logでコミットログを確認すると、コミットのハッシュは変わっていますが、それ以外は変わっていないことがわかります。

revert指定のいろいろ

前回revertを使用したときは、HEAD(直近のコミット)を指定しました。git revertは、HEADでなくてもコミット名を指定すればそのコミットを取り消すことができます。
しかし、途中のコミットをなかったことにしてしまうと、プログラムの整合性がとれなくなる可能性があるため、極力直近のものから順番に巻き戻すようにしてください。
また 、HEADの後ろに^を1つ付けると1つ前のコミット、HEAD^^とすると、2つ前のコミットの指定になります。
最後にもう一度言っておきますが、revertは取消したコミット以降のコミットには影響を及ぼしません。
コミット名指定をしてrevertを行う場合は十分注意してください。

resetについて

以前、ステージングを解除するにはgit resetを使用すると解説しました。それ以外にもgit resetにはいろいろな変更ができます。
git resetはオプションと組み合わせることで、

  • HEADの位置を変更する
  • インデックスを変更する(add取り消し)
  • 作業ツリーを変更する(add後の変更の取り消し)

が可能です。 例えば、

$ git reset --hard HEAD

とすれば、直近コミットからおこなったaddや作業ツリーでの変更を取り消し、コミット直後の状態に戻します。
しっかり使いかたをおぼえれば、自由にリポジトリを操作することができます。
次回はresetについてもう少し詳細を解説する予定です。