git reset revert rebase区别

reset

通常我们从其他分支开发完之后合并到master上线。突然发现上线有有bug,我们需要回滚,这个时候就会用到reset;
比如我分别有三次提交。最后一次有bug


image.png

通过git log可以看到第三次增加3.txt这个文件,假如是造成线上问题的提交。那么我需要回滚增加2.txt的那一次提交。复制commit b67a525b6478dd406e72d06dc600c6d5534cc0a1

git reset b67a525b6478dd406e72d06dc600c6d5534cc0a1 --hard

当然reset 也有多个参数

  • --mixed 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
  • --soft 参数用于回退到某个版本
  • --hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交

revert

这次我们提交上线了,但是没有及时发现bug,然后又另外的小伙伴在我们之后也有上线。这时突然发现我们的代码有问题,需要回滚,又不能回头后面小伙伴的代码。


image.png

比如我们要回退增加2,保留增加3;

git revert 45b4fc27ac2ab4e24c7164e19179e6a6740385a5

增加2的历史记录然后存在,但是revert会增加一次提交记录,需要我们修改commit;


image.png

此时 我们的项目里面增加2提交里面的修改已经还原了。如果和增加3有冲突的话,那就要我们手中解决了

rebase

有些人不喜欢 merge,因为在 merge 之后,commit 历史就会出现分叉,这种分叉再汇合的结构会让有些人觉得混乱而难以管理。如果你不希望 commit 历史出现分叉,可以用 rebase 来代替 merge

rebase 的意思是,给你的 commit 序列重新设置基础点(也就是父 commit)。展开来说就是,把你指定的 commit 以及它所在的 commit 串,以指定的目标 commit 为基础,依次重新提交一次。例如下面这个 merge:

git checkout branch1
git rebase master
git checkout master
git merge branch1

刚刚提交的代码,发现写错了怎么办?

当场再写一个修复这几个错别字的 commit?可以是可以,不过还有一个更加优雅和简单的解决方法:git commit --amend

"amend" 是「修正」的意思。在提交时,如果加上 --amend 参数,Git 不会在当前 commit 上增加 commit,而是会把当前 commit 里的内容和暂存区(stageing area)里的内容合并起来后创建一个新的 commit,用这个新的 commit 把当前 commit 替换掉。所以 commit --amend 做的事就是它的字面意思:对最新一条 commit 进行修正

git commit --amend

写错的不是最新的提交,而是倒数第二个?

git rebase -i HEAD^^

rebase -i 是 rebase --interactive 的缩写形式,意为「交互式 rebase」。

所谓「交互式 rebase」,就是在 rebase 的操作执行之前,你可以指定要 rebase 的 commit 链中的每一个 commit 是否需要进一步修改。

上面这行代码表示,把当前 commit ( HEAD 所指向的 commit) rebase 到 HEAD 之前 2 个的 commit 上:


image.png

image.png

操作指令从 pick 改成 edit 。 edit 的意思是「应用这个 commit,然后停下来等待继续修正」,用 git commit --amend 来把修正应用到当前最新的 commit。在修复完成之后,就可以用 rebase --continue 来继续 rebase 过程,把后面的 commit 直接应用上去。

使用方式是 git rebase -i 目标commit;
在编辑界面中指定需要操作的 commits 以及操作类型;
操作完成之后用 git rebase --continue 来继续 rebase 过程。

你可能感兴趣的:(git reset revert rebase区别)