如何撤消 git 上的丢弃更改?

Posted

技术标签:

【中文标题】如何撤消 git 上的丢弃更改?【英文标题】:How to undone a discard changes on git? 【发布时间】:2019-10-12 00:22:22 【问题描述】:

当我注意到更改太大时,我正在主分支上工作,我决定应该在另一个分支上进行。所以我在 Git Bash 上做了git checkout -b new_branch_name 然后(没有在任何两个分支上提交)我丢弃了主分支上的所有更改(来自 Github Desktop)。令我惊讶的是,这也丢弃了新分支的更改,我以为它们没有链接。

如何撤消丢弃操作?

编辑:

更改:我尚未提交的内容。 丢弃:Github Desktop 允许我丢弃(删除)未提交的更改。

对不起,我的术语很糟糕,我是 git 新手。

【问题讨论】:

如果它们没有提交,则更改不属于任何分支。它们只是对文件的本地编辑。 【参考方案1】:

tl;dr:如有疑问:git stash.

我不确定你叫什么discard,因为这不在 git 术语中。另外,我不确定您所说的更改是什么意思。

所以我假设你所说的改变是指你已经完成但没有承诺的事情,即你有你的工作区或 索引脏

你在分支A

unstaged changes
      ↑
      A
      ↑
      …

并且您创建了一个新分支B

unstaged changes
       ↑
     A,B
       ↑
       …

然后你做了你所谓的丢弃,但实际上是当前分支的reset --hard

     A,B
       ↑
       …

如果是这样,那么我很遗憾地告诉您,您的更改已丢失。

永远消失了。

只要你还记忆犹新,你就应该赶紧重写它们。

您需要了解的是,当您操作 git 时,您正在处理以下级别的更改:

    您的工作区:您所做的任何更改都显示为 unstaged 您的索引:您为下一次提交添加的任何更改 你当前的分支:无论你提交了什么 远程分支:无论你推送什么

根据经验,如果它不在提交中(即 1. 或 2.),那么它可能会消失。否则,有解决办法。

但有时您希望在不进行新提交的情况下保护您的脏索引。这就是stash 的用途。所以每次你想玩分支时,你可以git stash 并且你的工作被保存,你的工作区和索引是干净的。完成后,您可以git stash pop 并再次找到您所做的更改。

根据您的说法,对最后一部分存在误解:本地更改和索引更改与分支无关,而是与您的文件系统相关。如果您更改分支,它们会保留在那里并应用于新分支(如果可能,否则您会收到错误消息)。

【讨论】:

长话短说:当您在原始分支上工作时,您在工作树上所做的更改,当您签出另一个分支时,git 在签出时携带它们......但他们仍会像切换分支之前一样未提交。如果你然后清理,那么......他们走了。

以上是关于如何撤消 git 上的丢弃更改?的主要内容,如果未能解决你的问题,请参考以下文章

Git重置(撤消、丢弃)文件变更

如果未提交,如何撤消“丢弃”

如何快速撤消 git 中的暂存和未暂存的更改?

如何在保留更改的同时撤消最后一次 git 提交? [复制]

如何撤消 git 中的最后一次提交,但保持我的更改未暂存?

git:撤消所有工作目录更改,包括新文件