协慌网

登录 贡献 社区

git reset --mixed,-soft 和 --hard 有什么区别?

我正在寻找一个提交,但不确定要使用哪个重置选项。

我一直在用通俗的英语看页面,“git reset” 有什么作用? ,但我意识到我不太了解 git 索引或暂存区,因此说明无济于事。

另外,-- --mixed--soft的用例在该答案中对我来说都是相同的(当您要修复和重新提交时)。有人可以进一步分解吗?我意识到--mixed可能是您可以选择的选项,但我想知道为什么。最后,-- --hard怎么样?

有人可以给我一个如何选择这三个选项的工作流程示例吗?

答案

当您修改存储库中的文件时,更改最初是未暂存的。 git add它(即,将其添加到索引中)。进行提交时,提交的更改就是已添加到索引的更改。

git reset至少会更改当前分支( HEAD )指向的位置。 --mixed--soft之间的区别在于您的索引是否也被修改。因此,如果我们在分支master上执行以下一系列提交:

- A - B - C (master)

HEAD指向C ,索引匹配C

当我们运行git reset --soft Bmaster (因此HEAD )现在指向B ,但是索引仍然具有C的更改; git status将它们显示为已暂存。因此,如果此时运行git commit ,我们将获得一个新的提交,其更改与C相同。


好的,所以从这里再次开始:

- A - B - C (master)

现在让我们做git reset --mixed B (注意:-- --mixed是默认选项)。再次, masterHEAD指向 B,但这一次索引也被修改以匹配B如果我们git commit HEAD ,将不会发生任何事情。我们仍在工作目录中进行更改,但是由于它们不在索引中,因此git status它们显示为未暂存。要提交它们,您可以git add ,然后照常提交。


最后, --hard相同--mixed (它改变了你的HEAD和索引),不同之处在于--hard也改变你的工作目录。如果我们在C并运行git reset --hard B C添加的更改以及您所做的任何未提交的更改,并且工作副本中的文件将与 commit B匹配。由于您可以通过这种方式永久丢失更改,因此git status ,以确保您的工作目录是干净的,或者可以丢失未提交的更改。


最后是可视化效果:在此处输入图片说明

用最简单的术语来说:

  • --soft取消提交更改,将更改暂存(索引)。
  • --mixed(默认)取消提交 + --mixed更改,更改保留在工作树中
  • --hard取消提交 + 取消登台 + 删除更改,一无所有。

请注意,这是一个简化的解释,旨在作为寻求了解此复杂功能的第一步。

对于希望在以下每个命令之后可视化其项目状态的视觉学习者可能会有所帮助:

鉴于: - A - B - C (master)


对于那些使用终端启用了颜色的用户(git config --global color.ui auto):

git reset --soft A ,您将看到 B 和 C 的内容为绿色(已暂存并准备提交)

git reset --mixed A (或git reset A ),您将看到 B 和 C 的内容为红色(未暂存并准备暂存(绿色),然后提交)

git reset --hard A ,您将不再在任何地方看到 B 和 C 的更改(就好像它们不存在一样)


或对于使用 GUI 程序(例如 “Tower” 或 “SourceTree”)的用户

git reset --soft A ,您将在 “暂存文件” 区域中看到 B 和 C 的内容准备提交

git reset --mixed A (或git reset A ),您将在 “未暂存的文件” 区域中看到 B 和 C 的内容,准备移至暂存并提交

git reset --hard A ,您将不再在任何地方看到 B 和 C 的更改(就好像它们不存在一样)