Skip to content

Commit 8c42386

Browse files
authored
Merge pull request #31018 from gottesmm/pr-d6426d88ab60dd2b653c227ec20517db745d6131
[doc] Describe how to use git-bisect in the presence of branch forwarding/feature branches.
2 parents bd7eb1c + a3657e1 commit 8c42386

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

docs/DebuggingTheCompiler.rst

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,3 +694,65 @@ Multiple Logs at a Time
694694
Note, you can also turn on more than one log at a time as well, e.x.::
695695

696696
(lldb) log enable -f /tmp/lldb-types-log.txt lldb types expression
697+
698+
Using git-bisect in the presence of branch forwarding/feature branches
699+
======================================================================
700+
701+
``git-bisect`` is a useful tool for finding where a regression was
702+
introduced. Sadly ``git-bisect`` does not handle long lived branches
703+
and will in fact choose commits from upstream branches that may be
704+
missing important content from the downstream branch. As an example,
705+
consider a situation where one has the following straw man commit flow
706+
graph::
707+
708+
github/master -> github/tensorflow
709+
710+
In this case if one attempts to use ``git-bisect`` on
711+
github/tensorflow, ``git-bisect`` will sometimes choose commits from
712+
github/master resulting in one being unable to compile/test specific
713+
tensorflow code that has not been upstreamed yet. Even worse, what if
714+
we are trying to bisect in between two that were branched from
715+
github/tensorflow and have had subsequent commits cherry-picked on
716+
top. Without any loss of generality, lets call those two tags
717+
``tag-tensorflow-bad`` and ``tag-tensorflow-good``. Since both of
718+
these tags have had commits cherry-picked on top, they are technically
719+
not even on the github/tensorflow branch, but rather in a certain
720+
sense are a tag of a feature branch from master/tensorflow. So,
721+
``git-bisect`` doesn't even have a clear history to bisect on in
722+
multiple ways.
723+
724+
With those constraints in mind, we can bisect! We just need to be
725+
careful how we do it. Lets assume that we have a test script called
726+
``test.sh`` that indicates error by the error code. With that in hand,
727+
we need to compute the least common ancestor of the good/bad
728+
commits. This is traditionally called the "merge base" of the
729+
commits. We can compute this as so::
730+
731+
TAG_MERGE_BASE=$(git merge-base tags/tag-tensorflow-bad tags/tag-tensorflow-good)
732+
733+
Given that both tags were taken from the feature branch, the reader
734+
can prove to themselves that this commit is guaranteed to be on
735+
``github/tensorflow`` and not ``github/master`` since all commits from
736+
``github/master`` are forwarded using git merges.
737+
738+
Then lets assume that we checked out ``$TAG_MERGE_BASE`` and then ran
739+
``test.sh`` and did not hit any error. Ok, we can not bisect. Sadly,
740+
as mentioned above if we run git-bisect in between ``$TAG_MERGE_BASE``
741+
and ``tags/tag-tensorflow-bad``, ``git-bisect`` will sometimes choose
742+
commits from ``github/master`` which would cause ``test.sh`` to fail
743+
if we are testing tensorflow specific code! To work around this
744+
problem, we need to start our bisect and then tell ``git-bisect`` to
745+
ignore those commits by using the skip sub command::
746+
747+
git bisect start tags/tag-tensorflow-bad $TAG_MERGE_BASE
748+
for rev in $(git rev-list $TAG_MERGE_BASE..tags/tag-tensorflow-bad --merges --first-parent); do
749+
git rev-list $rev^2 --not $rev^
750+
done | xargs git bisect skip
751+
752+
Once this has been done, one uses ``git-bisect`` normally. One thing
753+
to be aware of is that ``git-bisect`` will return a good/bad commits
754+
on the feature branch and if one of those commits is a merge from the
755+
upstream branch, one will need to analyze the range of commits from
756+
upstream for the bad commit afterwards. The commit range in the merge
757+
should be relatively small though compared with the large git history
758+
one just bisected.

0 commit comments

Comments
 (0)