【问题标题】:Git missing commitsGit 缺少提交
【发布时间】:2016-10-03 12:37:51
【问题描述】:

我是 git 新手,偶然发现了一个奇怪的问题

所以我对我的本地存储库做了一些提交,并使用 git log 查看了它们,它运行良好。 一段时间后,我检查了一个较旧的提交,后来我想跳回到我最近的提交继续我的工作。所以我又做了一个 git log。 但是现在没有显示最新的 3-4 次提交。 输入“git checkout master”让我看到了第二个日志命令的最新提交,但没有看到我描述的第一个命令的提交。 这是一个问题还是我必须输入另一个命令才能返回到最新的提交?

希望我的问题可以理解。

我按正确的顺序输入的所有命令:

Git 添加公共/
Git 提交 -m “Fo”
(这里没有错误)
Git 日志 --oneline。
输出:8 次提交。
Git 签出“旧提交的 ID”
Git 日志 --oneline。
输出:4 次提交

【问题讨论】:

  • 您非常确定您没有对单独/开发分支进行这些更改,或者可能隐藏它们?据我所知;当您的 git 状态显示更改时,您不能简单地签出到另一个状态而不存储您的更改或将它们重置/恢复到 HEAD。如果您确实存储了更改,使用“git pop”应该会返回到您开始存储时的状态。
  • 您应该提供您运行的命令的确切顺序以及相关的输出,以便准确定义您所做的事情。然后准确描述您想要拥有的东西。
  • 听起来像是一个分离的 HEAD。尝试使用 SourceTree,直到您熟悉这些功能为止。
  • 传入更多标志来记录可能会更清晰;试试git log --oneline --all --graph --decorate 之类的东西。答案中还提到了git reflog

标签: git git-commit git-log


【解决方案1】:

运行git checkout sha1 后,您处于分离的 HEAD 状态。使用 git reflog 查找您以前的 HEAD,使用 git checkout 查找该 HEAD 或使用 git reset --hard 查找该 HEAD。

如果您在指定的分支上,您只需 git checkout <branch name> 即可返回。如果您使用的是分离的 HEAD,请改用 git reflog

【讨论】:

  • 所以当我在分离的 HEAD 上时,我只能看到提交到这一点?
  • "这样做将使您的工作副本成为“分离的 HEAD”,这意味着您将不再位于分支上。如果您想在此之后提交,您可能需要签出再次分支,或创建一个新分支。”
  • @GuyWithCookkies 您可以将分离的 HEAD 视为无名分支。 HEAD 总是指工作树的最后一次提交。签出特定 sha1 后,它之后的提交将被隐藏,因为该 sha1 现在是 HEAD。除非您确切地知道自己在做什么,否则请始终避免处于分离的 HEAD 状态,因为您可能很容易混淆自己并迷失方向。
  • 要补充这一点,请经常使用git status(许多Git 用户设置他们的shell 以便命令行提示符本身包含git status 之外的关键项)。如果它显示detached at <hash>detached from <hash>,那么您在匿名分支上处于这种“分离的HEAD”模式。这在 rebase 期间是正常的!不过,在大多数其他情况下,这只是意味着您需要 git checkout <branchname> 才能返回分支。
【解决方案2】:

我认为没有人能得到您的确切要求,但我认为您可能已经隐藏了您的更改。

类型:

git stash list

那里显示什么,有什么信息吗?

如果有这样的事情

stash@{0}: WIP on master: 049d078 added the index file

你可以输入:

 git stash apply // for the last stash to be applied
 git stash apply stash@{1} // for the second from last stash 

另外,你可以试试:

git stash pop // apply the stash and then immediately drop it from your stack

上面的区别在于 pop 会丢弃堆栈中的存储,但 apply 会保留它以备将来重用。

如果您的提交在日志或存储中丢失,您可能重置了 HEAD。

从现在开始,为你的工作做下一个步骤,以免搞砸任何事情。

  • 从更新后的 master 中签出您的分支

     git checkout -b your_branch_name 
    
  • 在你完成一些工作之后

     git add "name of your file" or git add * (to add all files)
    
  • Git add 命令使用工作树中的当前内容更新索引,为下一次提交准备暂存的内容

    git commit -m "Your message here" 
    
  • 将其推送到远程源

    git push origin your_branch_name 
    

【讨论】:

    猜你喜欢
    • 2013-03-03
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    相关资源
    最近更新 更多