我试图学习如何恢复或回滚文件和项目到以前的状态,不理解git恢复,签出和重置之间的区别。为什么会有3个看起来相同的命令,什么时候人们应该选择其中一个而不是另一个?
当前回答
假设你有commit:
C
B
A
git恢复B,将创建一个提交,撤销B中的更改。
git恢复A,将创建一个撤销A中的更改的提交,但不会触及B中的更改
请注意,如果B中的更改依赖于A中的更改,则不可能恢复A。
git重置——软A,将改变提交历史和存储库;暂存和工作目录将仍然处于C状态。
git重置——混合A,将改变提交历史,存储库和staging;工作目录仍然处于C状态。
git重置——硬A,将改变提交历史,存储库,暂存和工作目录;你会完全回到A的状态。
其他回答
假设你有commit:
C
B
A
git恢复B,将创建一个提交,撤销B中的更改。
git恢复A,将创建一个撤销A中的更改的提交,但不会触及B中的更改
请注意,如果B中的更改依赖于A中的更改,则不可能恢复A。
git重置——软A,将改变提交历史和存储库;暂存和工作目录将仍然处于C状态。
git重置——混合A,将改变提交历史,存储库和staging;工作目录仍然处于C状态。
git重置——硬A,将改变提交历史,存储库,暂存和工作目录;你会完全回到A的状态。
Git恢复用于撤销之前的提交。在git中,你不能修改或删除之前的提交。(实际上你可以,但这会带来问题。)因此,与编辑之前的提交不同,revert引入了一个新的提交,该提交反转了之前的提交。 Git重置用于撤销尚未提交的工作目录中的更改。 Git签出用于将文件从其他提交复制到当前工作树。它不会自动提交文件。
我将尝试回答这个问题,git恢复添加到它
假设你有以下提交历史记录:
D
C
B
A
总revert:
进行反向提交。Git revert commit-hash不会改变你的提交历史,但会生成一个新的提交,该提交将还原作为提交的一部分提交的更改
git恢复B,将创建一个提交,撤销B中的更改
reverse-B
D
C
B
A
如果提交C依赖于提交B, git恢复B将导致合并冲突
建议:git revert功能用于恢复公共提交。所有其他撤销更改的方法都有可能更改提交历史记录,这可能会与项目的其他参与者产生问题。Git revert是在不影响提交历史的情况下撤销更改的方法
Git 还原:
Git恢复可以帮助您将文件从提交/staging区域移动到工作树/staging区域
命令为git restore[——source=commit-hash][——worktree][——staging][——]文件
——worktree表示还原到工作树 - staging表示将恢复到- staging。 同时指定——staging和——工作树,以便从——source恢复到工作树和staging区域 当指定——source时,始终从源进行恢复 当没有指定——source并且给出——staging时,将从HEAD恢复 当既没有指定——source也没有指定——staging时,将从staging区域恢复到工作树
建议-使用git restore将文件从
将blob提交到staging区域和/或工作树。 舞台区域到工作树
Git签出提交散列:
请注意,虽然git checkout有一个文件级的实现,它可以帮助你将文件从提交区域拉到staging区域或工作树中,但我们不会讨论这个,因为现在这是git restore命令的职责,它被精确地设计为整理和保持git checkout命令的一致性。
git checkout commit-hash -头被移动到指向提交哈希。总是让你处于一种超然的头脑状态。 git checkout branch -头被移动到指定的分支,现在它不是处于分离状态
建议:使用git签出查看树周围的各种提交,并在分支之间切换
Git重置commit-hash:
你处于一个分离的head状态- git重置会将head移动到指定的commit-hash。就像git checkout commit-hash一样 你不是在一个分离的头状态- git重置将整个(head ->分支)移动到指定的提交哈希。如果这导致提交之前没有任何分支,那么这些提交将从git历史记录中删除
Git重置也有三个选项——软、混合、硬。你的工作树和索引(暂存区)应该是什么样子,一旦你移动你的头到一个不同的提交?
——hard——工作树和索引都匹配你移动到的新提交中的文件 ——mixed(默认)-工作树保持在你运行git重置之前,索引匹配你移动到的新提交中的文件 ——软Worktree和索引都保持在他们之前跑git重置
git reset大部分可以使用git checkout, git branch -D和git restore的组合来复制,除了没有简单的方法来控制工作树和停滞区域的内容,除非你不使用git reset
建议:您是否做了一些不应该做的提交,并且没有将更改推到公共回购?如果这些提交从未存在过是不是最好的呢?使用git重置。如果您已经将更改推到public repo,那么正如前面讨论的那样,您希望使用git revert
Git签出修改你的工作树, Git重置修改你所指向的分支的引用, Git恢复添加了一个提交撤销更改。
这三个命令有完全不同的目的。它们一点都不相似。
git 还原
此命令创建一个新的提交,该提交将撤消上一次提交的更改。这个命令向项目添加新的历史记录(它不会修改现有的历史记录)。
去结帐
这个命令从存储库中签出内容,并将其放入工作树中。它还可以产生其他效果,具体取决于调用命令的方式。例如,它还可以更改当前正在处理的分支。该命令不会对历史进行任何更改。
去重置
这个命令稍微复杂一些。它实际上做了一些不同的事情,这取决于它是如何被调用的。它修改索引(所谓的“暂存区域”)。或者它改变了当前所指向的分支头。这个命令可能会改变现有的历史记录(通过改变分支引用的提交)。
使用这些命令
如果在项目历史的某个地方进行了提交,然后您决定提交是错误的,不应该执行,那么git恢复就是该工作的工具。它将撤销错误提交所带来的更改,并在历史记录中记录“撤销”。
如果您在工作树中修改了一个文件,但还没有提交更改,那么您可以使用git签出来签出该文件的新存储库副本。
如果你已经提交了一次,但还没有与任何人共享,并且你决定不想要它,那么你可以使用git reset重写历史记录,让它看起来好像你从未提交过。
这些只是一些可能的使用场景。还有其他命令在某些情况下也很有用,上面三个命令还有其他用途。
推荐文章
- RPC失败;卷度传输已关闭,剩余未完成的读取数据
- 我应该在.gitignore文件中添加Django迁移文件吗?
- 错误:您对以下文件的本地更改将被签出覆盖
- Git rebase—即使所有合并冲突都已解决,仍然会继续报错
- 在Git中,我如何知道我的当前版本是什么?
- 跟踪所有远程git分支作为本地分支
- 自定义SSH端口上的Git
- git如何显示不存在于.gitignore中的未跟踪文件
- Git错误:遇到7个文件应该是指针,但不是
- GitHub克隆与OAuth访问令牌
- 移动(或“撤销”)最后一个git提交到非暂存区域
- 我可以在GitHub上对要点进行拉请求吗?
- Hg:如何做一个像git的rebase
- 如何丢弃远程更改并将文件标记为“已解决”?
- 如何查看远程标签?