「这是我参与2022首次更文挑战的第N天,活动详情查看:2022首次更文挑战」。
最近在深入学习 Git ,和大家分享一波!
1、如何修改 commit 的 message ?
修改最新的 commit 的 message :
$ git checkout --amend
修改老旧的 commit 的 message :
$ git rebase -i d401cc0684ce # (修改对应commit的parentId)
2、如何对 commit 进行整理?
$ git rebase -i 56304a1fff3 # 连续的 commit
commit$ git rebase -i 0d5bf8a10 # 间隔的几个
修改完退出之后如果没有自动跳转到 message 修改界面,需要手动输入
$ git rebase -i --continue
3、如何清除最近的几次 commit ?
$ git reset --hard <commitId>
4、如果在开发中,临时加塞了紧急任务怎么处理?
$ git stash #(存放到stash列表中)
$ git stash list #(查看stash列表中的信息)
# 处理完紧急任务,commit之后,就可以把暂存的内容放回工作区,方法如下:
$ git stash apply #(将stash中存的内容还原到工作区,但不删除stash堆栈中的信息)
$ git stash pop #(将stash中存的修改还原到工作区,但会丢掉stash堆栈中的信息)
5、误操作的撤回方案
开发中频繁使用 git 拉取推送代码,难免会有误操作。这个时候不要慌,git 支持绝大多数场景的撤回方案。
撤回主要是两个命令:reset
和 revert
git reset
reset 命令的原理是根据 commitId
来恢复版本。因为每次提交都会生成一个 commitId,所以说 reset 可以帮你恢复到历史的任何一个版本。
这里的版本和提交是一个意思,一个 commitId 就是一个版本 reset 命令格式如下:
$ git reset [option] [commitId]
比如,要撤回到某一次提交,命令是这样:
$ git reset --hard cc7b5be
上面的命令,commitId 是如何获取的?很简单,用 git log
命令查看提交记录,可以看到 commitId 值,这个值很长,我们取前 7 位即可。
这里的 option 用的是 --hard
,其实共有 3 个值,具体含义如下:
--hard
:撤销 commit,撤销 add,删除工作区改动代码--mixed
:默认参数。撤销 commit,撤销 add,还原工作区改动代码--soft
:撤销 commit,不撤销 add,还原工作区改动代码
这里要格外注意 --hard
,使用这个参数恢复会删除工作区代码。也就是说,如果你的项目中有未提交的代码,使用该参数会直接删除掉,不可恢复,慎重啊!
除了使用 commitId 恢复,git reset 还提供了恢复到上一次提交的快捷方式:
$ git reset --soft HEAD^
HEAD^ 表示上一个提交,可多次使用。
其实平日开发中最多的误操作是这样:刚刚提交完,突然发现了问题,比如提交信息没写好,或者代码更改有遗漏,这时需要撤回到上次提交,修改代码,然后重新提交。
这个流程大致是这样的:
# 1. 回退到上次提交
$ git reset HEAD^
# 2. 修改代码
... ...
# 3. 加入暂存
$ git add .
# 4. 重新提交
$ git commit -m 'fix:***'
针对这个流程,git 还提供了一个更便捷的方法:
$ git commit --amend
这个命令会直接修改当前的提交信息。如果代码有更改,先执行 git add
,然后再执行这个命令,比上述的流程更快捷更方便。
reset 还有一个非常重要的特性,就是真正的后退一个版本。
什么意思呢?比如说当前提交,你已经推送到了远程仓库;现在你用 reset 撤回了一次提交,此时本地 git 仓库要落后于远程仓库一个版本。此时你再 push,远程仓库会拒绝,要求你先 pull。
如果你需要远程仓库也后退版本,就需要 -f
参数,强制推送,这时本地代码会覆盖远程代码。
注意,-f
参数非常危险!如果你对 git 原理和命令行不是非常熟悉,切记不要用这个参数。
那撤回上一个版本的代码,怎么同步到远程更安全呢?
方案就是下面要说的第二个命令:git revert
git revert
revert 与 reset 的作用一样,都是恢复版本,但是它们两的实现方式不同。
简单来说,reset 直接恢复到上一个提交,工作区代码自然也是上一个提交的代码;而 revert 是新增一个提交,但是这个提交是使用上一个提交的代码。
因此,它们两恢复后的代码是一致的,区别是一个新增提交(revert),一个回退提交(reset)。
正因为 revert 永远是在新增提交,因此本地仓库版本永远不可能落后于远程仓库,可以直接推送到远程仓库,故而解决了 reset 后推送需要加 -f
参数的问题,提高了安全性。
使用方法:
$ git revert -n [commitId]
希望我的总结对各位有帮助!! 另外本人想做一个有关 git 的分享,希望能得到小伙伴们的指点!