0

对于给定的 repo 和分支,有没有办法查看该分支如何随时间变化,包括历史重写?例如:

4 月 1 日:提交 A -> B -> C -> D

4 月 2 日,Max Heiber——<code>git push -f: Commit A -> B -> C'

4 月 3 日,其他人——<code>git 合并功能 提交 A -> B -> C' -> D'

这就是我问的原因:

我们正在将功能合并到我们的dev分支中,但这些更改后来会从dev. 我们发现原因是我们的一位开发人员正在这样做git push -f并且在他的 .gitconfig 中有这个:

[push] default = matching

这具有强制推动他所有分支的效果,包括dev.

花了一段时间才弄清楚这件事正在发生。在解决问题时,我们真正想要的是了解我们的历史如何以及为何发生变化。是否有可能获得这种分支视图?

4

3 回答 3

3

Git 并没有真正保存这些信息。如果您有 reflog,它确实会为 reflog 过期时间保存一些东西。这些时间默认为 30 天和 90 天,分别用于不可访问和可访问的提交。1 因此, Gerhard Poul 的答案将适用于您的 local dev,并且由于即使对于远程跟踪分支通常也会启用 reflog,因此您还可以使用git reflog show origin/dev查看Git 在其/操作期间记录的内容。git fetchgit pull

到期时间通常从 开始git gc,所以如果git gc有一段时间没有运行,您可以多获得几天的信息。

如果在您的服务器上启用了 reflogs(默认情况下它们启用),您可以登录到您的服务器并在git reflog show dev那里运行。

在所有情况下,您可能需要添加--date=<format>(例如,--date=iso)以替换为:{@n}@{date}

$ git reflog --date=iso master
11ae6ca master@{2016-06-17 13:32:00 -0700}: reset: moving to HEAD^
3d9eb53 master@{2016-06-17 13:31:44 -0700}: commit: Revert "fdmillion: repair example"
11ae6ca master@{2016-04-22 05:27:07 -0700}: commit (amend): add run-checks script
becf391 master@{2016-04-22 05:24:48 -0700}: commit: add run-checks script

这将为您提供每个参考更改的时间戳,这对于关联“谁在何时做了什么”很有用。


1这在技术上是胡说八道。:-) 提交——嗯,所有的 Git 对象,真的——要么是可访问的,要么是不可访问的,但是 reflog 条目使它们可以访问,所以这个特殊的速记可能令人费解。实际定义可以从对应参考的当前值中得到。也就是说,当git reflog expire引用到期时,它会查看:

  • 这是一个 reflog 条目refs/heads/foo
  • 分支foo名称是什么提交?(称这个H为头)
  • 这个 reflog 条目名称是什么提交?(调用此E进入)
  • EH的祖先吗?(见git merge-base --is-ancestor
  • 如果是,请使用gc.reflogExpiregc.<pattern>.reflogExpire
  • 如果否,请使用gc.reflogExpireUnreachablegc.<pattern>.reflogExpireUnreachable

两个非模式名称默认分别为90.days.ago30.days.ago(默认不设置模式值)。有一种特殊情况refs/stash设置为never.

于 2016-08-06T16:08:11.230 回答
2

我不确定这是否适用于您的远程存储库,但它至少应该适用于您的本地存储库。

要查看在 dev 分支上做了什么:

git reflog show dev

这应该会显示过去 30 天内对该分支的更改。

于 2016-08-06T15:39:11.037 回答
1

考虑到本地 reflog 可能会丢失,如果本地 repo 在强制推送后立即被删除,我试图在远程 repo 中查找强制更新的分支的历史记录。

创建远程仓库的新克隆并运行git gc,以便将所有可访问的提交和相关对象打包,而将不可访问的对象保留为松散对象,可以在.git/objects. 但是我只是找不到任何 git 命令来列出这些无法访问的对象。git rev-list似乎无法列出无法访问的对象。所以我尝试了一种dumm的方法将它们全部列出来,将前2个字节的文件夹名和左边的38个字节文件名一个一个地连接成一个完整的sha1。然后使用git cat-file -t <object>一个一个找到所有的提交对象。然后跑去git show <commit-object>看看他们。我认为在其中你可以找到分支在强制更新之前指向的提交。

当找到先前的提示提交时,可以取回丢失的历史记录。

于 2016-08-06T16:53:05.103 回答