可以挽救操作“事故”的git命令

45 阅读3分钟

“哎呀提交错了,怎么办”。

本文整理了一些在git操作失误情况下,可以挽救失误的git命令。让你的提交可以有再来一次的机会。

基础命令

首先先总结一下最基础的常用git命令:

  • 代码提交

    git add:把需要提交的代码放到 【暂存区】。

    git commit:提交【暂存区】的代码。

    git push:把提交推送到远端。

  • 分支

    git pull:拉取分支在远端的最新代码,同步本地代码。

    git branch:新建分支。

    git checkout:切换分支,加上 -b 可以创建+切换分支。

挽救操作“事故”的命令

1. 重写提交的commit

事故现场:发现提交的commit注释写错了

希望:重写已提交的commit

git commit --amend:撤销上一次的commit。

此时会发现,暂存区回到了提交前的状态,可以重新编辑上次提交的commit信息。

2. 撤回提交的代码

事故现场:发现提交了不该提交的代码。

希望:撤回错误的提交

已push后发现提交错误:

git reset --soft HEAD~1:回到上一个版本。

--soft:撤销commit,不撤销add。
​
--mixed:撤销commit,撤销add,不删除工作空间改动代码。
​
--hard:撤销commit,撤销add,且删除工作空间改动代码。
​
​
HEAD~N:N替换成想要回退几个版本。如HEAD~2表示回退两个版本。

在reset后重新推送代码时,需要使用git push --force来强制更新远端分支。

3. 撤回错误操作

事故现场:使用git reset回退版本后,发现多回退了一个版本。

希望:撤回这次操作

git reflog:可以展示本机所有的操作流水,如下图:

第一条操作记录,就是我们错误操作的记录,【543e765】就是操作版本id。那么我们希望回到操作前,即回到【543e765】前的【24028df】版本。

image.png

使用git reset 24028df回退到对应的版本。我们就发现工作区已经恢复到错误操作前的样子了。

git reflog看下操作流水,发现增加了一条回退的记录,版本为【24028df】。

image.png

4. 本地分支与远程分支冲突

事故现场:合并代码时,提示分支冲突,无法更新。

希望:解决冲突。

出现这种问题的时候,通常会提示我们:

error: cannot lock ref 'refs/remotes/origin/xxx1': 'refs/remotes/origin/xxx2' exists; cannot create 'refs/remotes/origin/xxx1'
​
error: some local refs could not be updated

这个问题通常是因为我们之前从远程拉取了分支1,后来分支1在远程库中被删除了。即使我们删除了本地的分支1后,却依然可以在 git branch -a 里看到这个分支的origin ref。日积月累下,就会产生许多这样的无效ref,导致我们上传分支代码时出现冲突。

那么,我们就要对这些无效的分支进行清理。

git remote prune origin --dry-run:先查看下哪些分支需要被清理。

git remote prune origin:清理无效分支。

这样就清除了这些无效分支。

(如果清除后发现问题并未解决,那么可能是没有清理本地分支,使用git branch -D xxx2,删除掉本地的xxx2分支。)