【问题标题】:Switch to a certain commit in missing branch in GIT切换到 GIT 中缺少的分支中的某个提交
【发布时间】:2016-11-12 06:17:28
【问题描述】:

我写了 5 天的代码在点击错误按钮后消失了。我一直在 HEAD 工作。并在 5 天内提交了 3 次。在 BitBucket 桌面应用程序中,我两次点击了不同的分支,现在它消失了。我找不到未发送到服务器的提交。

分支没有出现,但提交在历史记录中可见:

Macintosh:repo admin$ git branch -a
* HEAD
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

Macintosh:repo admin$ git branch
* HEAD
  master

这是提交的历史:

Macintosh:repo admin$ git log --oneline --all --graph --decorate  $(git reflog | awk '{print $1}')
warning: refname 'HEAD' is ambiguous.
* 1d2bc57 THIRD
* d2a0291 SECOND
* 40c2d66 FIRST
| * 7100271 (HEAD -> master, origin/master, origin/HEAD, HEAD) CURRENT
|/  
* bc35e2f OLDCOMMINT

桌面应用程序显示空的 HEAD 分支,这就是为什么我无法理解这里发生了什么。 如何从“7100271”(当前)切换到“1d2bc57”(第三)?

提前致谢。

【问题讨论】:

  • 很高兴您在下面找到了解决方案,但值得指出的是,目前不存在“Bitbucket 桌面应用程序”。也许你的意思是SourceTree
  • 是的,当然。不是官方应用吗?
  • 两种产品都来自同一家公司,但我不会称SourceTree为官方。许多人将 Bitbucket 与其他客户端一起使用,许多人将 SourceTree 与其他存储库主机一起使用。

标签: git console branch bitbucket sourcetree


【解决方案1】:

这里发生的事情是,您创建了一个名为 HEAD 的分支(常规、普通、本地分支),其名称与 Git 用来知道您在哪个分支上的特殊名称 HEAD 冲突。

当您签出像 master 这样的分支时,Git 会将分支名称写入 HEAD 文件。如果你签出名为HEAD 的分支,Git 会将HEAD 写入HEAD 文件。整个情况非常混乱:就像去参加一个聚会或一个教室,然后发现每个人都叫 Ashot。 :-)

这里最好的做法是重命名或删除名为HEAD分支(重命名或杀死额外的Ashot,就像它一样)。从命令行重命名它:

$ git branch -m HEAD new-name

我不知道如何通过一些花哨的 GUI 来做到这一点(可能没有任何方法可以从那里修复它,GUI 往往受到限制)。

【讨论】:

  • 有没有办法让 GIT 在非 HEAD 中写入临时提交?
  • 否:您可以进入 no 分支(使用 git checkout --detachgit checkout <sha-1>),之后 HEAD 包含当前提交的原始 SHA-1,而不是从中获取该提交 ID 的分支的名称。但无论哪种方式,这里的底层名称都是HEAD:这只是.git/HEAD 是否包含提交的原始ID,还是分支的名称的问题这会给你提交的 ID。 (你可以暂时使用一个命名的分支,然后离开它并删除这个名字,此时所有的提交都被遗忘了,可以进行垃圾回收了。)
【解决方案2】:

使用git reflog 获取您签出或提交的所有提交的历史记录。

找到最近的提交后,请使用 git checkout <hash> 来检查该提交。

【讨论】:

  • 短哈希是否足够,还是只有完整的?
  • 已修复,感谢您的参与和简短的回复!
【解决方案3】:

您应该能够通过简单地在提交 sha 上使用 git checkout 来访问数据

git checkout 1d2bc57

在此之后,您可能不再处于任何分支(“分离的头部状态”),在这种情况下,您可以创建一个新分支。

git checkout -b newBranch

我希望这会有所帮助!

【讨论】:

  • 感谢您的快速响应。然后我怎样才能使我当前的分支成为主要分支。很明显,让 GIT 认为 master 是“THIRD”,而不是“CURRENT”?
  • 当我尝试创建一个新分支时,我收到以下错误:警告:refname 'HEAD' is ambiguous。致命:不明确的对象名称:'HEAD'。
  • 我认为该错误可能是由于您拥有另一个名为“HEAD”的分支。尝试使用 git branch -m HEAD newBranch 将其重命名为其他名称。然后,您应该能够在新分支中使用 git rebase master 将所有更改转移到 master 中。
猜你喜欢
  • 2016-10-03
  • 2019-05-06
  • 2020-12-27
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多