SadServers解説#10 "Gitega": Find the Bad Git Commit
問題概要
シナリオ
失敗した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
問題一覧はこちら
Discussion