git log pick(show)提交是否仅与某个分支或标签相关联?

时间:2019-09-19 14:58:59

标签: git git-log git-reset

在运行git log --graph --oneline -all时,我仅看到与某个分支(本地和源)或标记相关联的提交(以及父提交和父提交等)。

也就是说,如果我在分支上重置为先前的提交并进行新的提交,则会创建新的历史记录行。现在,如果我将新的本地历史记录线与原点合并,则会看到旧的历史记录线不再显示在图形中(除非标记了旧的历史记录提示)。

即使查询整个回购日志似乎也没有帮助*pList

因此,您是否想知道git log / graph Picks(shows)是否仅与某些分支或标签相关联?有人可以确认或纠正。

编辑-遵循RomainValeri的回答

来自git docs:

  

git-log-显示提交日志

以及实际观察结果,以及-RomainValeri的答案

  

git log --graph --oneline --all

     

输出所有分支/标记历史记录

所以有什么方法可以用git log或任何其他替代命令/工具查看每次提交的日志(包括悬空的提交,即那些与任何分支/标签无关的提交)。

4 个答案:

答案 0 :(得分:1)

是的,默认情况下,它需要HEAD,但您可以将其作为参考:

git log --graph --oneline
# outputs history backwards from HEAD

git log --graph --oneline branch-1
# outputs only branch-1 history

git log --graph --oneline --all
# outputs all branch histories

要在下面发表您的评论:对于--all,这并不意味着它需要所有提交,而是所有引用。因此将浏览所有refs/目录(也将浏览HEAD


在新作用域后编辑:

要查找丢失的(悬空的)提交,请使用fsck

git fsck --lost-found

最后,要链接两者,您可以嵌套命令。

git log --graph --oneline $(git fsck --lost-found | sed -E 's/dangling (tree|commit|blob|tag) //')

答案 1 :(得分:1)

尚不清楚,但是更新之后,您的主要问题似乎是:

  

所以有什么方法可以用git log或任何其他替代命令/工具查看每次提交的日志(包括悬空的提交,即那些与任何分支/标签无关的提交)。

简短的回答(仍然是最准确的)是:并非如此。

如果您检出了悬空的提交(即HEAD已从所有引用中分离出来,则可以看到该历史记录)。您可以从reflogs(回购分支和HEAD过去指向的地方的本地记录)中查看历史记录,以查看任何当前引用都无法访问的历史记录。还有其他类似的例外。您甚至可以给git一个特定的提交ID,以查看导致该提交的历史记录。

但是您确实必须告诉git log从哪里开始步行;它并非旨在查找悬空的提交并在那里开始散步。

在得出结论之前,以及“不是真的”在大多数情况下都是“正确”的原因,我想指出的是,如果您有无法达成的承诺到--all为止,那么gc就从该提交下方撤出地毯是一个时间问题-因为据其所知,此类提交尚未使用。大多数git命令所做的假设日志都相同:可以从ref(分支,标签等)访问有用的提交,因此即使禁用了gc,也避免了删除此类提交(不是很好)想法),您仍然会永远尝试说服git与他们合作。

因此,唯一合理的建议是,在编写要保留的代码时,不要养成以分离的头部状态工作的习惯;如果您要保留新的更改,然后意识到自己处在分离状态,请创建一个分支。

但是对于一个技术上较完整的答案,我会注意到git有一个命令,其命令 用来查找悬空的提交。您可以使用git fsck定位无法访问的对象(假设尚未被gc清除),然后将生成的SHA ID值提供给log。您甚至可以组装脚本来完成此任务。

答案 2 :(得分:1)

由于问题本身并未引起人们的关注,目前恐怕这有点混乱。您从git log开始进入git gc领域。 :-)

Git具有可见引用,例如HEAD,分支名称和标签名称。但是Git还具有不可见引用,例如reflogs和 invisible 引用。最后一个特别棘手:

  • 暂时忽略git worktree add,让我们看一下不可见的引用。这些是索引中的条目!它们直接引用Blob对象(仅),但它们出于git gc的目的使这些Blob保持活动状态。

  • 现在让我们投入git worktree add。添加工作树时,添加的工作树将获得自己的索引,自己的HEAD和自己的一组特定于工作树的特殊引用(ORIG_HEADgit bisect refs,依此类推)。 git gcgit fsck命令必须检查所有这些引用。在Git 2.5中,git worktree第一次进入时,他们没有加入!直到Git 2.15才解决。这样做的结果是,当git gc运行时,它可能会丢弃正在某些添加的工作树中使用的数据:仅存储在添加的工作树的索引中的对象,或仅从添加的工作树可访问的提交,树的分离的HEAD丢失了,可以在修剪结束后(默认= 14天)进行GC处理。

您可以让git log-g一起进入引用日志,也可以让它与--all一起进入所有常规引用。但是,--all标志仅查看 this 工作树的特定于工作树的引用。同时git fsckgit gc必须查看所有引用,包括reflog和不可见的和按工作树引用。如果您的Git在2.5到2.15之间,则此行将被破坏,因此请注意不要长时间使用添加的工作树。 (我自己被这个特定的错误咬住了。幸运的是,添加的工作树没有任何重要意义。)

运动(可在不窥视来源的情况下发现):refs/stash是每个工作树,还是全局的? (我自己不知道答案。)

答案 3 :(得分:0)

  

有什么方法可以查看每个提交的日志(包括悬空的提交,即那些与任何分支/标签无关的提交)

通常,在命令中添加--reflog足以查看上个月左右所做的每次提交或放弃的提交,而不管它是否在当前历史记录中。

可以生成和放弃提交而无需创建reflog条目,但是很难想象您为什么要寻找这些提交。找不到所有鬼提示的方法,--reflogs因为很久以前就被抛弃了,或者是由自己认为不需要讨厌的reflog的本地工作流/脚本生成的,所以是

git fsck --connectivity-only --unreachable --no-dangling