Git克隆存储库中的“reset”命令是什么?

17

我已经下载了一个代码库

git clone <address>

我已经进行了一些修改并编辑了一些文件,现在我想放弃所有更改,只确保磁盘上的内容不是代码库的原始远程版本之外的任何内容:什么是正确的命令?

3个回答

26

这里是长篇解释,以便您理解正在发生的事情:

假设远程名称为origin

git reset --hard HEAD
git checkout origin/master
git branch -D master
git checkout -b master

这段代码的作用是:

  1. (如果git status没有修改过的文件,则此步骤可选) 丢弃磁盘上所有已修改的文件 (这就是为什么要用reset --hard)

  2. 检出远程主分支 (注意: 您将处于“脱离头”状态)

  3. 删除本地的master分支 (抛弃您所有的本地更改)

  4. 将当前的HEAD命名为新的master分支

现在您可能想要做一些稍微不同的事情... 例如不要丢弃您的更改,而是将它们放在另一个命名的分支上... 毕竟您永远不知道何时会再次需要它们。

git checkout -b my-silly-changes
git branch -D master
git checkout -b master origin/master

这个命令将保存您当前的更改到名为my-silly-changes的新本地分支中,然后删除旧的名为master的本地分支,最后从远程头重新创建它。

对于那些认为自己知道在做什么的人,以下是解释:

这个单一命令:

git reset --hard origin/master

将放弃任何本地更改并将当前分支重新指向origin/master最近获取的状态。这与答案开头的四个命令具有完全相同的效果,但不会看到幕后的操作


15
你还应该执行 git clean -xfd 命令来删除所有未被跟踪的文件(编译生成物等)。 - Martin Baulig
2
前四个命令虽然正确,但是过于冗长。如果你在 master 分支上,只需执行 git reset --hard origin/master 命令即可完成与前四个命令相同的操作。不过,提到创建本地分支的选项还是值得一赞的。 - sleske
“我想要丢弃一切,只确保磁盘上的内容与代码库的原始远程版本完全一致。” - 上述方法似乎会在文件系统中留下未包含在克隆中的文件,例如使用autoreconfconfigure.ac生成的configure脚本。Git总是把简单的任务变得困难甚至不可能完成。 - jww
1
还有其他人觉得这应该是一个简单的命令而不是4个连续的命令吗? - Kellen Stuart

1

如果您确定要丢弃所有文件并且失去所有修改 (!),您可以执行以下操作:

git reset --hard origin/master

这将重置您本地的“主”分支和工作副本的状态,使其返回到您从上游(原始远程)获取的最后一个版本。

注意:

  • 您的上游存储库称为“origin”(git clone的默认设置)
  • 您正在克隆远程master分支

如果您正在使用除“master”之外的其他分支,请调整命令:

git reset --hard origin/branch1

0
如果您还没有提交任何内容,那么git reset --hard就足够了。 这里是一个很好的资源,解释了git reset及其不同模式(--hard、--mixed和--soft)的工作原理。
免责声明: git reset --hard是一项不安全的操作。它会从工作树中删除任何未提交的更改,并且无法撤消。

我想丢弃所有内容,并确保在磁盘上的代码库副本仅是原始远程版本。上述方法似乎会在文件系统中留下一些不属于克隆的文件,例如通过autoreconf从configure.ac生成的configure脚本。让Git完成一个简单的任务,并使它变得困难或不可能。 - jww

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