I'm writing a script which automatically finds a specific commit.
I've reached the part when I'm calling git bisect start --no-checkout
and git bisect run ./my_check_commit_script.sh
. It finds and displays the correct commit. However, I don't know how can I get the hash of this commit in my script.
The reference BISECT_HEAD
seems to still point at the previous old
revision.
Other than that, using git show-ref
, I've found a ref refs/bisect/new
which seems to point to the correct commit but I don't know if I can rely on it existing. There is a bunch of refs/bisect/old*
and I suspect it may be an accident that there is only a single refs/bisect/new
.
How can I get the hash of the commit found by git bisect
in my script?
Here is a script that crates a repository and successfully calls git bisect run
on it:
git init repo
cd repo
echo a >foo
git add foo
git commit -m "Initial commit"
echo b >foo
git commit -a -m "Some commit"
echo c >foo
git commit -a -m "First commit which matches criteria"
echo d >foo
git commit -a -m "Some commit"
echo e >foo
git commit -a -m "Last commit"
git bisect start --no-checkout
git bisect old HEAD~4
git bisect new HEAD
git bisect run git merge-base --is-ancestor BISECT_HEAD HEAD~3
CodePudding user response:
The reference refs/bisect/new
that you've found is the correct one to use. The command rev-parse bisect/new
guarantees to always return the hash of the first "new" commit.
The Git manual tells that in the section "Basic bisect commands: start, bad, good" (emphasis mine):
Eventually there will be no more revisions left to inspect, and the command will print out a description of the first bad commit. The reference refs/bisect/bad will be left pointing at that commit.
The manual calls it refs/bisect/bad
but because you're using old
& new
instead of good
& bad
, the reference name also changes.
(Using options --term-good
and --term-bad
you can change this name to anything you want.)