如何丢弃对分支所做的所有更改?
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。你猜对了:我开始直接在 master 上修改一些文件。哦!由于我的情况并非独一无二(我们都做到了,不是吗 ;->),我将提供一种可逆的方式,我曾经放弃所有更改以获取 master 看起来又像 develop。
在执行git diff
以查看修改了哪些文件并评估了我的错误范围后,我执行了:
git stash
git stash clear
首先存储所有更改后,接下来将其清除。对 master 错误文件所做的所有更改均已消失,奇偶校验已恢复。
假设我现在想恢复这些更改。我可以做这个。第一步是找到我刚刚清除/丢弃的存储的哈希:
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 <working dir>
后跟 git clone <repo>.git
怎么样
在阅读了所有这些建议后,这正是我最终所做的,而且效果很好!
【讨论】:
从头开始重置整个项目只是为了撤消文件中的更改不是解决方案。请使用git restore
或git stash
以上是关于如何丢弃对分支所做的所有更改?的主要内容,如果未能解决你的问题,请参考以下文章