代码之家  ›  专栏  ›  技术社区  ›  heymatthew

为什么“git-bisect”分支不知道?

  •  18
  • heymatthew  · 技术社区  · 15 年前

    我试图找到一个bug的来源,这个bug是在一个名为 特征-x

    不过有个窃听器。我发现了我的脚本中不期望的行为,到目前为止,这些脚本可能已经在任何提交中引入,特别是因为master的特性在feature-x中被大量使用,但在master本身中使用较少。

    我相信这是因为平分把你拉到一个无头的状态,但在这种情况下,我真的想在这另一个历史/变化的背景下,而不是漂浮在乙醚中。

    你做错了

    我将通过创建一个示例回购来演示这一点:

    git init
    
    echo 'sub f { print $_; }' > main.pl
    git add .
    git commit -a -m "inital commit"
    
    git branch feature-x
    git checkout feature-x
    echo 'main::f(1)' > dependent.pl
    git add .
    git commit -a -m "Starting work on feature X"
    git tag dev-1.0
    
    git checkout master
    echo "sub f { return 1; }" > main.pl
    git commit -a -m "sub f { return 1; }"
    echo "sub f { return 2; }" > main.pl
    git commit -a -m "sub f { return 2; }"
    echo "sub f { return 3; }" > main.pl
    git commit -a -m "sub f { return 3; }"
    
    git tag release-1.0
    
    git checkout feature-x
    git merge master
    
    echo 'print main::f();' > dependent.pl
    git commit -a -m "Updating call to f"
    

    所以现在你得到了这样的回购:

    o Updating call to f ( Head of branch 'feature-x' )
    o Merge branch master onto feature-x
    |\
    | o sub f { return 3; } (TAG release-1.0) ( Head of branch 'master' )
    | o sub f { return 2; }
    | o sub f { return 1; }
    o | Starting work on feature X ( TAG 'dev-1.0' )
     \|
      o initial commit
    

    git bisect start feature-x dev-1.0 希望我能找到是什么破坏了我的代码从属.pl,我在提交'sub f{return 2}'时结束,没有feature-x的更改历史记录(即,如果我运行 ls

    这使我处于一种不稳定的状态。我不知道当前的提交是否破坏了我的工作,我也不能说主上的提交破坏了它,所以我不能说这个提交是好是坏。

    1 回复  |  直到 9 年前
        1
  •  30
  •   Cascabel    15 年前

    分支感知。当您告诉它“dependent”是好的,“test”是坏的,并且这两者之间的一个变化是合并提交时,它知道为了找出问题是在哪里引入的,它必须查看提交a、b和c—否则,它只能告诉您在合并提交时它是否被破坏。

    git bisect 只允许您测试提交!为了测试该内容,您必须进行一系列的测试合并-签出b,合并相关,让您测试,然后签出a或c,合并相关,让您再次测试。你很容易做到 git merge --no-commit dependent 一旦它把你留在b组,那就去做 git reset --hard 运行前完成测试时 git bisect good/bad .

    任何 在合并分支上进行提交,并且只测试合并提交本身(您不关心是哪个a、b或c破坏了它),只需告诉它合并分支上的一切都是好的。如果你知道a,b,c与之无关就更好了。那你不用测试就知道他们很好!

    但是有一件事你不能期望git完全忽略提交a、b和c。它完全没有办法知道它们的更改是否与你的“bug”相关,它们的更改是你的好的和坏的提交之间区别的一部分。