“哎呀提交错了,怎么办”。
本文整理了一些在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】版本。
使用git reset 24028df
回退到对应的版本。我们就发现工作区已经恢复到错误操作前的样子了。
再git reflog
看下操作流水,发现增加了一条回退的记录,版本为【24028df】。
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分支。)