git 删除错误的提交
当您处理一个大型项目时,您可能会发现代码中的错误,这些错误会阻止您继续进行进一步的开发。 如何解决?
您可以通过手动查看提交历史开始,但这最终将是一个非常繁琐的过程。 值得庆幸的是,Git有多种工具可以在发生问题时帮助您寻找错误或罪魁祸首。
吉特·布拉姆
$ git blame <file_path/file_name>
`git blame`
命令可以帮助您找到创建了特定代码行的提交,该提交导致项目的特定文件中存在错误。 它还确定了提交的作者,从而更容易要求有关代码的更多信息。
您可以使用-L选项来限制行输出范围。
$ git blame -L11 , 21 new_file
^ 95 d69a196b5c7 (Jhon Smith 2018 -05 -18 13 : 04 : 22 + 0200 11 ) def new
^ 95 d69a196b5c7 (Jhon Smith 2018 -05 -18 13 : 04 : 22 + 0200 12 ) @article = Article.new
^ 95 d69a196b5c7 (Jhon Smith 2018 -05 -18 13 : 04 : 22 + 0200 13 ) end
3171 aa2dbbce7 (David Smith 2018 -05 -16 18 : 21 : 30 + 0200 14 ) def edit
3171 aa2dbbce7 (David Smith 2018 -05 -16 18 : 21 : 30 + 0200 15 ) @article = Article.find(params[:id])
3171 aa2dbbce7 (David Smith 2018 -05 -16 18 : 21 : 30 + 0200 16 ) end
^ 95 d69a196b5c7 (Jhon Smith 2018 -05 -18 13 : 04 : 22 + 0200 17 ) def create
3171 aa2dbbce7 (David Smith 2018 -05 -16 18 : 21 : 30 + 0200 18 ) @article = Article.new(article_params)
^ 95 d69a196b5c7 (Jhon Smith 2018 -05 -18 13 : 04 : 22 + 0200 19 ) if @article.save
^ 95 d69a196b5c7 (Jhon Smith 2018 -05 -18 13 : 04 : 22 + 0200 20 ) redirect_to @article
^ 95 d69a196b5c7 (Jhon Smith 2018 -05 -18 13 : 04 : 22 + 0200 21 ) else
通过遵循提交的部分SHA-1 ,您可以轻松查看修改了特定代码行的对象,时间和方式。 注意,前缀`^`
显示了在初始提交中创建的行,此后一直保持不变。
使用`-C`选项可以确定代码片段的原始来源(如果它们是从其他地方复制而来的)。 它告诉您原始作者,并且无论以后进行什么重构都将提交。
$ git blame -L -C11 , 21 <file_path/file_name>
当您可以`git blame`
问题的根源时, `git blame`
会很有帮助。 如果您不知道如何返回工作状态怎么办? 这就是`git bisect`
起作用的地方。
Git Bisect
`git bisect`
是一个调试工具,用于通过自动二进制搜索找出哪个具体的提交在项目中引入了错误或问题。 您不知道项目中的哪个文件包含该错误。
如果您不知道发生了什么,并且自从上一个知道代码可以正常工作的状态以来进行了很多提交工作,则可能会向`git bisect`
寻求帮助。
`git bisect`
所做的是,通过使用二进制搜索对git提交树进行测试,将git提交树分为“好”, `git bisect`
提交和“不良”的提交。 根据测试的结果,Git会在最近的提交中进行导航,以识别它们,直到找到罪魁祸首。 这被称为二进制搜索算法。
如果您有多个错误,则需要对每个错误执行二进制搜索。
这是如何运作的?
1.首先,让我们从二进制搜索模式开始查找错误:
$ git bisect start
2.接下来,您需要查找所有仍在工作的提交。 为此,让我们检查提交历史以找到所需的内容:
$ git log --oneline
--oneline
选项仅显示git commit的名称。
$ git log --oneline
f11c599 Removed unnecessary lines
95d69a1 Added article tests
3171aa2 Enabled editing articles
95d69a1 Added articles
3. 标记最旧的“良好”提交SHA-1:
$ git bisect good 95d69a1
4.分配好标签后,您需要找到一个坏的提交来划分提交树,Git可以在该提交树上应用二进制搜索算法。 由于您知道最新的提交有错误,因此可以将其分配为“错误的”提交:
$ gitbisect bad f11c599
5.为搜索指定了初始指针和最终指针后,Git会引导您浏览提交历史记录并标记“良好”和“不良”提交。
6.此过程将继续进行,直到您成功找到第一个“不良”提交(问题原因)为止。 现在,您可以执行以下命令退出git二进制搜索模式:
$ git bisect reset
吉特·格莱普
$ git grep <keyword>
git grep` 命令使您可以在源代码的任何文件中高效,快速地在项目中搜索字符串或正则表达式。 避免搜索`.gitignore`
文件。
GREP代表对于G叶形řegularËXPRESSION P RINT。
附加选项:
-
`-n`
或`--line-number`
:打印出Git找到匹配项的行号。 -
`-i`
或`--ignore-case`
:忽略搜索到的关键字和文件之间的大小写差异。 -
`-c`
或`--count`
:显示在文件中找到的匹配关键字的匹配数。 -
`-p`
或`--show-function`
:显示搜索到的关键字的上下文。 -
`--and`
:确保同一行文本中有多个匹配项。
摘要
如果您知道错误代码位于何处, `git blame`
是一个很棒的工具。 另一方面,如果您的存储库非常大,具有巨大的提交历史,这使得很难发现错误, `git bisect`
可以使用`git bisect`
。 或者您可以使用`git grep`,
轻松地在项目中搜索字符串或正则表达式`git grep`,
三种具有三种不同方式的调试工具以其独特的方式来解决问题。 到目前为止,您遇到了哪一个? 分享您的经验!
错误,故障和编码问题,我们知道如何解决所有问题! 订阅并学习我们的特殊技术。
先前发布在https://kolosek.com/debugging-with-git/
git 删除错误的提交