我问这个问题的原因是我怀疑偶尔我工作的地方有时提交似乎只是从一个远程分支“消失”无缘无故。我在这里的另一篇文章中看到,确实可以这样做:
git push origin HEAD --force
我讨厌感到偏执,但如果能检查一下,我会放松心情。我在某处读到了一个命令:
git reflog
看起来这个man页面说这个命令也可以用来删除日志中的条目,这很糟糕。无论如何,我可以检查一下并放松心情吗?
答案 0 :(得分:1)
您确实可以使用git reflog
来检查远程分支上是否缺少提交,但只有在您拥有最新副本时才会有效您本地仓库中的远程分支(您的远程跟踪分支)。
您可以经常运行git fetch
,使本地远程跟踪分支保持最新状态。但是,如果有人推送您尚未提取的提交,然后在下次提取之前将其删除,那么您将不会知道已删除提交。如果您拥有已更改的原始历史记录副本,您只会发现远程分支的历史记录已被更改,在这种情况下,Git会告诉您已经有强制-update 强>:
$ git fetch origin
From c:/Users/Keoki/Documents/GitHub/bare
+ 02f0d6e...5c7b77b master -> origin/master (forced update)
如果有人向你的遥控器强行推动,那么只要你拿起或拉动它就应该明显,因为它会显示为强制更新(因为我会' ve指出),除非你不经常从你的遥控器上取或拉。如果您可以直接访问远程仓库,也可以直接在其上检查reflog。
你提到,
如果您通过以下任何额外选项(来自official documentation),看起来这个man页面说这个命令也可以用来删除日志中的条目,这很糟糕。
git reflog
将仅删除reflog中的条目(与git log
不同的日志):
--expire=<time>
--expire-unreachable=<time>
--all
否则,git reflog
只读,只会列出您的参考资料的历史记录。对于您的特定示例,您可以使用以下命令查看远程跟踪分支的reflog历史记录:
git reflog <remote>/<branch>
例如,
$ git reflog origin/master
5c7b77b refs/remotes/origin/master@{0}: fetch origin: forced-update
02f0d6e refs/remotes/origin/master@{0}: fetch origin: fast-forward
fc32eac refs/remotes/origin/master@{1}: pull origin master: fast-forward
b6a06e1 refs/remotes/origin/master@{5}: fetch origin: fast-forward
35a91e4 refs/remotes/origin/master@{6}: update by push
019ea3a
在上面的示例中,您将看到origin/master
在reflog的最新(顶部)条目中被强制更新,表明远程分支的原始历史记录已被更改,可能表示已删除提交(尽管重写的提交也会导致强制更新)。
答案 1 :(得分:-1)
有效删除或改变Git日志的方法有多种,包括(来自Git&#39; docs):amend
,rebase
,squash
和{{1} }。浏览选项:
http://git-scm.com/book/en/Git-Tools-Rewriting-History
关于filter-branch
(来自 Linux内核档案)的功能:
https://www.kernel.org/pub/software/scm/git/docs/git-reflog.html
Reflog是一种记录分支尖端何时更新的机制。 该命令用于管理记录在其中的信息。
reflog在各种git命令中很有用,用于指定旧值 一个参考。例如,HEAD @ {2}表示&#34;其中HEAD曾经是两个 之前移动&#34;,master@{one.week.ago}意味着&#34;高手过去指向的地方 一周前&#34;等等。有关详细信息,请参阅gitrevisions(7)。
基本上,Git保留两个日志:我们都知道的日志和reflog,后者仅存在于您的本地仓库中。当HEAD移动时,Git会更新reflog(由于新的提交, 检查分支机构或重置)。在硬重置后恢复提交时,通常会访问它。
要查看reflog,请输入:
reflog
要查看更详细的信息,请输入:
git reflog
关于您的问题,我想您可以运行git log --walk-reflogs
和git log
(或git reflog
和git log
)并比较结果(记住git log --walk-reflogs
只记录本地行动)。