git bisect
可用于以自动方式快速查找更改。
鉴于它develop
具有库依赖项,并且abc123
是添加库依赖项之前的提交,以下将找到添加依赖项的提交:
git bisect start
git bisect new develop
git bisect old abc123
echo "! grep -rI --include \*.gradle\* mylib ." > /tmp/bisect.sh
chmod u+x /tmp/bisect.sh
git bisect run /tmp/bisect.sh
git bisect reset
git bisect start
开始一个新的对分会话。然后,我们需要识别至少一个一旧提交和一个新提交——也就是说,一个更改前的提交(“旧”)和一个更改后的提交(“新”)。 git bisect new develop
指定develop
为“新”提交,并将git bisect old abc123
“abc123”指定为“旧”提交。(请注意,标准术语是坏/好,不是新/旧,但由于这更多的是变化而不是破损,我选择使用替代术语“旧”和“新”而不是标准术语。 )
然后,Git 将采用二进制搜索算法,大约在新旧提交的一半左右切换到提交。
输出:
Bisecting: 818 revisions left to test after this (roughly 10 steps)
[1234567890abcdef1234567890abcdef12345678] Committed some stuff
此时,您可以手动将此提交识别为旧的或新的 ( git bisect old
/ git bisect new
),并使用 Git 二进制搜索到引入更改的提交的方式。但是,我们可以通过让 Git 使用脚本检查每个潜在的提交来自动化这个过程git bisect run <scriptname.sh>
。如果脚本返回退出代码 0,则将其标识为“旧”;如果它的代码在 1 到 127 之间(125 除外),则它是“新的”。
对于这种情况,我们可以使用命令grep -rI --include \*.gradle\* mylib .
。这使用grep*.gradle*
递归查找与包含术语“mylib”的模式匹配的任何非二进制文件。这将匹配build.gradle
and build.gradle.kts
,但会跳过许多我们不关心的其他文件(从而加快进程)。
但是,grep 命令返回我们想要的相反的退出代码。它在匹配时返回成功(“旧”)响应,但我们希望它是失败(“新”)响应。该命令可以通过使用! 保留字:! grep -rI --include \*.gradle\* mylib .
.
此命令存储在/tmp/bisect.sh
脚本中并可执行:
echo "! grep -rI --include \*.gradle\* mylib ." > /tmp/bisect.sh
chmod u+x /tmp/bisect.sh
现在我们有了脚本,我们将它传递给以git bisect run
获取添加依赖项的提交:
git bisect run /tmp/bisect.sh
输出:
abcdefg1234567890abcdefg1234567890abcdef is the first new commit
commit abcdefg1234567890abcdefg1234567890abcdef
Author: John Doe <john.doe@example.com>
Date: Tue May 26 17:37:25 2020 -0400
adding a new library for fun and profit
1. add the library
2. ???
3. profit
subproject1/build.gradle | 6 +-
.../nested/subpackage/MyAwesomeClass.java | 37 -------
.../nested/subpackage/LessAwesomeClass.java | 118 +++++++++++++++++++++
.../nested/BoilerplateJunk.java | 32 ++++--
subproject1/src/main/resources/application.yaml | 12 +++
.../another/subpackage/Whatever.java | 28 +++++
6 files changed, 189 insertions(+), 44 deletions(-)
最后,我们调用git bisect reset
结束 bisect 会话并更改回我们开始 bisect 会话之前所在的分支。