我正在使用gitk
和git log
查看提交历史记录,我正在尝试查看特定提交如何到达某个分支。我可以看到历史上的提交,所以我知道他们在那里。
我想要了解的是它们是如何合并的(它们应该保留在自己的分支上)。这是一个非常大的项目,在有问题的提交和分支的当前状态之间有数百个提交,因此我无法通过gitk
中的有限DAG清楚地解密,并且提交在其他分支中被屏蔽并且合并并提交消息。
要做到这一点,我一直在尝试:
gitk {sha1hashIDstring}..branch_name
gitk {sha1hashIDstring}..branch_name --ancestry-path
git log {sha1hashIDstring}..branch_name --reverse
git log {sha1hashIDstring}..branch_name --merges --reverse
git log {sha1hashIDstring}..branch_name --ancestry-path --reverse
git log {sha1hashIDstring}..branch_name --ancestry-path --merges --reverse
我不理解结果。我只想查看包含特定提交的项目,以便我清楚地看到它是如何进入相关分支的。我该怎么做?
我正在寻找的内容,gitk
最好,但git log
就足够了:
Message Author Date #commit that merged branch z into current branch
Message Author Date #commit that merged branch y into branch z
Message Author Date #commit that merged branch x into branch y
Message Author Date #commit that merged {sha1hashIDstring} commit/branch a into branch x
Message Orig_Author Date #{sha1hashIDstring} original commit, on branch a
我还没有看到任何答案,所以如果没有答案,我会开始赏金,但也许我没有正确解释这个问题(我愿意接受改进和澄清的建议)。
这个驱动程序是我可以看到提交本身,我被告知它不应该在某个分支上。这就是我所看到的:
Message Orig_Author Date #{sha1hashIDstring} commit
Message Orig_Author Date #Merged into branch test_dec14 (includes original commit)
...
Message Author Date # unrelated commits
Message Author Date # more unrelated commits
# Stuff happened here ??? everything I do gives me hundreds of things here
# Not all of them related to the {sha1hashIDstring} commit
# No idea how to see only the ones that are
...
Message Author Date # final commit on test_jan15 branch
我被告知test_dec14
中的提交不应该发送到test_jan15
,除非它们被释放,因此{sha1hashIDstring}提交不应该在test_jan15
中它是。我想知道为什么,如何到达那里,以及谁把它放在那里。
答案 0 :(得分:2)
对于问题的后半部分,"它是如何进入当前分支的?",请查看git-when-merged。
这是一个Python脚本,根据其自述文件:
查找何时将提交合并到一个或多个分支中。找到合并 将COMMIT带入指定的BRANCH的提交。具体来说,在包含COMMIT作为祖先的BRANCH的第一父历史中查找最早的提交。
在确定{sha1hashIDstring}
提交何时合并到test_jan15
分支的情况下,这听起来就像您正在寻找的那样。
答案 1 :(得分:1)
这是git bisect
的经典案例。 bisect帮助您追踪错误。
在您的情况下,您只需查找commitId(错误地放入错误的分支)。
Bisect是一个非常简单但功能强大的工具。
http://git-scm.com/docs/git-bisect http://hashrocket.com/blog/posts/finding-failure-git-bisect
希望它会帮助你。
答案 2 :(得分:1)
您是否尝试过“--decorate”选项来git log?
我的.gitconfig中有这个别名:
[别名]
k = log --graph --oneline --abbrev-commit --decorate
它显示了与gitk显示的图形类似的图形,除了分支中最近的提交之外,分支名称“装饰”。
或强>
-
也请尝试tig
。它比gitk更具信息性(根据我的用法;))。请参阅http://gitready.com/advanced/2009/07/31/tig-the-ncurses-front-end-to-git.html一次。
我认为任何一种解决方案都能满足您的要求。
答案 3 :(得分:1)
#vonC
git when-merged [OPTIONS] COMMIT [BRANCH ...]
查找何时将提交合并到一个或多个分支中。 找到将COMMIT带入指定BRANCH的合并提交。
具体而言,在包含COMMIT作为祖先的BRANCH的第一父历史中查找最早的提交。
了解提交的分支,或者它如何到达命名分支 这是Seth Robertson的Perl脚本,看起来非常有趣:
SYNOPSIS
git-what-branch [--allref] [--all] [--topo-order | --date-order ]
[--quiet] [--reference-branch=branchname] [--reference=reference]
<commit-hash/tag>...
OVERVIEW
告诉我们(默认情况下)提交和合并的最早因果路径,以使请求的提交进入命名分支。 如果直接在命名分支上进行提交,那么这显然是最早的路径。
通过最早的因果路径,我们指的是最早通过提交时间合并到命名分支的路径(除非指定了--topo-order)。
<强>性能强>
如果许多分支(例如数百个)包含提交,系统可能需要很长时间(对于linux树中的特定提交,需要8秒来探索分支,但有超过200个候选分支)要跟踪沿着每个提交的路径。 选择要检查的特定--reference-branch - reference标签的速度要快几百倍(如果你有数百个候选分支)。
**EXAMPLES**
# git-what-branch --all 1f9c381fa3e0b9b9042e310c69df87eaf9b46ea4
1f9c381fa3e0b9b9042e310c69df87eaf9b46ea4 first merged onto master using the following minimal temporal path:
v2.6.12-rc3-450-g1f9c381 merged up at v2.6.12-rc3-590-gbfd4bda (Thu May 5 08:59:37 2005)
v2.6.12-rc3-590-gbfd4bda merged up at v2.6.12-rc3-461-g84e48b6 (Tue May 3 18:27:24 2005)
v2.6.12-rc3-461-g84e48b6 is on master
v2.6.12-rc3-461-g84e48b6 is on v2.6.12-n
[...]
答案 4 :(得分:0)
我知道这没有用“github”标记 - 但如果项目在那里,Blame或History的视觉风格(查看特定文件时文件头中的按钮)可以使事情更容易追踪发生了。
不确定这是否真的解决了这个(非常)特定的问题 - 但它可能会帮助其他有类似问题的人找到这个问题......