Answers:
并不是特别容易-如果您丢失了指向树枝顶端的指针,那就像在大海捞针中找到一根针。您可以找到所有不再被引用的提交- git fsck --unreachable
会为您完成此操作-但这将包括您在a之后丢弃的git commit --amend
提交,在您基于基准的分支上的旧提交等。因此可以看到所有这些提交一次很可能有太多信息无法通过。
因此,简单的答案是,不要忘记您感兴趣的事物。更严重的是,默认情况下,刷新日志将保留对您最近60天内使用过的所有提交的引用。更重要的是,他们会给什么这些提交一些背景是。
git commit --amend
死胡同,丢失提交等问题。我做了一些基础调整,什么都没做,最终导致某些分支无法从任何分支到达,并且感到有些肮脏,把它们留在了仓库中。现在,这种想法不再那么令人不安了。:)
解决此问题时,请使用以下命令:
git reflog | awk '{ print $1 }' | xargs gitk
这使我可以看到最近变得毫无头绪的提交。
我将其包装在名为的脚本帮助器中~/bin/git-reflog-gitk
。
when the tips of branches and other references were updated in the *local repository*
。git log --reflog
如果您想对非本地引用进行更改,则可能需要使用
类似于@Kieran的Answer,但对于控制台:
git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')
git log --all
。一个简单的例子:在git reset --hard @^
您的HEAD @ {0}提交之后,该提交只会出现在刷新日志中,并且由于git reflog
不支持,--graph
您必须将这些提交传递给以git log --graph
获得可视化表示。
--reflog
,而不是 $(git reflog | awk '{print $1}')
git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')
了git log --oneline --all --graph --decorate --reflog
,除了--reflog包含WIP条目之类的详细信息外,它们几乎相同。
reflog
为什么不使用它log --reflog
呢?
我该如何解决这个问题?使用git fsck
和记录!
首先创建一个包含丢失(无法到达)的提交和斑点的文件。(注意:如果您执行了类似的操作git gc
,它将对所有提交进行垃圾回收,而您将在这里找不到它们!)
$git fsck --lost-found > lost_found.commits
那给你这样的文件:
悬挂提交dec2c5e72a81ef06963397a49c4b068540fc0dc3
悬挂一滴f8c2579e6cbfe022f08345fa7553feb08d60a975
晃来晃去斑点0eb3e86dc112332ceadf9bc826c49bd371acc194
悬挂一滴11cbd8eba79e01f4fd7f496b1750953146a09502
悬挂承诺18733e44097d2c7a800650cea442febc5344f9b3
悬挂一滴1e53a5cdb3ecdde27081ec6e8b31e4070106ee05
然后,您可以使用喜欢的文本编辑器打开此文件,以从那里复制提交/博客哈希。(* 咳嗽 * vim宏非常适合* 咳嗽 *)
现在,您可以使用类似这样的内容从此提交中注销git log --oneline <commit hash>
。另外,gitk,tig或任何其他git查看器也可以工作。
在您的情况下,如果您发现提交F的哈希,则日志将显示以下内容,
A---B---E---F
快捷方便!现在,您可以找到所有悬空提交的背景。
附言:是的,我知道,后期发布,但是,哦,有人可以在这里找到它并觉得有用。(最有可能在6个月后再次搜寻此网页)
我们将git log
有时并不好让所有提交的细节,所以要查看此...
对于Mac:进入git项目并输入:
$ nano .git/logs/HEAD
查看您在其中的所有提交,或:
$ gedit .git/logs/HEAD
查看您在其中的所有提交,
那么您可以在任何喜欢的浏览器中进行编辑。
@bsimmons
git fsck --lost-found | grep commit
然后为每个分支创建一个分支:
$ git fsck --lost-found | grep commit
Checking object directories: 100% (256/256), done.
dangling commit 2806a32af04d1bbd7803fb899071fcf247a2b9b0
dangling commit 6d0e49efd0c1a4b5bea1235c6286f0b64c4c8de1
dangling commit 91ca9b2482a96b20dc31d2af4818d69606a229d4
$ git branch branch_2806a3 2806a3
$ git branch branch_6d0e49 6d0e49
$ git branch branch_91ca9b 91ca9b
现在,许多工具将向您展示这些丢失的提交的图形化可视化。
git log --reflog
救了我!合并HEAD时我迷路了,找不到我的迟交!未显示在源代码树中,但git log --reflog
之前显示了我所有的本地提交
commit --amend
或故意孤立的提交rebase
与与分离的HEAD一起工作而意外孤立的提交绝对没有区别。