Gitを使いこなそう!【リバート編】

Git

こんにちは、ECF Tech
ブログ担当 Michiharu.Tです。

Gitシリーズも記念すべき10回目を迎えました(^ ^)。

今回は「リバート編」です。簡単にいうと、「コミットを取り消す」考え方です

それでは、さっそく行きましょう。

対象読者

  • gitの基本的なコマンドを知っている方( init, add, commit, pushなど)
  • gitをもう少しつっこんで学びたい方

本記事は、Gitシリーズ連載記事の1つとなっています。もし最初からご覧になりたい方は下のリンクをご活用ください。

Git
Gitの事を、学んで試せるページとなっています。初めてGitを利用される方に最適です。ぜひご活用ください。

ハンズオン

それではハンズオン(実際に動作させながら学ぶ)をしながら、どのような動きを見ていきましょう。

まずは適当なフォルダでgit initコマンドを実行しましょう。いつものように本記事ではC:\work01のフォルダ内で作業を行ないます。

C:\work01>git init
Initialized empty Git repository in C:/work01/.git/

新規ファイルtext01.txtを作成し、次の内容とします。

プログラムA

git addgit commitを行ないます。

C:\work01>git add .

C:\work01>git commit -m "プログラムAを作成"
[master (root-commit) ae9179e] プログラムAを作成
 1 file changed, 1 insertion(+)
 create mode 100644 note01.txt

引き続きtext01.txtを編集し、プログラムBを追加します。このプログラムは誤ったプログラムと仮定しましょう。

プログラムA
誤ったプログラムB

プログラムの誤りに気付かず、下のようにコミットまでしてしまったとしましょう。

C:\work01>git add .

C:\work01>git commit -m "プログラムBを作成したつもり"
[master c78d83e] プログラムBを作成したつもり
 1 file changed, 2 insertions(+), 1 deletion(-)

C:\work01>

このコミットを「無かったことにしたい!」という時に使うコマンドがgit revertです(revert:元に戻す、逆戻りなどの意)。

やってみましょう。まずはgit logコマンドで誤ったコミットを探します。

C:\work01>git log
commit c78d83e7ba7d0f504b0dd63752efb8455c656dcd (HEAD -> master)
Author: michiT 
Date:   Thu Nov 14 08:12:17 2019 +0900

    プログラムBを作成したつもり

commit ae9179ee2f470f5cb7325c0e1825a90e41530c82
Author: michiT 
Date:   Thu Nov 14 08:08:57 2019 +0900

    プログラムAを作成

右端に(HEAD -> master)がついている最新のコミットが誤りを含むコミットです。このコミットのID(c78d83e7から始まる文字列)をコピーしておきます。

つぎにgit revertコマンドを実行します。

git revert c78d83e7ba7d0f504b0dd63752efb8455c656dcd

するとコミットメッセージを入力するためのエディタが起動します(本記事の環境ではVisual Studio Codeが紐づけられています)。赤囲みの部分がコミットメッセージになります。特に変更せず、そのままエディタを閉じます。

C:\work01>git revert c78d83e7ba7d0f504b0dd63752efb8455c656dcd
hint: Waiting for your editor to close the file...
 [main 2019-11-13T23:30:26.319Z] update#setState idle
[main 2019-11-13T23:30:56.329Z] update#setState checking for updates
[main 2019-11-13T23:30:56.569Z] update#setState downloading
[main 2019-11-13T23:32:16.873Z] update#setState updating
[main 2019-11-13T23:32:38.154Z] update#setState ready
[master 7a00359] Revert "プログラムBを作成したつもり"
 1 file changed, 1 insertion(+), 2 deletions(-)

C:\work01>

コンソールに色々メッセージが出ていますが、最後にコミットされていることが確認できます。

この状態で再度git logコマンドを実行して確認します。

C:\work01>git log
commit 7a003598e5591eff860c44cbce8d103552f6c2cd (HEAD -> master)
Author: michiT 
Date:   Thu Nov 14 08:30:25 2019 +0900

    Revert "プログラムBを作成したつもり"

    This reverts commit c78d83e7ba7d0f504b0dd63752efb8455c656dcd.

