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ヒストリーは以下のようになります。
※今回と関係ない部分は非表示にしています。
リモートリポジトリのブランチにあたる「origin/master」も「master」と同じ位置を指していますので、プッシュされてしまっている状態であることが分かります。それでは、この間違えたプッシュを元に戻していきましょう。
2.Revertする
プッシュを元に戻す時の考え方には、大きく2つあります。
- そもそもプッシュをなかったことにする
- プッシュ内容を打ち消すコミットを生成し、それを再プッシュする
今回は2つ目を使用します。基本的に間違いもヒストリに遺しておいた方がいいと思いますし、視覚的にも分かりやすいですからね。この作業はgitコマンドでは「revert」と言いますが、Eclipseを使用する場合は、元に戻したいコミットをヒストリーで右クリックし、「コミットを戻す」を選択します。
「Revert “[Mod] Sample8 Modify (Mistake!).”」と命名されていますね。これが「Revert」コミットです。
「master」がこのヒストリには付いていますので、Javaパースペクティブに移動し、ソースコードを見てみると、
public class Sample8 { public static void main(String[] args) { System.out.println("Sample8 Initial."); } }
修正前の状態に戻っていることが分かります。
3.再プッシュする
このRevertコミットを再プッシュしてあげれば、リモートリポジトリに修正前の状態が反映できますね。それではプッシュをしてみましょう。
「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 !). "); //←この行を追加 } }
もう一度コミット&プッシュを行いましょう。
以下のようなヒストリーにしておきます。
この状態で「[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 !).」を戻せば最初の状態に戻ってくれます。
これで元に戻りましたね。再プッシュすれば間違える前の状態がリモートリポジトリに反映されます。
5.まとめ
さて、今回はリモートリポジトリに間違ってプッシュをしてしまった内容を取り消す(打ち消す)方法について見てきました。
複数人で操作している場合は、別の人のコミットをrevertする必要がでてくる可能性もあるので、そのような場合は一応、その人に伝えておくようにしておくと、スムーズでしょう。