🐈

SadServers解説#10 "Gitega": Find the Bad Git Commit

2024/09/07に公開

https://ja.wikipedia.org/wiki/ギテガ

問題概要

シナリオ

失敗したGitコミットを見つける

問題詳細

/home/admin/gitディレクトリには、Golangプログラムとそのテストを含むGitリポジトリがあります。

このgitディレクトリからテストを実行するには、go testコマンドを実行します。現在のHEAD(最後のコミット)はテストに失敗します。最初のコミットはテストに合格していたと仮定してください。

解決判定

最初にテストを壊したコミットの(長いハッシュの)IDを見つけ、それを/home/admin/solutionファイルに入力し、Check My Solutionボタンをクリックしてください。例えば、解答が"9e80a7eb1b09385e93ab4a76cb2c93beec48fd9f"であれば、次のようなコマンドを実行し、Check My Solutionボタンをクリックしてください。

$ echo 9e80a7eb1b09385e93ab4a76cb2c93beec48fd9f > /home/admin/solution

 

問題解決の方針

【表示する】

失敗したコミットを探すために、Gitのバイセクトモードを使用します。

 

ヒント

一部、SadServers公式のヒントを改変しています。

ヒント1

まずは、問題にあるように、go testコマンドも実行してみましょう。
Gitのコミット履歴も確認します。

実行コマンド
$ cd git
$ ls -l
total 12
-rw-r--r-- 1 admin admin  45 Jun  3 01:19 go.mod
-rw-r--r-- 1 admin admin 226 Jun  3 01:19 main.go
-rw-r--r-- 1 admin admin 441 Jun  3 01:19 main_test.go
$ 
$ 
$ go test
--- FAIL: TestHandler (0.00s)
    main_test.go:22: handler returned unexpected body: got Hey! /
         want Hey: /
FAIL
exit status 1
FAIL    github.com/fduran/git_bisect    0.003s
$
$
$ git log
commit f2e018e090afa14f0961bb221d6a6e1b506afb3e (HEAD -> main, origin/main, origin/HEAD)
Author: fduran <duran.fernando@gmail.com>
Date:   Sun Jun 2 21:15:29 2024 -0400

    README.md

commit 47995fcd96cd2c2ac6466d329110fbcf24d5f8e2
Author: fduran <duran.fernando@gmail.com>
Date:   Sun Jun 2 20:41:42 2024 -0400

    README

commit c21bcc402cf8e1344b81892ba539602964b4ad56
Author: fduran <duran.fernando@gmail.com>
Date:   Sun Jun 2 20:15:15 2024 -0400

    module name

commit 3657dadcc4a7278cb46e45fa549d4873555ad589
Author: fduran <duran.fernando@gmail.com>
Date:   Sun Jun 2 19:56:31 2024 -0400

    6th

commit 96086c854e4284bfd7d02b46accee1e21f7c93ca
Author: fduran <duran.fernando@gmail.com>
Date:   Sun Jun 2 19:46:40 2024 -0400

    5th

commit 2e44089778e44dcd9b97aa3baacdcff10311841b
Author: fduran <duran.fernando@gmail.com>
Date:   Sun Jun 2 19:46:07 2024 -0400

    4th

commit 51793999aa179ce76927e6461be31cfd1a89d8c9
Author: fduran <duran.fernando@gmail.com>
Date:   Sun Jun 2 19:45:23 2024 -0400

    third

commit 641eadeeefcd0896ea30a3565aa55dc8523426b6
Author: fduran <duran.fernando@gmail.com>
Date:   Sun Jun 2 19:43:28 2024 -0400

    second

commit 9e80a7eb1b09385e93ab4a76cb2c93beec48fd9f
Author: fduran <duran.fernando@gmail.com>
Date:   Sun Jun 2 19:42:00 2024 -0400

    first

やはり、最後のコミットは失敗してしまっていますね…
また、コミットの履歴も確認することができました。

ヒント2

Gitのバイセクトモードを使用して、問題を引き起こしたコミットを探しましょう。

実行コマンド1
$ git bisect start
$
$ git bisect bad HEAD
$
$ git bisect good 9e80a7eb1b09385e93ab4a76cb2c93beec48fd9f
Bisecting: 3 revisions left to test after this (roughly 2 steps)
[96086c854e4284bfd7d02b46accee1e21f7c93ca] 5th

git bisect start

Gitのバイセクトモードを起動します。

git bisect bad HEAD

失敗しているコミットを指定します。今回は、最新のHEADがコミットに失敗しているので、badとマークします。

git bisect good 9e80a7eb1b09385e93ab4a76cb2c93beec48fd9f

成功したコミットを指定します。今回は、最初のコミットを指定しています。

実行コマンド2
$ git bisect run go test
running go test
--- FAIL: TestHandler (0.00s)
    main_test.go:22: handler returned unexpected body: got Hey! /
         want Hey: /
FAIL
exit status 1
FAIL    myproject       0.003s
Bisecting: 1 revision left to test after this (roughly 1 step)
[51793999aa179ce76927e6461be31cfd1a89d8c9] third
running go test
Request: /
PASS
ok      myproject       0.003s
Bisecting: 0 revisions left to test after this (roughly 0 steps)
[2e44089778e44dcd9b97aa3baacdcff10311841b] 4th
running go test
Request: /
--- FAIL: TestHandler (0.00s)
    main_test.go:22: handler returned unexpected body: got Hey! /
         want Hey: /
FAIL
exit status 1
FAIL    myproject       0.003s
2e44089778e44dcd9b97aa3baacdcff10311841b is the first bad commit
commit 2e44089778e44dcd9b97aa3baacdcff10311841b
Author: fduran <duran.fernando@gmail.com>
Date:   Sun Jun 2 19:46:07 2024 -0400

    4th

 main.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

git bisect run go test

失敗したコミットを自動的に特定するコマンドです。

以下の部分に注目してみましょう。

2e44089778e44dcd9b97aa3baacdcff10311841b is the first bad commit

どうやら、4度目のコミットが失敗していたようです。
バイセクトモードを終了し、リポジトリをもとに戻してから、答えを書き込みましょう。

$ git bisect reset
Previous HEAD position was 2e44089 4th
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
$
$ echo 2e44089778e44dcd9b97aa3baacdcff10311841b > /home/admin/solution

 

問題一覧はこちら

https://zenn.dev/comf_nakamura/articles/sadservers_sitemap

Discussion