Tips

EclipseでGitを使う(8)プッシュをリセット(revert)する。
2015.10.10

EclipseでGitを使う(8)プッシュをリセット(revert)する。

EclipseでGitを使う(8)プッシュをリセットする。

0.はじめに

EclipseでGitを使う方法を説明していくシリーズの第8回。今回はリモートリポジトリへプッシュしてしまったコミットを取り消す(元の状態に戻す)方法について説明します。gitコマンドでは「revert」を使用することになりますが、果たしてEclipseではどのような操作になるのでしょうか。実際に試していきましょう。

1.取消し用のコミット&プッシュを行う

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

≪Sample8.java 最初のソース≫

public class Sample8 {
	public static void main(String[] args) {
		System.out.println("Sample8 Initial.");
	}
}

作成できたらコミット&プッシュしておきましょう。

≪Sample8.java 2回目(間違ってしまった用)のソース≫

public class Sample8 {
	public static void main(String[] args) {
		System.out.println("Sample8 Initial.");
		System.out.println("Sample8 Modify (Mistake!)."); //←この行を追加
	}
}

修正ができたら、こちらもコミット&プッシュをしておきましょう。
Gitヒストリーは以下のようになります。
git8-1
※今回と関係ない部分は非表示にしています。

リモートリポジトリのブランチにあたる「origin/master」も「master」と同じ位置を指していますので、プッシュされてしまっている状態であることが分かります。それでは、この間違えたプッシュを元に戻していきましょう。

2.Revertする

プッシュを元に戻す時の考え方には、大きく2つあります。

  • そもそもプッシュをなかったことにする
  • プッシュ内容を打ち消すコミットを生成し、それを再プッシュする

今回は2つ目を使用します。基本的に間違いもヒストリに遺しておいた方がいいと思いますし、視覚的にも分かりやすいですからね。この作業はgitコマンドでは「revert」と言いますが、Eclipseを使用する場合は、元に戻したいコミットをヒストリーで右クリックし、「コミットを戻す」を選択します。
git8-3

そうすると、以下のようなヒストリが出来上がります。
git8-2

「Revert “[Mod] Sample8 Modify (Mistake!).”」と命名されていますね。これが「Revert」コミットです。
「master」がこのヒストリには付いていますので、Javaパースペクティブに移動し、ソースコードを見てみると、

public class Sample8 {
	public static void main(String[] args) {
		System.out.println("Sample8 Initial.");
	}
}

修正前の状態に戻っていることが分かります。

3.再プッシュする

このRevertコミットを再プッシュしてあげれば、リモートリポジトリに修正前の状態が反映できますね。それではプッシュをしてみましょう。
git8-4
「origin/master」がRevertコミットにつきました。これでリモートリポジトリが修正前の状態に戻りました。

4.複数コミット手前にrevertする

最後に、1つ確認しておきましょう。複数回誤ってコミットしてしまったときに、それを間違える手前まで一気にrevertできるでしょうか。試しに、以下のような2つの修正を加え、コミット&プッシュを行ってみます。

public class Sample8 {
	public static void main(String[] args) {
		System.out.println("Sample8 Initial.");
		System.out.println("Sample8 Modify (Mistake 1st !). "); //←この行を追加
	}
}

ここで一旦コミット&プッシュを行いましょう。

public class Sample8 {
	public static void main(String[] args) {
		System.out.println("Sample8 Initial.");
		System.out.println("Sample8 Modify (Mistake 1st !). ");
		System.out.println("Sample8 Modify (Mistake 2nd !). "); //←この行を追加
	}
}

もう一度コミット&プッシュを行いましょう。
以下のようなヒストリーにしておきます。
git8-5

この状態で「[Mod] Sample8 Modify (Mistake 1st !).」で「コミットを戻す」を実行してみます。
Gitリポジトリ的には表示が変わらないので分かりずらいのですが、以下のような競合が発生します。

public class Sample8 {
	public static void main(String[] args) {
		System.out.println("Sample8 Initial.");
<<<<<<< master
		System.out.println("Sample8 Modify (Mistake 1st !). ");
		System.out.println("Sample8 Modify (Mistake 2nd !). ");
=======
>>>>>>> ab5bd15 [Mod] Sample8 Modify (Mistake 1st !).
	}
}

一気に戻すことはできないというわけです。

そのような場合は、コミットの逆順に1つずつ戻していきます。
上記の場合は(競合が発生している状態を直してから)、まず「Sample8 Modify (Mistake 2nd !).」を戻し、次に「Sample8 Modify (Mistake 1st !).」を戻せば最初の状態に戻ってくれます。
git8-6
これで元に戻りましたね。再プッシュすれば間違える前の状態がリモートリポジトリに反映されます。

5.まとめ

さて、今回はリモートリポジトリに間違ってプッシュをしてしまった内容を取り消す(打ち消す)方法について見てきました。
複数人で操作している場合は、別の人のコミットをrevertする必要がでてくる可能性もあるので、そのような場合は一応、その人に伝えておくようにしておくと、スムーズでしょう。

Eclipseで始めよう、JAVAプログラミング

はじめてのJAVA 連載

Recent News

Recent Tips

Tag Search