首页 > 其他 > 详细

#Git撤销&回滚操作

时间:2020-11-11 13:51:47      阅读:36      评论:0      收藏:0      [点我收藏+]

git的工作流

工作区:即自己当前分支所修改的代码,git add xx 之前的!不包括 git add xx 和 git commit xxx 之后的。

暂存区:已经 git add xxx 进去,且未 git commit xxx 的。

本地分支:已经git commit -m xxx 提交到本地分支的。

语法格式

HEAD^:上一次提交
HEAD~n:之前的n次提交
HEAD ComitHash:目标版本号CommitHash

代码回滚

1、工作区

git checkout -- a.txt # 丢弃某个文件,或者
git checkout -- . # 丢弃全部

git checkout – . 丢弃全部,也包括:新增的文件会被删除、删除的文件会恢复回来、修改的文件会回去。这几个前提都说的是,回到暂存区之前的样子。对之前保存在暂存区里的代码不会有任何影响。对commit提交到本地分支的代码就更没影响了。当然,如果你之前压根都没有暂存或commit,那就是回到你上次pull下来的样子了。

2、 缓存区(代码git add到缓存区,并未commit提交)

git reset HEAD .
git reset HEAD a.txt

这个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,工作区中的实际文件同该命令运行之前无任何变化

3、本地库(git commit到本地分支、但没有git push到远程)

1、git reset --hard HEAD^ :重置stage区和工作目录

例如你在上次 commit 之后又对文件做了一些改动:把修改后的ganmes.txt文件addstage区,修改后的shopping list.txt保留在工作目录

技术分享图片

执行:git reset --hard HEAD^后,

你工作目录里的新改动和已经add到stage区的新改动也一起全都消失了:

技术分享图片

2、reset --soft:保留工作目录,并把重置 HEAD 所带来的新的差异放进暂存区

保留工作目录和暂存区中的内容,并把重置 HEAD 所带来的新的差异放进暂存区。

例子同上,假设此时当前 commit 的改动内容是新增了 laughters.txt 文件:

如果这时你执行:

git reset --soft HEAD^
技术分享图片

这就是--soft--hard 的区别:--hard 会清空工作目录和暂存区的改动,*而 --soft则会保留工作目录的内容,并把因为保留工作目录内容所带来的新的文件差异放进暂存区

3、reset 不加参数(mixed):保留工作目录,并清空暂存区

reset 如果不加参数,那么默认使用 --mixed 参数。它的行为是:保留工作目录,并且清空暂存区。也就是说,工作目录的修改、暂存区的内容以及由 reset 所导致的新的文件差异,都会被放进工作目录。简而言之,就是「把所有差异都混合(mixed)放在工作目录中」。

例子:新增了 laughters.txt 文件

这时如果你执行无参数reset或者带--mixed参数:

git reset HEAD^
git reset --mixed HEAD^

工作目录的修改、暂存区的内容以及由 reset 所导致的新的文件差异,都会被放进工作目录

![](Git撤销&回滚操作(git reset 和 get revert).assets/2196407-20201111120755845-1712549243.png)

reset三种模式区别

  1. --hard:重置位置的同时,直接将 working Tree工作目录index 暂存区repository 都重置成目标Reset节点的內容,所以效果看起来等同于清空暂存区和工作区。
  2. --soft:重置位置的同时,保留working Tree工作目录index暂存区的内容,只让repository中的内容和 reset 目标节点保持一致,因此原节点和reset节点之间的【差异变更集】会放入index暂存区中(Staged files)。所以效果看起来就是工作目录的内容不变,暂存区原有的内容也不变,只是原节点和Reset节点之间的所有差异都会放到暂存区中。
  3. --mixed(默认):重置位置的同时,只保留Working Tree工作目录的內容,但会将 Index暂存区Repository 中的內容更改和reset目标节点一致,因此原节点和Reset节点之间的【差异变更集】会放入Working Tree工作目录中。所以效果看起来就是原节点和Reset节点之间的所有差异都会放到工作目录中。

4、提交已经push到远程仓库

方式一:使用revert

git revert -n 版本号
然后重新push

原理: git revert是用于“重做”某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。如下图所示:

技术分享图片

适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。

方式二:使用reset

git reset --hard HEAD^
git push 目标分支 本地分支 -f

此时如果用“git push”会报错,因为我们本地库HEAD指向的版本比远程库的要旧,要强制推送

reset(回滚到)和revert(重做)的区别

  • revert是放弃指定提交的修改,但是会生成一次新的提交,需要填写提交注释,以前的历史记录都在;
  • reset是指将HEAD指针指到先前已存在的历史提交,历史记录中不会出现放弃的提交记录。

场景

情况一:修改的文件已被git commit,但想再次修改不再产生新的Commit

# 修改最后一次提交 
$ git add sample.txt
$ git commit --amend -m"说明"

#Git撤销&回滚操作

原文:https://www.cnblogs.com/birdyBlob/p/13958151.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!