如何查找和恢复“重写”git提交?

时间:2015-06-03 10:39:56

标签: git

出于某种原因,我有git repo,其代码提交被重写为之前的状态。 像这样:

  • 初始代码是“Hello world!”它是在回购中承诺的;
  • 有一天它变成了“Bye-bye world!”它是在回购中承诺的;
  • 在某天后,此代码在HDD上恢复到其初始状态 (“你好世界!”)并在回购中承诺。

我需要以某种方式找到这样的提交。它可以不是顺序提交,而是将代码“重写”到其先前状态的提交。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

您可以使用 git bisect

  

<强> GIT-平分
    通过二进制搜索查找引入错误的更改

gitbisect是一个搜索和资助代码更改的工具。使用起来非常简单,而且非常强大。

bisect如何运作?

Bisect只需查看历史记录日志并执行二分查找。

  

二进制搜索或半间隔搜索算法在按键值排序的数组中查找指定输入值(搜索&#34;键&#34;)的位置。

有关Binary search

的更多信息

Git bisect样本

// Start the bisect operation
git bisect start 

// mark the current as bad or good depends on the content of your given
// file. In your case since you want to find the commit who modified your
// code to "Hello world!" lets assume the current file is the bad state
git bisect bad 

// Assume 100 commits ago it was before your change (or give a sha if you
// know where its was ok last time
git bisect good HEAD~100

// Now git will split the history and start looping over it.
... do your tests and decide if its good or bad (check the file content)

如何自动化bisect

添加允许您自动搜索的run标记 运行获取一个正在每次结账提交时执行的脚本。

git bisect run my_script arguments

Bisect运行退出代码:

  

请注意,如果当前源代码良好,并以1到127(含)之间的代码退出,脚本(上例中的my_script)应该以代码0退出,除非125,如果是当前源代码代码很糟糕。

     

任何其他退出代码都会中止bisect进程。

     

应该注意的是,一个程序终止于&#34;退出(-1)&#34;离开$? = 255,(参见exit(3)手册页),因为该值被&#34;&amp; 0377&#34;

     

当无法测试当前源代码时,应使用特殊退出代码125. 如果脚本以此代码退出,则将跳过当前修订