git - 解释“git reset”?

  显示原文与译文双语对照的内容

我看到了有趣的文章解释了关于 git reset的一些微妙的解释。

不幸的是,我对它的阅读越多,我就越不理解它。 我来自一个SVN背景,Git是一个全新的范例。 我很容易找到 mercurial,但是Git更技术。

我认为 git reset 接近 hg revert,但似乎有区别。

那么 git reset 到底做了什么? 请详细说明:

  • 选项 --hard--soft--merge
  • 用于 HEAD的奇怪表示法,例如 HEAD^HEAD~1
  • 具体用例和工作流程;
  • 对工作副本,HEAD 和你的全球应力水平的影响。
时间:

记住,在 git 中,你有:

  • HEAD 指针,它告诉你你正在做什么
  • 工作树,代表你系统上的文件状态
  • 暂存区 ( 也称为指数 ),"阶段"变化,这样他们以后可以一起提交

请详细说明:

--hard--soft--merge

按dangerous-ness的递增顺序:

  • --soft 移动 HEAD,但不触摸临时区域或者工作树。
  • --mixed 移动 HEAD 并更新临时区域,但不更新工作树。
  • --merge 移动 HEAD,重置临时区域,并尝试将工作树中的所有更改移动到新工作树。
  • --hard 移动 HEAD 和调整你的临时区域和工作树到新的HEAD,丢弃所有的东西。

具体用例和工作流;

  • 使用 --soft 当你想搬到另一个没有"失去你的位置"提交和修补。 很难得你需要这个。

- -


# git reset --soft example
touch foo//Add a file, make some changes.
git add foo//
git commit -m"bad commit message"//Commit... D'oh, that was a mistake!
git reset --soft HEAD^//Go back one commit and fix things.
git commit -m"good commit"//There, now it's right.

- -

  • 当你想查看另一个提交时的样子时,使用 --mixed ( 这是默认的),但是你不想丢失已经有的更改。

  • 当你想移动到一个新的位置,但将你已经包含的更改合并到工作树中时使用 --merge

  • 使用 --hard 清除所有内容,并在新提交时重新开始。

post 重置启发在博客 Pro Git给一个非常 no-brainer git resetgit checkout 解释。

在文章顶端进行了所有有益的讨论之后,作者将规则缩减为以下简单的三个步骤:

reset 命令以特定顺序覆盖这三个树,当你告诉它。

  1. 移动任何分支头指向( 如果 --soft )
  2. 然后,让索引看起来像这样( 除非 --hard )
  3. 然后,让工作目录看起来像

还有 --merge--keep 选项,但我宁愿让事情更简单- 这将是另一篇文章。

当你向git提交某些内容时,你首先必须阶段化你的更改。 这意味着你必须在git认为它们是提交的一部分之前,添加要包含在这个提交中的所有文件。 让我们先看看一个git仓库的映像: enter image description here

所以,现在很简单了。我们必须在工作目录中工作,创建文件,目录和所有。 这些更改未跟踪更改。 要使它们被跟踪,我们需要将它们添加到git索引中,方法是使用的git添加命令。 将它们添加到git索引后。 我们现在可以提交这些更改,如果我们想将它的推送到git仓库。

但是突然我们知道了 commiting,我们有一个额外的文件,我们在索引中添加了一个额外的文件,不需要在git仓库中添加。 这意味着我们不希望该文件在索引中。 现在的问题是如何从git索引删除该文件,因为我们使用git索引中添加把他们是逻辑使用rm git? 错误将只删除文件并将删除添加到索引。 现在要做什么:

使用:-

yf_terminology_git reset@#@#@#git reset_yf_terminology

它会清除你的索引,使你的工作目录不被改动。 ( 简单的unstaging ) 。

它可以与它的选项数量一起使用。 有三个主要选项使用 git reset: --hard,--soft和 --mixed 。 当你重置时,这些影响会影响到头部指针的复位。

首先,--hard 重置所有的东西。 你当前的目录将是完全一样的,如果你一直跟随那个分支。 工作目录和索引更改为提交。 这是我经常使用的版本。 git reset --hard有点像svn恢复

接下来,完全相反的—soft 不会重置工作树或者索引。 它只移动头部指针。 这将使你的当前状态与你在目录中切换到的提交不同,并且"暂存"用于提交。 如果你在本地进行提交,但没有将提交推送到git服务器,则可以重置为上一个提交,并且recommit具有良好的提交消息。

最后, --mixed重置指数,但不是工作树。 所以这些更改都仍然存在,但"撤回"是必需的,也可能是git添加的或者英镑的git提交 -a 。 我们有时会使用这一点,如果我们超过了与git提交-a的承诺,我们可以用 git reset --mixed来撤销提交,添加我们想要提交的东西,并提交那些。

git恢复和 git reset :-


简单的话说, git reset 是一个命令 "fix-uncommited错误"git恢复是命令 "fix-commited错误"

这意味着如果我们有一些错误在某些变化和提交,将相同的git存储库,然后git恢复解决方案。 如果在推送/commiting之前发现了同样的错误,我们可以使用 git reset 来解决这个问题。

我希望它能帮助你摆脱你的困惑。

...