EclipseでGitを使う(7)コミットをリセットする。

この記事は2015年10月4日に書かれたものです。内容が古い可能性がありますのでご注意ください。


EclipseでGitを使う(7)コミットをリセットする。

0.はじめに

EclipseでGitを使う方法を説明していくシリーズの第7回。今回はコミットを行った後、そのコミット以前の状態に戻す方法について説明します。コミットを戻す際には「リセット」を使用します。それでは実際に試していきましょう。

1.リセットする用のコミットを用意する

まずはリセットする用にファイルに修正を加え、コミットをしておきましょう。
今回は以下のようなファイルを用意しています。

≪Sample2.java 最初のコミット≫

public class Sample2 {
	public static void main(String[] args) {
		System.out.println("Try Commit Reset.");
	}
}

≪Sample2.java 2回目のコミット≫

public class Sample2 {
	public static void main(String[] args) {
		System.out.println("Try Commit Reset.");
		System.out.println("Try Commit Reset2."); //←この行を追加
	}
}

Gitヒストリーは以下のようになります。
git7-1
※今回と関係ない部分は非表示にしています。

「master」「HEAD」が、現在のコミットした状態を示しています。
それではコミットをリセットしてみましょう。最初のコミットを選択し、右クリックします。すると以下のメニューが表示されます。
git7-2-1

「リセット」を選択すると、以下のように3つの選択肢が出てきます。
git7-2-2

ソフト(Soft)
混合(Mixed)
ハード(Hard)

があるでしょうか。

それぞれのパターンでリセットのされ方が変わってきます。
それではどのような動きになるのかを見ていきましょう。

2.ソフトリセット

ではまずはソフトリセットから試してみましょう。
上記のように最初のコミットを選択し、先ほどの「ソフト」をクリックしてみましょう。

ヒストリーから2回目のコミットが非表示になりました。
2回目のコミット内容がリセットされたため、コミットの履歴を表示するヒストリーから非表示になったのです。

「Java」パースペクティブで作業ディレクトリを見てみると、「Sample2.java」に黒い「*」マークがついています。
ソース内容はどうなっているかというと、2回目のコミット内容のままです。
これはどういう意味だったかというと、ステージングにインデックスされている状態でした。
「Gitステージング」を見てみると、以下のように「Sample2.java」が「ステージされた変更」に表示されていることが分かります。
git7-3

このように、ソフトリセットはコミットした内容をステージした時点まで戻すリセットであるということが分かります。
コミットをしたけれども、少し修正し直してコミットし直したい、という時にはこの方法がよいでしょう。

例えば以下のように修正を加えた場合です。
≪Sample2.java 3回目のコミット≫

public class Sample2 {
	public static void main(String[] args) {
		System.out.println("Try Commit Reset.");
		System.out.println("Try Commit Reset2.");
		System.out.println("ソフトリセット後に再コミット"); //←この行を追加
	}
}

ヒストリーツリーは以下のようになります。
git7-4
1回目のコミットから枝分かれして、2回目のコミット、3回目のコミットができあがっています。
3回目のコミットに「master」「HEAD」が付与されています。

3.混合リセット

続いて混合リセットを試してみましょう。
最初のコミットを選択し、先ほどの「混合」をクリックしてみましょう。
すると混合は作業ディレクトリにて「*」印がSample2.javaにはついておらず「>」印が付きます。
混合リセットは、ステージングの情報までリセットするため、作業ディレクトリにて修正を行っただけという状態になるわけです。
今回も以下のように修正を加えて、再コミットしましょう。

≪Sample2.java 4回目のコミット≫

public class Sample2 {
	public static void main(String[] args) {
		System.out.println("Try Commit Reset.");
		System.out.println("Try Commit Reset2.");
		System.out.println("ソフトリセット後に再コミット");
		System.out.println("混合リセット後に再コミット");
	}
}

ヒストリーツリーには、
1回目のコミットから枝分かれして、3回目のコミット(ソフトリセット)、4回目のコミット(混合リセット)ができあがっています。
4回目のコミットに「master」「HEAD」が付与されています。
2回目のコミット(「[Mod] Sample2 Modified.」というコミットコメントのもの)が非表示になっていることに注意しましょう。
コミットのリセットを何度も同じコミット時点で行った場合、その2つ前のコミットは残らなくなってしまうということです。

4.ハードリセット

それでは最後にハードリセットを試してみましょう。
最初のコミットを選択し、先ほどの「ハード」をクリックしてみましょう。
ハードリセットは作業ディレクトリの内容まで元に戻すリセットになります。
作業ディレクトリを見てみると、一番最初の以下のソースに戻っている事が分かります。

≪Sample2.java 最初のコミット≫

public class Sample2 {
	public static void main(String[] args) {
		System.out.println("Try Commit Reset.");
	}
}

ではこのソースを以下の内容にして、コミットを行いましょう。

≪Sample2.java 5回目のコミット≫

public class Sample2 {
	public static void main(String[] args) {
		System.out.println("Try Commit Reset.");
		System.out.println("ハードリセット後に再コミット"); //←この行を追加
	}
}

ヒストリーツリーは以下のようになります。
git7-5
1回目のコミットから枝分かれして、4回目のコミット(混合リセット)、5回目のコミット(ハードリセット)ができあがっています。
5回目のコミットに「master」「HEAD」が付与されています。やはり3回目のコミット(ソフトリセット)が非表示になっていますね。

5.まとめ

さて、今回はリセットの3パターンの違いについてみてきました。この考え方は複数コミット手前でのリセットを行った場合も同じです。おそらくステージをあまり意識せずにすぐにコミットするケースが多いと思うので、混合リセットはあまり使用する機会はないかもしれません。ソフトとハードの違いはしっかりと理解できているとよいでしょう。

  • このエントリーをはてなブックマークに追加

PAGE TOP