Git还原,检出和重置之间有什么区别?


273

我想学习如何回滚文件和项目或恢复到以前的状态,不明白之间的差别git revertcheckoutreset。为什么有3个不同的命令看似相同的目的,以及何时应该选择一个而不是另一个?

Answers:


461

这三个命令的用途完全不同。它们甚至都不遥不可及。

git revert

该命令将创建一个新的提交,以撤消对先前提交的更改。此命令将新历史记录添加到项目中(它不会修改现有历史记录)。

git checkout

该命令从存储库中检出内容,并将其放入您的工作树中。它也可能具有其他效果,具体取决于调用命令的方式。例如,它还可以更改您当前正在使用的分支。此命令不会对历史记录进行任何更改。

git reset

这个命令有点复杂。实际上,根据调用方式的不同,它会做很多不同的事情。它修改索引(所谓的“暂存区”)。或更改分支头当前指向的提交。此命令可能会更改现有历史记录(通过更改分支引用的提交)。

使用这些命令

如果在项目历史记录中的某个位置进行过提交,而您以后又认为该提交是错误的并且不应该进行,那么这git revert就是完成任务的工具。它将撤消由错误提交引起的更改,并在历史记录中记录“撤消”。

如果您已经在工作树中修改了文件,但是尚未提交更改,则可以git checkout用来签出文件的从存储库中复制的副本。

如果您进行了提交,但尚未与其他任何人共享,但是您决定不希望这样做,则可以使用它git reset来重写历史记录,以便看起来好像从未进行过该提交。

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


13
因此,可以使用这三个命令来撤消某些工作,这意味着它们并没有“完全不同”。相同的概念,不同的上下文。
布鲁诺·桑托斯

16
@BrunoSantos:烛台,铅管,匕首和绳索都可以用来谋杀人,但这并不意味着这些东西中的任何一个都特别相似。
Dan Moulding 2014年

12
@Dan Mounlding-实际上,在很多情况下git reset,它们git checkout可以做完全相同的事情。说它们“甚至不遥不可及”并不只是夸大其词:甚至都不是真的。这两个命令可以做很多不同的事情,其中​​有些完全重叠。示例:git reset --hardgit checkout -- .将做完全相同的事情。从逻辑上讲,git reset --hard <path>并且git checkout <path>还应该执行完全相同的操作-但是git会阻止您这样做。混淆这两个命令非常容易。
DanGordon

5
@DanGordon我意识到我们在这里可能会有所不同。不过,我觉得我应该提供一些解释。您不能完全按照git reset --hard <path>自己git checkout <path>的意愿去做,因为这两个命令所做的事情完全不同。git reset告诉Git将HEAD移动到另一个提交。git checkout另一方面,根本不要求Git对HEAD做任何事情。它仅保留HEAD,而仅检出文件。是的,您可以以使其具有相似效果的方式制作它们。但是他们实际所做的却完全不同。
Dan Moulding

46

假设您有提交:

C
B
A

git revert B会创建一个撤消。中的更改的提交B

git revert A,将创建一个撤消中的更改的提交A,但不会涉及到中的更改B

请注意,如果中的更改B取决于中的更改AA则无法还原。

git reset --soft A,将更改提交历史记录和存储库;暂存和工作目录仍处于状态C

git reset --mixed A,将更改提交历史记录,存储库和登台;工作目录仍处于的状态C

git reset --hard A,将更改提交历史记录,存储库,登台和工作目录;您将回到A完全的状态。


1
如此直观的答案..结帐如何
MJ Studio

29
  • git revert用于撤消先前的提交。在git中,您无法更改或删除较早的提交。(实际上,您可以,但是可能会导致问题。)因此,revert不会编辑较早的提交,而是引入了一个新的提交,该提交会撤销较早的提交。
  • git reset 用于撤消工作目录中尚未提交的更改。
  • git checkout用于将文件从其他提交复制到当前工作树。它不会自动提交文件。

7
我相信您对“ git reset”是错误的。“ git reset”将您的HEAD重置为先前的提交之一,它不会重置您的工作目录。工作目录通过“ git checkout [文件名]”“重置”
luigi7up 2014年

11
git reset --soft仅重置HEAD,git reset --hard重置HEAD和您的工作目录。
Ehryk

git reset --mixed(默认):取消提交+
取消分段

21
  • git checkout 修改您的工作树,
  • git reset 修改您所指向的分支所指向的参考,
  • git revert 添加撤消更改的提交。

4
git reset 不仅修改分支指向的提交,还用于取消索引中的文件,并且可以使用git reset --mixed(默认)修改工作副本。

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

6

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

还原- 还原通过创建新的提交撤消提交。这是撤消更改的安全方法,因为它没有机会重写提交历史记录。将此与git reset进行对比,后者会更改现有的提交历史记录。因此,应使用git revert撤消公共分支上的更改,而应保留git reset以撤消私有分支上的更改。

您可以在此链接上查看- 重置,签出和还原


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.