git删除某次commit之rebase命令的使用

1,180 阅读4分钟

工作中可能会遇到开发过的功能代码不在下一个版本计划里,或者别的类似的需要把某个分支上已经提交的代码删除掉。可以使用git命令操作,避免人工操作哪些文件需要提交、哪些文件需要删除!

开发中每个提交最好对应一个完整的功能,这样对项目的管理很友好。也可以将 gitjire强制关联起来,以实现一次提交对应一个需求。

主要通过 rebase 交互式命令实现

具体步骤如下:

1、查看提交记录

git log --oneline -4
837534b (HEAD -> master, github/master, gitee/master) feat: 测试4
058eefb feat: 测试3
9b6619d feat: 测试2
a3d6ef0 feat: 测试1

2、交互式 rebase

使用Git的交互式rebase功能,我们可以删除中间提交。rebase是一种改变提交历史的方式。执行rebase时,我们可以编辑、删除和合并提交。

修改已经提交过的 commit message 信息也是通过 rebase 变基操作,把 【pick】修改成【edit】

要开始交互式rebase,我们可以使用以下命令:

git rebase -i <commitID>

假如要删除 【测试2】【测试3】的提交记录,我们可以把 commitID 写成【测试1】的 a3d6ef0

git rebase -i a3d6ef0

在交互式界面中,每个提交之前都有一个关键字pick。要删除某个提交,我们只需要将关键字改为drop

保存并关闭交互式界面后,Git会执行rebase,删除我们指定的提交。

git rebase --continue 命令可以完成剩余的 rebase 操作

git rebase --abort 命令放弃这次合并

再次运行 git log --oneline查看记录

发现【测试2】【测试3】的提交记录已经没了,对应的代码改动也删除了。

3、强制推送

由于我们改变了提交历史,我们需要使用强制推送(force push)来更新远程仓库。

使用以下命令进行强制推送:

git push -f origin <branch>

扩展

1、怎么把一个分支的 某次提交的改动 合并到另一个分支上,(注意:不是两个分支之间的合并!)

使用cherry-pick命令:

git cherry-pick <commitid>

有冲突的话解决冲突,commit 后,使用git cherry-pick --continue继续,最后 push 。

cherry-pick 操作是将某次提交的改动应用到当前分支上,并不是应用某次提交的完整版本。

这意味着 cherry-pick 不会将整个提交的内容(包括提交信息、作者、提交时间等)复制到当前分支,而只会将该提交所引入的更改应用到当前分支的当前状态上。

image.png

2、 怎么从某次提交签出一个新分支

git checkout -b <new-branch-name> <commit-hash>
  • <new-branch-name> 是你要创建的新分支的名称。
  • <commit-hash> 是你要签出的特定提交的哈希值或引用。可以是完整的哈希值,也可以是分支名、标签名等

3、怎么把多次提交记录压缩成一次提交

还是使用 git rebase命令

常用操作说明

操作说明
pick保留该commit(缩写:p)
reword保留该commit,但我需要修改该commit的注释(缩写:r)
edit保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash将该commit和前一个commit合并(缩写:s)
fixup将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec执行shell命令(缩写:x)
drop丢弃该commit(缩写:d)

具体步骤跟删除某次提交的步骤一样,只是把对应的关键字改成squash即可

  1. 查看提交记录

image.png

把test:1 、2 、3 、4,四个提交记录压缩合并成一个提交记录

  1. git rebase -i [要合并的所有提交记录的前一次提交的commitID]
git rebase -i be9bf86

image.png

  1. 把需要压缩的提交记录,改成 squash

保留一个pick提交,即把别的提交压缩到该提交

image.png

保存关闭后,如果没有冲突,或者冲突已经解决,会出现如下页面:

image.png

将四次提交信息合并成一个新的提交信息(下面可以看到: 1beb22c的commitId)

image.png

  1. 压缩完毕后,再次查看提交记录

image.png

  1. 强制推送

git push -f

可以看到,1beb22c这次提交的改动包含了要压缩的四次提交的代码改动。

image.png


我是 甜点cc,个人网站: home.i-xiao.space/vuepress-st…

实干是实干者的通行证!

公众号:【看见另一种可能】