我目前使用Git作为一个工具的一部分,我需要在其中标记一些Git存储库更改。因此,我创建了一些"市场承诺"。现在,我想知道如何有效地找到这些提交。
Git存储库都有一个特定的结构。我想用一个具体的例子来描述它:
考虑一个任意的(大的)存储库,它有一个分离的HEAD,总是有一个线性链到任意的下一个分支名称。该存储库上的git log --oneline
看起来像:
9b6eea6063ae (HEAD) foo
51206b9c09db bar
8ec634b9e864 baz
...
2fba8a89a6ee marker123
75a8e54af67e (some_branch) ipsum
...
我现在要查找在到最后一个分支的路径上是否存在名称为 的提交。使用marker123
git log --grep marker123 --format=oneline --max-count=1 | grep .
,我发现了一个搜索该名称的命令,当提交存在时不返回错误,当它不存在时返回错误。但是,如果不存在commitmarker123
,则搜索整个历史记录git log
的搜寻范围限制在HEAD
至some_branch
之间?我的主要问题是我没有提前知道some_branch
的名字。我只知道它是在某个地方的线性链上的回提交,是一个分支名称。特别是,我不知道如何为git log
定义一个提交范围。
旁注:我从git rebase -i
中了解了一点这种行为,没有额外的目标提交规范。它还会从最后一个(远程?)分支开始进行重新base。
下面是一个脚本,用于设置两个存储库并演示问题:
#!/bin/sh
echo "Setup a repository, where the search works."
mkdir git-test; cd git-test
git init --initial-branch=random_name
git commit --allow-empty -m "marker123"
git tag "This-commit-never-ever-should-be-found"
git commit --allow-empty -m "ipsum"
git checkout --detach HEAD
git commit --allow-empty -m "marker123"
git commit --allow-empty -m "baz"
git commit --allow-empty -m "bar"
git commit --allow-empty -m "foo"
git log --oneline # situation of the example
echo -e "nSearch for marker:"
git log --grep "marker123" --oneline -1 | grep .
echo "Errorcode $?"
cd ..
echo "Setup a repository, where the search does not work."
mkdir git-test2; cd git-test2
git init --initial-branch=random_name
git commit --allow-empty -m "marker123"
git tag "This-commit-never-ever-should-be-found"
git commit --allow-empty -m "ipsum"
git checkout --detach HEAD
# git commit --allow-empty -m "marker123" # this commit is missing here
git commit --allow-empty -m "baz"
git commit --allow-empty -m "bar"
git commit --allow-empty -m "foo"
git log --oneline # situation of the example
echo -e "nSearch for marker:"
git log --grep "marker123" --oneline -1 | grep . # this should result in an error
echo "Errorcode $?"
git log --grep "marker123" --oneline -1 "random_name..HEAD" | grep . # this works here but only if random_name is known
echo "Errorcode $?"
cd ..
您可以:
- 列出不包含
HEAD
的分支:
git branch --no-contains HEAD
- 在
git log HEAD --not [list of branches ...]
命令中使用:
git log --oneline HEAD --not $(git branch --no-contains HEAD)
如果上面的命令给了你期望的历史记录,你可以添加任何你认为合适的选项到git log:
git log --grep marker123 -1 --oneline HEAD --not $(git branch --no-contains HEAD)