[ git ] 撤销commit +修改commit信息 + 合并多个commit 命令总结

本文详细介绍了如何在Git中撤销commit、修改提交消息以及合并多次commit,包括gitreset、gitcommit--amend、gitrebase等工具的使用方法和注意事项。

一、撤销commit

写完代码后,我们一般这样

git add . //添加所有文件

git commit -m “本功能全部完成”

而如果想撤回commit,可以使用下面命令撤回commit操作,但是代码仍然保留。

git reset --soft HEAD^

或者

git reset --soft HEAD~1

HEAD^的意思是上一个版本,也可以写成HEAD~1,这两个命令都表示撤回到上一次提交,不修改本次提交的改动。即不删除工作空间改动代码,撤销commit,不撤销git add .
补充其他两个参数:
–mixed
意思是:不删除工作空间改动代码,撤销commit,并且撤销git add . 操作
这个为默认参数,git reset --mixed HEAD^ 和 git reset HEAD^ 效果是一样的。

–soft
不删除工作空间改动代码,撤销commit,不撤销git add .

–hard
删除工作空间改动代码,撤销commit,撤销git add .

注意完成这个操作后,就恢复到了上一次的commit状态。

二、修改commit message

1、git 修改未提交到git 远程仓库

git commit --amend

就可以修改最近一次的commit信息
进入vim操作界面之后, 点击字母键 i 然后进入INSERT模式,然后对commit信息进行修改,然后ESC 然后 :wq 保存退出,然后执行 git log 会发现最近的一次commit信息被修改成功了。

2、git 修改已经提交到git远程仓库的commit信息

   1. 首先回撤到上一次提交,不修改本次提交的改动 git reset --soft HEAD~1

   2. 重新做一次提交 git commit -m “重新提交commit信息”

   3. 强推本地分支到远程仓库 git push -f origin master

   4. 查看远程仓库中的是否已经修改commit信息

3、修改任意一次的commit信息
可以用到使用git rebase -i

三、 合并多次commit

1. 要合并的commit还没有push到远程仓库
这种情况下有三种命令可以实现要求:

第一种(推荐):使用git reset方式(因为比较好理解,也是笔者推荐的方式)。步骤如下:

git log查看要合并的commit.记住最早的commit号。
git reset commit_number.回退到此commit号。因为没有使用--hard,所以内容都保存在工作区。
git add .将回退的的内容再次添加到暂存区
git commit -m "comment".再次提交。
git log。使用此命令查看,发现合并完成。

这种方式主要利用了git reset回退时并不会删除工作区的内容。因此可以一次性重新提交。可以配合实际开发中在写一个稍微大一点的功能时,自己分小点git add并且commit一些文件和代码,控制本地工作区需要组织的文件和代码在一定范围。之后再一次性合成一个大的commit推到远程。

第二种:使用git commit --amend方式。只能合并当前要提交的和最近一次提交的commit.
修改工程文件。

git add .将文件添加到暂存区。
git commit --amend -m "commet".提交。
git log。使用此命令查看,发现与最近一次commit为一个commit。

第三种: 使用git rebase变基的方式,这种我个人用得不是很多。git rebase合并多次commit

2. 有些commit已经push到了远程仓库
有时候自己分支提完pr后自己发现的一些拼写错误/逻辑漏洞就需要再推个commit, 或者有时候其他开发帮忙review代码时,发现部分代码有更优雅的写法时,都需要增加新的commit。导致在最后提交分支的时候,如果一个小功能来来回回自己还改了很多次,多多少少有点不好意思,简直想把一部分commit藏起来。就可以使用以下方法,push时要用到–force或–force-with-lease选项进行强制推送。

步骤如下:

保证要推送的分支与本地分支同步。
使用上面提到的三种方式任意一种进行commit的合并。
使用git push --force-with-lease origin dev的方式强制推送。

注意:如果推送的是主分支master,也可能会推送失败,并提示(You are not allowed to force push code to a protected branch on this project.)这是由于gitlab等服务器设置了主分支保护造成的。可以设置gitlab的"Settings" -> “Repository” -> scroll down to “Protected branches”.然后再推送。

这种方法要注意临时在别的功能分支想git commit 直接点上键盘回到上个命令的时候,因为又用了一次git commit --amend -m "XXX"时合进去的分支会变。

要将多个 Git 提交合并为一个提交,可以使用 `git rebase` 或 `git reset` 的方法来实现。以下是详细的说明: ### 使用 `git rebase -i` 合并多个提交 这种方法适合需要精细控制哪些提交需要合并的情况。假设想要合并最近的三个提交,可以执行以下命令: ```bash git rebase -i HEAD~3 ``` 在打开的编辑器中,会列出类似如下内容: ``` pick 12345 commit1 pick 67890 commit2 pick abcde commit3 ``` 保留第一个提交前的 `pick`,将其余提交前的 `pick` 替换为 `squash` 或简写为 `s`,以将这些提交合并到第一个提交上。例如: ``` pick 12345 commit1 squash 67890 commit2 squash abcde commit3 ``` 保存并关闭编辑器后,Git 会提示重新编辑最终的提交信息。完成之后,使用以下命令强制推送到远程仓库(慎用,因为这会影响其他协作者): ```bash git push origin <branch-name> --force ``` 这种方法的优点是可以选择性地合并部分提交,并且支持对提交信息进行调整[^1]。 ### 使用 `git reset` 合并多个提交 如果希望快速将多个提交恢复到未提交状态,然后一次性提交所有更改,可以使用 `git reset` 命令。例如,要合并最近的三次提交,可以执行以下命令: ```bash git reset HEAD~3 ``` 接着添加所有更改并创建一个新的提交: ```bash git add . git commit -m "新的提交信息" ``` 最后同样需要强制推送以更新远程仓库: ```bash git push origin <branch-name> --force ``` 这种方法相对简单,但会丢失原有的提交历史和信息,适用于不需要保留中间提交记录的情况[^2]。 ### 注意事项 - **操作风险**:无论是 `git rebase` 还是 `git reset`,它们都会修改提交历史,尤其是强制推送 (`--force`) 可能会对团队协作造成影响。在多人协作的分支上操作时需格外谨慎。 - **适用场景**:如果需要保留完整的提交信息,推荐使用 `git rebase -i`;如果仅关注最终代码状态而不关心中间提交细节,则可以使用 `git reset`。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值