如何通过 git 历史记录或 "how it got in the current branch" 查看提交路径?
How do I see a commit's path through git history, or "how it got in the current branch"?
我正在使用 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
更多信息
我还没有看到任何答案,所以如果 none 进来我会开始赏金,但也许我没有正确解释问题(我愿意接受改进和改进的建议阐明)。
这样做的原因是我可以看到提交本身,我被告知它不应该在某个分支上。这是我看到的:
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
中,但它是。我想知道为什么,它是怎么到那儿的,是谁放在那里的。
这是git bisect
的经典案例。 bisect 帮助你追踪错误。
在你的情况下,你只是在寻找一个 commitId(它被误放在了错误的分支中)。
Bisect 是一个非常简单但功能强大的工具。
http://git-scm.com/docs/git-bisect
http://hashrocket.com/blog/posts/finding-failure-git-bisect
希望对您有所帮助。
关于你问题的后半部分 "how it got in the current branch?",请看一下 git-when-merged。
这是一个 Python 脚本,根据其自述文件:
Find when a commit was merged into one or more branches. Find the merge
commit that brought COMMIT into the specified BRANCH(es). Specifically, look for the oldest commit on the first-parent history of BRANCH that contains the COMMIT as an ancestor.
这听起来像是您在确定 {sha1hashIDstring}
提交何时合并到 test_jan15
分支时要查找的内容。
您是否尝试过 git 日志的“--decorate”选项?
我的 .gitconfig:
中有这个别名
[alias]
k = log --graph --oneline --abbrev-commit --decorate
它显示了与 gitk 显示的图表相似的图表,分支名称 "decorated" 除了分支中最近的提交。
或
--
也试试 tig
。它比 gitk(根据我的用法 ;))提供更多信息。参考http://gitready.com/advanced/2009/07/31/tig-the-ncurses-front-end-to-git.html一次。
我认为任何一种解决方案都会为您提供所需的结果。
我用谷歌搜索了一些东西,并为你找到了一些东西。归功于 #vonC
git when-merged [OPTIONS] COMMIT [BRANCH...]
查找何时将提交合并到一个或多个分支中。
查找将 COMMIT 带入指定 BRANCH(es) 的合并提交。
具体来说,在包含 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
[...]
我知道这没有用 "github" 标记 - 但如果项目在那里,Blame 或 History 的视觉风格(查看特定文件时文件 header 中的按钮)可以使事情发生的时间更容易追踪。
不确定这是否真的解决了这个(非常)具体的问题 - 但它可能会帮助其他有类似问题的人发现这个问题...
我正在使用 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
更多信息
我还没有看到任何答案,所以如果 none 进来我会开始赏金,但也许我没有正确解释问题(我愿意接受改进和改进的建议阐明)。
这样做的原因是我可以看到提交本身,我被告知它不应该在某个分支上。这是我看到的:
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
中,但它是。我想知道为什么,它是怎么到那儿的,是谁放在那里的。
这是git bisect
的经典案例。 bisect 帮助你追踪错误。
在你的情况下,你只是在寻找一个 commitId(它被误放在了错误的分支中)。
Bisect 是一个非常简单但功能强大的工具。
http://git-scm.com/docs/git-bisect http://hashrocket.com/blog/posts/finding-failure-git-bisect
希望对您有所帮助。
关于你问题的后半部分 "how it got in the current branch?",请看一下 git-when-merged。
这是一个 Python 脚本,根据其自述文件:
Find when a commit was merged into one or more branches. Find the merge commit that brought COMMIT into the specified BRANCH(es). Specifically, look for the oldest commit on the first-parent history of BRANCH that contains the COMMIT as an ancestor.
这听起来像是您在确定 {sha1hashIDstring}
提交何时合并到 test_jan15
分支时要查找的内容。
您是否尝试过 git 日志的“--decorate”选项?
我的 .gitconfig:
中有这个别名[alias]
k = log --graph --oneline --abbrev-commit --decorate
它显示了与 gitk 显示的图表相似的图表,分支名称 "decorated" 除了分支中最近的提交。
或
--
也试试 tig
。它比 gitk(根据我的用法 ;))提供更多信息。参考http://gitready.com/advanced/2009/07/31/tig-the-ncurses-front-end-to-git.html一次。
我认为任何一种解决方案都会为您提供所需的结果。
我用谷歌搜索了一些东西,并为你找到了一些东西。归功于 #vonC
git when-merged [OPTIONS] COMMIT [BRANCH...]
查找何时将提交合并到一个或多个分支中。 查找将 COMMIT 带入指定 BRANCH(es) 的合并提交。
具体来说,在包含 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
[...]
我知道这没有用 "github" 标记 - 但如果项目在那里,Blame 或 History 的视觉风格(查看特定文件时文件 header 中的按钮)可以使事情发生的时间更容易追踪。
不确定这是否真的解决了这个(非常)具体的问题 - 但它可能会帮助其他有类似问题的人发现这个问题...