こんにちは、ECF Tech
ブログ担当 Michiharu.Tです。
Gitシリーズも記念すべき10回目を迎えました(^ ^)。
今回は「リバート編」です。簡単にいうと、「コミットを取り消す」考え方です
それでは、さっそく行きましょう。
対象読者
- gitの基本的なコマンドを知っている方( init, add, commit, pushなど)
- gitをもう少しつっこんで学びたい方
本記事は、Gitシリーズ連載記事の1つとなっています。もし最初からご覧になりたい方は下のリンクをご活用ください。
ハンズオン
それではハンズオン(実際に動作させながら学ぶ)をしながら、どのような動きを見ていきましょう。
まずは適当なフォルダでgit init
コマンドを実行しましょう。いつものように本記事ではC:\work01
のフォルダ内で作業を行ないます。
C:\work01>git init Initialized empty Git repository in C:/work01/.git/
新規ファイルtext01.txtを作成し、次の内容とします。
プログラムA
git add
とgit 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: michiTDate: 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: michiTDate: 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: michiTDate: 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 revert 34648bf git revert d9171ea
おわりに
本日はここまでとさせていただきます。最後までご覧くださりありがとうございました。知れば知るほど奥が深いGitの世界ですが、実験する環境を整えるのはいたって簡単です。ぜひ、手を動かしながら学んでいきましょう。
合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。