【问题标题】:How to retrieve a lost commit?如何找回丢失的提交?
【发布时间】:2021-05-06 00:28:05
【问题描述】:

我已经提交了消息“主活动中的回收站视图”。头在上面。我在没有看到警告的情况下切换到新分支。我现在无法通过消息“主活动中的回收站视图”看到我的提交。如何检索与任何分支无关的提交? 请帮助我是 GitHub 的新手。

我的终端如下:

C:\Users\Dell\AndroidStudioProjects\WorldClockTest>git add .

C:\Users\Dell\AndroidStudioProjects\WorldClockTest>git commit -m "Recycler View in Main Activity"
[detached HEAD 35b478b] Recycler View in Main Activity
 5 files changed, 96 insertions(+), 51 deletions(-)
 rewrite app/src/main/java/com/example/worldclocktest/CitySelectedListAdapter.java (60%)

C:\Users\Dell\AndroidStudioProjects\WorldClockTest>git log
commit 35b478bf8761480eeed417d3fa8ae3bab44cfa36 (HEAD)
Author: Hizafa-Nadeem <hizafa.977@gmail.com>
Date:   Thu May 6 04:44:13 2021 +0500

    Recycler View in Main Activity

commit 6dfc1a1db723e268d967ebcf34a8dac45f41514b (Recycler-View)
Author: Hizafa-Nadeem <hizafa.977@gmail.com>
Date:   Thu May 6 02:40:11 2021 +0500

C:\Users\Dell\AndroidStudioProjects\WorldClockTest>git push -u origin Recycler_View
error: src refspec Recycler_View does not match any
error: failed to push some refs to 'https://github.com/Hizafa-Nadeem/WorldClock-App-'

C:\Users\Dell\AndroidStudioProjects\WorldClockTest>git push -u origin Recycler-View
Enumerating objects: 115, done.
Counting objects: 100% (115/115), done.
Delta compression using up to 8 threads
Compressing objects: 100% (89/89), done.
Writing objects: 100% (115/115), 139.26 KiB | 1.00 MiB/s, done.
Total 115 (delta 19), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (19/19), done.
remote:
remote: Create a pull request for 'Recycler-View' on GitHub by visiting:
remote:      https://github.com/Hizafa-Nadeem/WorldClock-App-/pull/new/Recycler-View
remote:
To https://github.com/Hizafa-Nadeem/WorldClock-App-
 * [new branch]      Recycler-View -> Recycler-View
Branch 'Recycler-View' set up to track remote branch 'Recycler-View' from 'origin'.

C:\Users\Dell\AndroidStudioProjects\WorldClockTest>git checkout cities_declared_in_activity_main
error: pathspec 'cities_declared_in_activity_main' did not match any file(s) known to git

C:\Users\Dell\AndroidStudioProjects\WorldClockTest>git checkout cities_declared_in_activitymain
error: pathspec 'cities_declared_in_activitymain' did not match any file(s) known to git

C:\Users\Dell\AndroidStudioProjects\WorldClockTest>git log
commit 35b478bf8761480eeed417d3fa8ae3bab44cfa36 (HEAD)
Author: Hizafa-Nadeem <hizafa.977@gmail.com>
Date:   Thu May 6 04:44:13 2021 +0500

    Recycler View in Main Activity

commit 6dfc1a1db723e268d967ebcf34a8dac45f41514b (origin/Recycler-View, Recycler-View)
Author: Hizafa-Nadeem <hizafa.977@gmail.com>
Date:   Thu May 6 02:40:11 2021 +0500

    first commit on Recycler View

commit 269b5fee830e7a26a1fabd008f60ff6b236cb111 (cities_declared_in_main_activty)

C:\Users\Dell\AndroidStudioProjects\WorldClockTest>git checkout cities_declared_in_main_activty
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  35b478b Recycler View in Main Activity

If you want to keep it by creating a new branch, this may be a good time
to do so with:

 git branch <new-branch-name> 35b478b

Switched to branch 'cities_declared_in_main_activty'

