Git时光机

git如果不熟练,很容易出错。但是好在git自身提供了强大的时光机,可以尽可能的避免误操作引起的损失。这里会列举一些常见的误操作及补救方法。

提交遗漏/提交信息不规范

提交的时候可能会遗漏掉一些修改,或者信息填写不规范。如果再提交一次,会多一些无意义的节点,并且后面如果回滚也会不清晰。可以借助git commit --amend 来修改上次提交。

# 遗漏提交
# 第一次提交A1,但是忘记了a.js文件
git add a.js
git commit --amend #出现提交信息输入框,并且上次提交信息会出现在框中,提交完成后上次提交就会修改。

# 提交信息错误
git commit --amend #暂存区没有任何文件的情况下,直接执行该指令,可以修改提交信息

提交错误

假如某一次提交修改的内容引起了错误,可以使用 git revert来撤销该次提交。revert会产生一个提交节点,便于后期问题排查。

# 找到某次提交的commit id 是 638d180
git revert 638d180

假如连续多次提交都有错误,可以使用 git reset 来批量撤销。

# 假如有 X, a, b, c三次提交,其中a,b,c三次提交都是错误的,X的commit id为638d180
# 同时本地还有2个未提交的修改文件e.txt(工作区), f.txt(暂存区)
# reset有3种方式,soft, mixed, hard

# 回滚至X提交,并且a,b,c的修改都会恢复至暂存区,e,f文件状态不变
git reset --soft 638d180

# 回滚至X提交,并且a,b,c的修改都会恢复至工作区,e文件状态不变,f会恢复至工作区
git reset --mixed 638d180

# 回滚至X提交,并且a,b,c的修改都会丢失,e,f文件的修改也会丢失。
git reset --hard 638d180

git reset --hard 之前,如果工作区或暂存区有别的修改,务必使用git stash 封存修改,不然回滚后就会消失,git reflog也无法找回

撤销某次提交时的某个文件

## 假如需要将 detail.txt 文件回滚到 37b69551
git checkout 37b69551 -- detail.txt

操作完成后,撤销会以commit的形式,将修改添加到暂存区。可以通过对比来查看撤销是否需要调整(例如 37b69551 之后的某个提交 123456 也修改了这个文件,而你想撤销的只是 37b69551 提交中的修改,可以通过手动将123456的修改加回上去的方式来弥补,仅限于修改不是很多的情况)

假如是非连续多次提交都有错误,例如错误的rebase,可以采用 git reflog

git 会自动记录本地的每次操作,例如checkout,rebase,commit,reset等,利用reflog可以查看所有操作记录,然后结合 git reset 回到某个操作前的状态。

git reflog

62c8492 HEAD@{38}: rebase: checkout master
b24e36e HEAD@{39}: checkout: moving from b to a
956dc71 HEAD@{40}: commit: mod a on b

# 确认要回到 956dc71 的状态
git reset --hard 956dc71

更多场景及补救措施,可以查看 Oh shit, git!

你可能感兴趣的:(Git时光机)