使用 Git 时的常见场景,你掌握了吗

355 阅读2分钟

「这是我参与2022首次更文挑战的第N天,活动详情查看:2022首次更文挑战」。

最近在深入学习 Git ,和大家分享一波!

1、如何修改 commit 的 message ?

修改最新的 commit 的 message :

$ git checkout --amend

image.png

image.png 修改老旧的 commit 的 message :

$ git rebase -i d401cc0684ce # (修改对应commit的parentId)

image.png

image.png

image.png

2、如何对 commit 进行整理?

image.png

$ git rebase -i 56304a1fff3 # 连续的 commit

image.png

image.png

image.png

commit$ git rebase -i 0d5bf8a10 # 间隔的几个

修改完退出之后如果没有自动跳转到 message 修改界面,需要手动输入

 $ git rebase -i  --continue

image.png

image.png

image.png

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 支持绝大多数场景的撤回方案。

撤回主要是两个命令:resetrevert

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 的分享,希望能得到小伙伴们的指点!