commit c78d83e7ba7d0f504b0dd63752efb8455c656dcd
Author: michiT 
Date:   Thu Nov 14 08:12:17 2019 +0900

    プログラムBを作成したつもり

commit ae9179ee2f470f5cb7325c0e1825a90e41530c82
Author: michiT 
Date:   Thu Nov 14 08:08:57 2019 +0900

    プログラムAを作成

C:\work01>

ここで注目してほしいのは3つ目のコミットが作成されていることです。

git revertコマンドで行われることはコミットを削除することではなく、指定したコミットを打ち消す新たなコミットを作ることなのです。

実際にnote01.txtのファイルを見てみると

プログラムA

に戻っていることがわかります。

特定コミットの打ち消し

次に特定のコミットを打ち消す例をみてみましょう。フォルダが空の状態から、次のように作業を行ないます。

C:\work01>git init
Initialized empty Git repository in C:/work01/.git/

次の内容のnote01.txtを作成します。

プログラム1

コミットします。

C:\work01>git add .

C:\work01>git commit -m "プログラム1"
[master (root-commit) 618153a] プログラム01
 1 file changed, 1 insertion(+)
 create mode 100644 note01.txt

次の内容のnote02.txtを作成します。

プログラム2

コミットします。

C:\work01>git add .

C:\work01>git commit -m "プログラム2"
[master d9171ea] プログラム2
 1 file changed, 1 insertion(+)
 create mode 100644 note02.txt

次の内容のnote03.txtを作成します。

プログラム3

コミットします。

C:\work01>git add .

C:\work01>git commit -m "プログラム3"
[master 34648bf] プログラム3
 1 file changed, 1 insertion(+)
 create mode 100644 note03.txt

ログを確認します。

C:\work01>git log
commit 34648bf0ff8b4cfb637821efd7bf3399cc9f2b2e (HEAD -> master)
Author: michiT 
Date:   Fri Nov 15 08:05:04 2019 +0900

    プログラム3

commit d9171ea051def2c196ef3f78612831eb96d4cc5f
Author: michiT 
Date:   Fri Nov 15 08:04:48 2019 +0900

    プログラム2

commit 618153a700a87c5d23999e1516c62fc13d74549f
Author: michiT 
Date:   Fri Nov 15 08:04:21 2019 +0900

    プログラム1

この状態から、プログラム2のコミットをなかったことにするコミットを作成します。

C:\work01>git revert d9171ea

上のコマンドでは、コミットIDを省略して入力しています。7ケタ程度でgitが判別できます。判別できない場合は単にエラーになります。

すると、gitに関連付けられているエディタが開きます。下の図の赤枠部分がコミットコメントとして残る部分になります。必要に応じて修正しますが、今回はそのままエディタを閉じます。

メッセージが色々出るかもしれませんが、最終的には次のようなメッセージでコミットが完了します。

[master 497c33b] Revert "プログラム2"
 1 file changed, 1 deletion(-)
 delete mode 100644 note02.txt

C:\work01>

この時点でフォルダ内を確認します。Windows標準のdirコマンドを入力します。

C:\work01>dir
 ドライブ C のボリューム ラベルは OS です
 ボリューム シリアル番号は 6063-1083 です

 C:\work01 のディレクトリ

2019/11/15  08:14              .
2019/11/15  08:14              ..
2019/11/15  08:04                16 note01.txt
2019/11/15  08:04                16 note03.txt

note02.txtだけが削除されているのがわかります。

ここで注目しておきたいのは、プログラム2の後に作成されたプログラム3のコミットはそのまま残っているという事です。revertは、その時点まで戻すという処理ではないのでご注意ください。

プログラム2のコミットだけを打ち消す。のではなく、プログラム2の時点まで戻すような操作をrevertで実現したい場合は、次のようにrevertコマンドを新しいコミットから順に適用していくことになります。

git revert34648bf
git revert d9171ea

おわりに

本日はここまでとさせていただきます。最後までご覧くださりありがとうございました。知れば知るほど奥が深いGitの世界ですが、実験する環境を整えるのはいたって簡単です。ぜひ、手を動かしながら学んでいきましょう。


合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。

https://edu.e3factory.com/
タイトルとURLをコピーしました