如何丢弃对分支所做的所有更改?

Posted

技术标签:

【中文标题】如何丢弃对分支所做的所有更改?【英文标题】:How to discard all changes made to a branch? 【发布时间】:2011-06-17 08:01:33 【问题描述】:

我在一个分支中工作(即design)并且我做了一些更改,但我需要将它们全部丢弃并重新设置以匹配存储库版本。我以为 git checkout design 会这样做,但它只是告诉我我已经在分支 design 中,并且我有 3 个修改过的文件。

我将如何丢弃这些更改并获得远程服务器上的分支?

【问题讨论】:

这是我对相关问题的回答的链接:***.com/questions/22620393/… 【参考方案1】:

注意:您无法撤消此操作。

尝试git checkout -f,这将丢弃ALL分支和主控中提交的任何本地更改。

【讨论】:

成功了!谢谢!我一直试图检查,但它不会让我。它一直说我必须“提交”或“隐藏”,但我想做的就是把我所做的每一个改变都扔掉。这行得通!谢谢。【参考方案2】:

git reset --hard 如果您想丢弃自上次提交以来的所有内容,可以为您提供帮助

【讨论】:

git reset --hard HEAD^ git reset --hard HEAD^ 确实应该是公认的答案。 OP 没有询问其他分支... 我试过了,我认为它删除了自上次推送以来的所有内容,而不仅仅是我上次提交。 我尝试了 git reset --hard HEAD^ ,但它仍然留下了一堆未跟踪的文件。现在谷歌如何通过一个简单的命令删除它们。【参考方案3】:
git diff master > branch.diff
git apply --reverse branch.diff

【讨论】:

如果您的目标是将特定分支的状态设置为与主分支相同,这些步骤可能非常有用。为此,请在特定分支中运行它,然后使用 git rm [branch name].diff 删除 [分支名称].diff 文件【参考方案4】:

如果您不想在design 中进行任何 更改,并且绝对希望它只匹配远程分支,您也可以删除该分支并重新创建它:

# Switch to some branch other than design
$ git br -D design
$ git co -b design origin/design            # Will set up design to track origin's design branch

【讨论】:

还有:git checkout design; git reset --hard origin/design 我也会在删除分支之前提交 如果你在本地分支中提交了不在远程的提交,在我看来,这是进入真正令人困惑的情况的秘诀。我绝对不会使用这个解决方案。 @erewok:嗯,这个问题确实明确表示提问者想要放弃所有更改。 @erewok:但是如果你在 repulling 之后得到这些提交,那么你不是“放弃提交以匹配存储库版本”吗?换句话说,如果它们在远程仓库中并且您在拉取后得到它们,那么您正在做这个问题想要 做的事情。如果您还想从远程存储库中删除它们,那么是的,您必须执行更多命令——但这不是这个问题要问的。它希望本地分支与远程分支匹配。【参考方案5】:

@Will, git immersion 是一个非常好的和简单的 git 教程。它将向您展示如何在以下情况下撤消更改:未暂存、暂存和已提交。实验室 14-18

【讨论】:

我只想说我现在已经完成了 git immersion .. 一年多之后。喂!我应该早点这样做...... 这需要安装Ruby..这似乎并不总是一个选择 请在本帖中添加相关信息,以免在链接失效之日,答案就死掉了。【参考方案6】:

在源根目录中: git reset ./ HEAD <--un-stage any staged changes git checkout ./ <--discard any unstaged changes

【讨论】:

【参考方案7】:

当您想丢弃本地分支中的更改时,可以使用 git stash 命令存储这些更改。

git stash save "some_name"

您的更改将被保存,您可以在以后检索这些更改,如果您愿意,也可以将其删除。 完成此操作后,您的分支将不会有任何未提交的代码,您可以使用 git pull 从主分支中拉取最新代码。

【讨论】:

【参考方案8】:

丢弃所有更改的可逆方法:

我在合并后发现了这个问题,然后忘记了结帐develop。你猜对了:我开始直接在 ma​​ster 上修改一些文件。哦!由于我的情况并非独一无二(我们都做到了,不是吗 ;->),我将提供一种可逆的方式,我曾经放弃所有更改以获取 ma​​ster 看起来又像 develop

在执行git diff 以查看修改了哪些文件并评估了我的错误范围后,我执行了:

git stash
git stash clear

首先存储所有更改后,接下来将其清除。对 ma​​ster 错误文件所做的所有更改均已消失,奇偶校验已恢复。

假设我现在想恢复这些更改。我可以做这个。第一步是找到我刚刚清除/丢弃的存储的哈希:

git fsck --no-reflog | awk '/dangling commit/ print $3'

学习hash后,我成功恢复了未提交的更改:

git stash apply hash-of-cleared-stash

我并不是真的想恢复这些更改,只是想验证我可以恢复它们,所以我再次清除它们。

另一个选项是apply the stash to a different branch,而不是擦除更改。因此,在清除因在错误分支上工作所做的更改方面,stash 为您提供了很大的灵活性,可以从您的 boo-boo 中恢复。

无论如何,如果您想要一种清除分支更改的可逆方法,那么在这个用例中,上述方法是一种不太危险的方法。

【讨论】:

【参考方案9】:

git checkout -f

这足以解决您的问题。唯一的事情是,一旦完成,它就完成了。没有撤消。

【讨论】:

【参考方案10】:

对于其他人,如果您只想还原单个文件的更改:

git restore <fileName>

【讨论】:

【参考方案11】:

因此,这里有许多旧答案。我将向您展示如何在 2021 年在一个分支上重新开始:

当您进行了数十次提交并更改了数十个文件并且您需要重置时

git checkout master
git pull origin master
git checkout -b feat-foo-v2 # make a second version of feat-foo branch

现在你有了一个新的分支。但是您可能仍然做了很多工作仍然很好,您只需要拉入 那些 文件。在您的 root git 目录中:

git checkout feat-foo -- path/to/file/to/be/used.java

现在您拥有来自旧分支的单个文件的副本。多做几次,旧的分支就会过时。现在您可以随意删除该分支,并将feat-foo-v2 重命名为feat-foo

假设您有一个包含一些更改的文件,并且您只想提取其中的 一些 更改。我建议熟悉git checkout 上的--patch 选项:

git checkout -p feat-foo -- path/to/file.java

将打开一个对话框,允许您选择要保留的文件更改的部分。

当你不能只创建一个新分支时 出于某种原因,您只是迷恋于您的功能分支并且您不愿意或无法放弃它。您知道您需要重置一些文件,但您不需要重置整个文件。创建一个全新的分支实际上只是一个不必要的步骤。我们可以从 master 中提取 fresh 文件:

git checkout master -- path/to/file.java

现在一个文件被重置了!如果您只想重置文件的部分--patch 应该以同样的方式工作。

【讨论】:

【参考方案12】:

rm -rf &lt;working dir&gt; 后跟 git clone &lt;repo&gt;.git 怎么样

在阅读了所有这些建议后,这正是我最终所做的,而且效果很好!

【讨论】:

从头开始重置整个项目只是为了撤消文件中的更改不是解决方案。请使用git restoregit stash

以上是关于如何丢弃对分支所做的所有更改?的主要内容,如果未能解决你的问题,请参考以下文章

Git:仅合并在分支上所做的更改

如何运行 git log 以仅查看特定分支的更改?

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

如何恢复从一个分支合并的所有提交

如何移动我的 GitHub 分支,然后在当前的 master 上工作?

显示直接提交到分支的提交,忽略 Git 中的合并