Hibop.github.io icon indicating copy to clipboard operation
Hibop.github.io copied to clipboard

Git 的rebase、reset、revert区别?

Open Hibop opened this issue 11 months ago • 1 comments

根据奥卡姆剃刀原则

Image

1. rebase:变基(不同分支操作)

git rebase 用于将一个分支的提交移到另一个分支上,并重新应用这些提交。主要有两种用途:

  • 整理提交历史:将多个小的提交合并成一个更为清晰的提交历史,避免不必要的历史混乱。

  • 将本地提交与远程同步:在拉取远程更改之前,通过 rebase 将本地提交移动到远程提交的后面,使历史更为干净。

git pull --rebase origin branch_name

Image feature是在提交点B处从master上拉出的分支 此时我们切换到feature分支上,执行rebase命令,相当于是想要把master分支合并到feature分支(这一步的场景就可以类比为我们在自己的分支feature上开发了一段时间了,准备从主干master上拉一下最新改动。模拟了git pull --rebase的情形)

这两条命令等价于git rebase master feature git checkout feature git rebase master

  • pick:重新安排pick命令的顺序会更改提交的顺序。如果选择不包括提交,则应删除整行(skip)这个会自动回退掉所有---谨慎操作
  • edit:如果您选择edit提交,则将有机会修改提交,这意味着您可以完全添加或更改提交。
  • squash:该命令使您可以将两个或多个提交合并为一个提交。提交被压缩到其上方的提交中。

找回git rebase --skip消失的代码,1.git reflog操作,查看提交的历史记录,找到自己的提交

2、reset:

git reset 用于移动 HEAD 指针和当前分支的引用,主要有三种模式:

–soft:只移动 HEAD 指针,不改变工作目录和暂存区,保留更改。 git reset --soft commit_hash –mixed(默认):移动 HEAD 指针和暂存区,但不改变工作目录,将更改放回工作目录。 git reset --mixed commit_hash –hard:移动 HEAD 指针、暂存区和工作目录,将所有更改丢弃。 git reset --hard commit_hash

3、revert

git revert 用于创建一个新的提交,用来撤销之前的提交。与 reset 不同,revert 不修改提交历史,而是创建新的提交来撤销之前的更改。 它不会改变过去的历史,所以是首选方式,没有任何丢失代码的风险。

区别总结:

rebase 用于修改提交历史的顺序,将一系列提交重新应用到新的基底上。 reset 用于移动 HEAD 指针,可以用来撤销提交、取消暂存区的更改或者彻底丢弃更改。 revert 用于创建新的提交,撤销之前的提交,不改变历史。 选择使用哪个命令取决于你的需求和工作流程。在共享的分支上使用 rebase 和 reset 时要小心,因为它们会改变提交历史,可能引发冲突。

Hibop avatar Jan 27 '25 07:01 Hibop

撤销修改分三种情况

  • 修改后,文件没有放入暂存区: git checkout -f 文件名 撤销工作区改动 另外一种方式:git revert <文件名>
  • 修改后,文件放入暂存区:git reset --mixed ${上一个提交},可以撤销到工作目录 Image

reset to this commit: 回退到上一个提交 revert change by this commit: 通过某个提交回退

Hibop avatar Jan 27 '25 09:01 Hibop