C:\Users\Dell\AndroidStudioProjects\WorldClockTest>git status
On branch cities_declared_in_main_activty
nothing to commit, working tree clean

C:\Users\Dell\AndroidStudioProjects\WorldClockTest>git push -u origin cities_declared_in_main_activty

【问题讨论】:

  • 你原来在哪个分支? HEAD 是否分离?
  • 你似乎不太清楚你在用 Git 做什么。这是不明智的;你应该了解更多。但是,这个问题问得非常好:您复制了历史并将其粘贴到问题中。我希望每个人都这样做!

标签: git


【解决方案1】:

记住一点:在 Git 中,分支只是一个提交的名称。它对其行为方式还有其他一些影响,但仅此而已。出于多种原因,分支名称在 Git 中至关重要。一是他们保持提交活动。如果提交具有分支名称,或者是此类提交的父级,或 that 提交的父级...,则提交保持活动状态。如果没有,它可能会死。幸运的是,它不会很快死去。

所以这里是对你所做的事情及其意义的快速回顾!

% git add .
% git commit -m "Recycler View in Main Activity"
[detached HEAD 35b478b]

分离头模式意味着你所在的位置没有没有分支名称:你不是“在一个分支上”。在故事开始之前,你不知何故进入了分离的头部模式并做出了承诺。这并不违法,但非常不明智。我不知道你是如何或为什么对自己这样做的。

% git log
commit 35b478bf8761480eeed417d3fa8ae3bab44cfa36 (HEAD)
commit 6dfc1a1db723e268d967ebcf34a8dac45f41514b (Recycler-View)

看来你在这个父链上至少有两个提交:你刚刚创建的分离的一个,以及它之前的 Recycler-View 分支提交。

% git push -u origin Recycler_View
error:

你弄错了分支名称。它就在你面前!下次,尝试复制并粘贴分支名称。更好的是,切换到一个可以为您提供分支名称自动完成功能的 shell。

% git push -u origin Recycler-View

你得到了正确的分支名称,并推送。但是你推的是6dfc1a1。您还没有推送新的提交 35b478b,它仍然是分离的。

% git checkout cities_declared_in_activity_main
error:

没有这样的分支。

% git checkout cities_declared_in_activitymain

仍然没有这样的分支。为什么你甚至不分支名称是什么?该命令是(等待它)git branch!

% git log

找出真正的分支名称是一种愚蠢的方法,但它确实有效。

% git checkout cities_declared_in_main_activty
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

Git 正在尽可能大声地警告您,您将失去对提交 35b478 的所有命名访问权限。它是分离的!

好的,但你已经做到了。这是一个问题吗?不!不是马上。请记住,提交不会很快消失。提交仍然存在。让自己都振作起来,然后说

% git checkout 35b478

Presto,你丢失的提交又回来了!这一次,用它做一些合理的事情。一个分离的提交可以最终被删除,所以如果你不希望这种情况发生,拯救这个提交!最简单的第一步是,检查提交后,给它一个分支名称:

% git branch rescue

现在您可以决定如何处理已获救的提交。我不知道你的意图是什么,所以我无法为你提供建议。

【讨论】:

  • 标签的父母也不会死,不是吗?
  • 当然!但是即使带有标签的分离提交也不会将您置于“分支”上,因此您无法以通常的连贯方式添加和提交;你还是超然的。
【解决方案2】:

你的命令行显示你可以为提交创建一个分支

git branch <new-branch-name> 35b478b

这里,35b478b 是提交 ID。这意味着您也可以在使用时切换到新分支

git checkout 35b478b -b <new-branch-name>

没有分支的无头结帐将是

git checkout 35b478b

你可以看到提交

git reflog

这会列出您访问过的提交,而不仅仅是您最近历史中的提交。

你也可以通过

git checkout origin/Recycler-View

【讨论】:

  • @TTT。谢谢你的收获。我在移动设备上执行此操作,但出于某种奇怪的原因没有复制和粘贴。
猜你喜欢
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
相关资源
最近更新 更多