我试图学习如何恢复或回滚文件和项目到以前的状态,不理解git恢复,签出和重置之间的区别。为什么会有3个看起来相同的命令,什么时候人们应该选择其中一个而不是另一个?


当前回答

这三个命令有完全不同的目的。它们一点都不相似。

git 还原

此命令创建一个新的提交,该提交将撤消上一次提交的更改。这个命令向项目添加新的历史记录(它不会修改现有的历史记录)。

去结帐

这个命令从存储库中签出内容,并将其放入工作树中。它还可以产生其他效果,具体取决于调用命令的方式。例如,它还可以更改当前正在处理的分支。该命令不会对历史进行任何更改。

去重置

这个命令稍微复杂一些。它实际上做了一些不同的事情,这取决于它是如何被调用的。它修改索引(所谓的“暂存区域”)。或者它改变了当前所指向的分支头。这个命令可能会改变现有的历史记录(通过改变分支引用的提交)。

使用这些命令

如果在项目历史的某个地方进行了提交,然后您决定提交是错误的,不应该执行,那么git恢复就是该工作的工具。它将撤销错误提交所带来的更改,并在历史记录中记录“撤销”。

如果您在工作树中修改了一个文件,但还没有提交更改,那么您可以使用git签出来签出该文件的新存储库副本。

如果你已经提交了一次,但还没有与任何人共享,并且你决定不想要它,那么你可以使用git reset重写历史记录,让它看起来好像你从未提交过。

这些只是一些可能的使用场景。还有其他命令在某些情况下也很有用,上面三个命令还有其他用途。

其他回答

重置, 在提交级别,重置是一种将分支的尖端移动到不同提交的方法。这可用于从当前分支删除提交。

回复- - - - - - 还原通过创建一个新的提交来撤销一个提交。这是一种安全的撤销更改的方法,因为它没有机会重写提交历史。 相比之下,git重置会改变现有的提交历史。出于这个原因,应该使用git revert来撤销公共分支上的更改,而应该保留git reset来撤销私有分支上的更改。

你可以看看这个链接- 重置,签出和恢复

这三个命令有完全不同的目的。它们一点都不相似。

git 还原

此命令创建一个新的提交,该提交将撤消上一次提交的更改。这个命令向项目添加新的历史记录(它不会修改现有的历史记录)。

去结帐

这个命令从存储库中签出内容,并将其放入工作树中。它还可以产生其他效果,具体取决于调用命令的方式。例如,它还可以更改当前正在处理的分支。该命令不会对历史进行任何更改。

去重置

这个命令稍微复杂一些。它实际上做了一些不同的事情,这取决于它是如何被调用的。它修改索引(所谓的“暂存区域”)。或者它改变了当前所指向的分支头。这个命令可能会改变现有的历史记录(通过改变分支引用的提交)。

使用这些命令

如果在项目历史的某个地方进行了提交,然后您决定提交是错误的,不应该执行,那么git恢复就是该工作的工具。它将撤销错误提交所带来的更改,并在历史记录中记录“撤销”。

如果您在工作树中修改了一个文件,但还没有提交更改,那么您可以使用git签出来签出该文件的新存储库副本。

如果你已经提交了一次,但还没有与任何人共享,并且你决定不想要它,那么你可以使用git reset重写历史记录,让它看起来好像你从未提交过。

这些只是一些可能的使用场景。还有其他命令在某些情况下也很有用,上面三个命令还有其他用途。

Git签出修改你的工作树, Git重置修改你所指向的分支的引用, Git恢复添加了一个提交撤销更改。

Git恢复用于撤销之前的提交。在git中,你不能修改或删除之前的提交。(实际上你可以,但这会带来问题。)因此,与编辑之前的提交不同,revert引入了一个新的提交,该提交反转了之前的提交。 Git重置用于撤销尚未提交的工作目录中的更改。 Git签出用于将文件从其他提交复制到当前工作树。它不会自动提交文件。

假设你有commit:

C
B
A

git恢复B,将创建一个提交,撤销B中的更改。

git恢复A,将创建一个撤销A中的更改的提交,但不会触及B中的更改

请注意,如果B中的更改依赖于A中的更改,则不可能恢复A。

git重置——软A,将改变提交历史和存储库;暂存和工作目录将仍然处于C状态。

git重置——混合A,将改变提交历史,存储库和staging;工作目录仍然处于C状态。

git重置——硬A,将改变提交历史,存储库,暂存和工作目录;你会完全回到A的状态。