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

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

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

【问题讨论】:

标签: git branch rollback


【解决方案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
              猜你喜欢
              • 2011-01-07
              • 1970-01-01
              • 2020-04-19
              • 1970-01-01
              • 2020-06-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多