Git分支新手-如何撤销?

13

不确定这是否是正确处理分支的方式。

  • 我有一个在结构A上的应用程序。
  • 当我在结构A上工作时,我创建了一个Z分支(但我一直在主分支上工作)。
  • 在工作时(在主分支上),我更改了该结构并弄乱了所有内容。:)
  • 我从未提交过也没有将这些新文件添加到版本库中。

请求:

  • 我需要还原到最后一次提交的现有结构。撤消所有未提交的更改,并删除可能添加的新文件和文件夹。

如何实现?

3个回答

15
如果你创建了一个独立分支,但出现了问题,你只需要切换回之前的分支:git checkout A(假设 A 是你之前所在的分支名...或者可能是 master)。
如果需要,你可以稍后删除错误的分支:git branch -d <branchname>,如果有未合并的提交,则可以加上 -f 参数。 编辑: 如果你的代码库中存在要删除的不良更改,可以使用git reset --hard HEAD 来撤销它们。如果有新文件(没有被 git 追踪),git clean -fd 将全部删除它们。显然,请谨慎使用,因为它们将无法通过 git 恢复。

@MEM - 主分支上有错误提交吗?如果没有,那么在主分支上执行 git reset --hard 将撤销任何未提交的更改。如果您已经提交了错误的提交,请使用 git revert <badcommit> 来撤销它们。一旦将主分支回滚到“良好”状态,您可以在主分支上执行 git merge A,希望能够修复问题。如果您不知道错误提交在哪里,请查看 git bisect - 非常酷。 - Dan Breen
@Dan - 我已经执行了 git reset --hard 命令,但是我看到一些文件在分支创建后被创建了(但没有提交)。也许我应该做些其他的事情? - MEM
@MEM - 你需要这些文件吗?如果它们从未在git中,并且不需要,只需从文件系统中删除它们。也许我们对你的存储库状态没有达成一致。也许更新你的帖子,附上一些来自git status/branch等的输出。 - Dan Breen
1
@MEM 我刚刚尝试了 git clean -fd,它将删除所有未跟踪的文件。我不知道 netbeans 是否使用该命令或手动执行,但以后可以参考一下。 - Dan Breen
@MEM - 是的,那些没有被Git管理的文件,包括尚未提交的新文件以及任何在.gitignore文件中的文件。我将把这个答案添加到我的回答中,您可能需要编辑问题并使用一些更新的术语,以便其他遇到相似情况的用户可以找到它。 - Dan Breen
显示剩余3条评论

6
我需要将分支Z上的结构A“快照”反转。
$ git checkout A
$ git branch -d Z
$ git branch Z
$ git reset --hard HEAD~3
$ git checkout Z

在英文中:

删除您的 "Z" 分支,并从 "A" 的当前状态重新创建它。

将您的 A 分支重置回三个提交。这只是一个示例——三可能不是要重置到的正确历史深度。将该数字更改为正确的数字(并使用 git log 来找出您的分支偏离的提交数量)。

切换到您的 Z 分支,确认以前在 "A" 中的更改现在在 "Z" 中。


很抱歉浪费了您的时间。事实上,我提了一个不好的问题。但是,如果您不介意的话,请不要删除您的回答,因为它肯定是有用的。 - MEM

3

我猜想你只是用以下命令创建了分支:

git branch Z

如果你想要创建并切换到一个分支,可以使用git checkout命令的-b参数来创建分支并切换到它,例如:

git checkout -b Z

现在你需要做的是撤销你已经提交到主分支的更改。这将撤销该提交并使索引看起来就像在提交之前一样:

git checkout master
git reset --soft HEAD^

然后切换到 Z 分支并从索引(已暂存)提交更改:

git checkout Z
git commit -m "blah blah"

希望这能帮到你。
哦,对了,除非是简单的错误修复,否则避免直接在主分支上工作。

请保留您的答案,因为它包含我必须理解的重要概念。但那没用。我需要做的是:获取分支Z并将其放置为主分支 - 这可能吗?

当然可以。你可以用很多不同的方式来实现这个目标。如果只有一个提交,你可以将Z分支合并到主分支中,以将该提交合并到主分支中。但我假设你根本不想在Z分支上提交。那么你可以做同样的事情,但切换分支,例如:
git checkout Z
git reset --soft HEAD^
git checkout master
git commit -m "blah blah"

请保留您的答案,因为它包含我必须理解的重要概念。那个方法不起作用。我需要做的是:获取分支Z并将其放置为主分支 - 这可能吗? - MEM
非常感谢Magnus。很抱歉这一切的混乱。(我最终意识到)在git的术语中,我并不知道自己在寻找什么。再次道歉。 - MEM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接