假设我有 2 个标签
X
和 Y
这样
tag X log history: C1 C2 ... Cn
tag Y log history: Z1 Z2 ... Zm
如果
hash(Ci) = hash(Zj)
(对于给定的i
和j
)并且我想知道所有具有提交的标签Ci
我可以这样做,如“如何列出包含提交的所有标签?”中的回答',
git tag --contains Ci
这会给我
X
和Y
。
对于
hash(Ci) != hash(Zj)
的情况是否有可能获得相同的响应,但它们都应用相同的更改(例如,它们都在同一文件中添加相同的行,但提交消息不同)?
编辑
通过说标签“包含给定提交的更改”,我的意思是在标签的日志历史记录中,有一个提交
C
应用了与给定提交相同的修改。
不,使用标准
git
功能无法完全自动且可靠地完成此操作。即使您不编辑提交消息,在挑选时 SHA-1 也会始终发生变化。不能有 2 次提交具有相同的 SHA-1。
对跟踪的一些支持由
提供git cherry-pick -x
会将原始 SHA-1 插入到新提交的提交消息中。但如果您忘记使用 -x
,“链接”就会丢失。git log "-S${string}" --all
如果您知道(足够)适合您的更改的字符串,则会在所有分支中搜索更改。问题想使用标签。但标签也不会添加如此神奇的功能。
您将需要一个流程来在提交消息中进行必要的交叉引用。 CI 可以强制执行这样的流程
我想到的一般是:
最难的部分是确定 1.,所以首先是最简单的部分:
# in a file, or as the output of a commit :
eacf32c
44df701
...
只需重复运行
git tag --contains
,并将结果合并在一起:
cat thelist.txt | while read sha; do git tag --contains $sha; done | sort -u
这在很大程度上取决于您打算如何实现上述更改。以下是一些例子:
如果您知道只想使用
git cherry-pick
应用目标提交,那么提交消息很可能会非常相似:git log --all --grep "one discriminating sentence"
或 git log --all --grep "#issuenumber"
可能会给您一个很好的起点
如果您想要定位添加或删除特定行的提交:从
git log --all -S "a specific line"
或 git log --all -G "a specific line"
开始(如果您需要有关它们如何工作的更多说明,请阅读 -S 和 -G 的文档)。
您还可以通过运行以下命令来发现
that/specific/file.txt
或 that/specific/dir
的变化:
git log -S "a specific line" -- that/specific/file.txt
git log -G "a specific line" -- that/specific/dir
git patch-id
git rebase
中用于发现已应用于目标的提交)在存储库的完整提交列表上使用它会有点复杂,但它可以自动化:
首先计算您想要发现的更改的补丁 ID :
$ git show A | git patch-id --stable
# this will give you a two fields output :
# a hash for the diff itself the hash of the commit
3bbe48e8ce5714b78900653e618ff4dc41205ffb 84d48dcd44d440d3a35177c92c897d2efae93346
然后计算所有补丁 ID,并 grep 查找您想要的补丁 :
git rev-list --all | while read sha; do git show $sha | git patch-id; done
| grep "^3bbe48e8ce5714b78900653e618ff4dc41205ffb"
第二列将是提交列表:
... | awk '{ print $2 }'
而不是列出存储库中的所有提交(
git rev-list --all
),您可能希望使用第一个命令之一来缩小初始搜索范围:输入由git log --grep ...
或git log -S ...
或git log -- that/specific/dir
生成的列表...
您可以通过更改
git show
命令对“特定文件上的补丁”使用相同的技巧:
git show $sha -- file1 file2 dir3 | git patch-id
您可以编写自己的脚本,该脚本接受提交 ID,并检查它是否包含您想要的内容
等等等等......
注意:如果您有一个
git log
命令可以让您发现一些您感兴趣的提交,您可以通过删除所有格式选项(--onelin
、--graph
)将其转换为仅输出提交哈希值的命令, --format
...) 并将其替换为 --format="%H"