haz*_*ziz 251 git git-revert git-checkout git-reset
我想了解如何重新恢复或回滚文件和项目到以前的状态,不明白之间的差别git revert,checkout和reset.为什么有3个不同的命令看似相同的目的,何时有人选择一个而不是另一个?
Dan*_*ing 436
这三个命令具有完全不同的目的.他们甚至没有相似之处.
git revert此命令创建一个新提交,撤消先前提交的更改.此命令将新的历史记录添加到项目中(它不会修改现有历史记录).
git checkout此命令检出存储库中的内容并将其放入工作树中.它还可以具有其他效果,具体取决于命令的调用方式.例如,它还可以更改您当前正在处理的分支.此命令不会对历史记录进行任何更改.
git reset这个命令有点复杂.它实际上做了几件不同的事情,具体取决于它是如何被调用的.它修改了索引(所谓的"临时区域").或者它改变了当前指向分支头的提交.此命令可能会更改现有历史记录(通过更改分支引用的提交).
如果在项目的历史记录中的某个位置进行了提交,并且您稍后认为提交是错误的并且不应该完成,那么这git revert是该工作的工具.它将撤消错误提交引入的更改,在历史记录中记录"撤消".
如果您已在工作树中修改了文件,但尚未提交更改,则可以使用git checkout签出文件的新存储库副本.
如果您已经提交,但没有与其他任何人共享,并且您决定不想要它,那么您可以使用git reset重写历史记录,使其看起来好像您从未进行过提交.
这些只是一些可能的使用场景.在某些情况下,还有其他命令可用,而上述三个命令也有其他用途.
Aka*_*all 32
假设你有提交:
C
B
A
Run Code Online (Sandbox Code Playgroud)
git revert B,将创建一个撤消更改的提交B.
git revert A,将创建一个撤消更改的提交A,但不会触及更改B
请注意,如果更改B取决于更改A,A则无法进行还原.
git reset --soft A,将更改提交历史记录和存储库; 暂存和工作目录仍将处于状态C.
git reset --mixed A,将更改提交历史记录,存储库和暂存; 工作目录仍将处于状态C.
git reset --hard A,将更改提交历史,存储库,登台和工作目录; 你会回到A完全的状态.
Jon*_*han 29
git revert用于撤消先前的提交.在git中,您无法更改或删除先前的提交.(实际上你可以,但它可能会导致问题.)因此,revert不是编辑早期的提交,而是引入了一个新的提交,它反转了之前的提交.git reset 用于撤消尚未进行调试的工作目录中的更改.git checkout用于将文件从其他一些提交复制到当前工作树.它不会自动提交文件.dan*_*rth 20
git checkout 修改你的工作树,git reset 修改你所指向的分支的哪个引用,git revert 添加提交撤消更改.fig*_*uts 11
我会尝试回答这个问题并git restore添加到它
假设您有以下提交历史记录:
D
C
B
A
Run Code Online (Sandbox Code Playgroud)
git revert:
进行反向提交。git revert commit-hash不会更改您的提交历史记录,而是进行新的提交,以恢复作为提交一部分提交的更改
git revert B,将创建一个撤消 中更改的提交B。Git 历史帖子将会是
reverse-B
D
C
B
A
Run Code Online (Sandbox Code Playgroud)
如果 commitC依赖于 commitB git revert B将导致合并冲突
建议:git revert旨在恢复公共提交。撤消更改的所有其他方法都有可能改变提交历史记录,这可能会导致项目其他参与者出现问题。git revert是在不干扰提交历史记录的情况下撤消更改的方法
git restore:
git restore帮助您将文件从提交/暂存区域移动到工作树/暂存区域
命令是 git Restore [--source=commit-hash] [--worktree] [--staged] [--] 文件
建议 - 用于git restore从以下位置获取文件
git checkout commit-hash:
请注意,虽然有一个文件级实现git checkout可以帮助您将文件从提交拉到暂存区域或工作树中,但我们不会讨论这一点,因为现在这是命令的责任git restore,它的设计正是为了整理和制作与命令一致git checkout。
git checkout commit-hash- 头部被移动以指向提交哈希。总是让你处于一种超然的头脑状态。git checkout branch- 头被移动到指向指定的分支,并且现在不处于分离状态建议:用于git checkout查看树周围的各种提交并在分支之间切换
git reset commit-hash:
git reset会将 移动HEAD到指定的位置commit-hash。就像git checkout commit-hashgit reset将整个移动(HEAD -> branch)到指定的位置commit-hash。如果这导致commits前面没有分支,那么这些提交将从 git 历史记录中删除git reset也有三个选项--soft,,--mixed。一旦您将工作树和索引(暂存区域)移至不同的提交,--hard您的工作树和索引(暂存区域)应该是什么样子?HEAD
--hard- 工作树和索引都与您移动到的新提交中的文件匹配--mixed(默认)- 工作树保持运行前的状态,git reset索引与您移动到的新提交中的文件匹配--soft- 工作树和索引都保持在运行之前的状态git resetgit reset大多数情况下可以使用 , 的组合来复制git checkout,git branch -D除了git restore没有简单的方法来控制工作树和 stagin-area 的内容,除非你不使用 git reset
建议:您是否进行了一些不应该进行的提交,并且没有将更改推送到公共存储库?最好就好像这些提交从未存在过一样吗?使用git reset。如果您已将更改推送到公共存储库,那么正如前面所讨论的,您想要使用git revert
如果您破坏了树但未提交代码,则可以使用git reset;如果您只想还原一个文件,则可以使用git checkout。
如果您破坏了树并提交了代码,则可以使用git revert HEAD。
http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html
| 归档时间: |
|
| 查看次数: |
84669 次 |
| 最近记录: |