工作区:即自己当前分支所修改的代码,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
git checkout -- a.txt # 丢弃某个文件,或者
git checkout -- . # 丢弃全部
git checkout – . 丢弃全部,也包括:新增的文件会被删除、删除的文件会恢复回来、修改的文件会回去。这几个前提都说的是,回到暂存区之前的样子。对之前保存在暂存区里的代码不会有任何影响。对commit提交到本地分支的代码就更没影响了。当然,如果你之前压根都没有暂存或commit,那就是回到你上次pull下来的样子了。
git reset HEAD .
git reset HEAD a.txt
这个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,工作区中的实际文件同该命令运行之前无任何变化
1、git reset --hard HEAD^ :重置stage区和工作目录
例如你在上次 commit 之后又对文件做了一些改动:把修改后的ganmes.txt文件add到stage区,修改后的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)
方式一:使用revert
git revert -n 版本号
然后重新push
原理: git revert是用于“重做”某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。如下图所示:
适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。
方式二:使用reset
git reset --hard HEAD^
git push 目标分支 本地分支 -f
此时如果用“git push”会报错,因为我们本地库HEAD指向的版本比远程库的要旧,要强制推送
情况一:修改的文件已被git commit
,但想再次修改不再产生新的Commit
# 修改最后一次提交
$ git add sample.txt
$ git commit --amend -m"说明"
原文:https://www.cnblogs.com/birdyBlob/p/13958151.html