这两天有个同事用 git push -f
把远端我的几次提交冲掉了,一脸懵逼,梳理一下相关问题。
git 基本知识
git 的详细教程推荐廖雪峰的 git 教程,这里只简单回顾一下相关知识。
git 管理的本地内容里,有工作区、暂存区、版本库的概念。
- 工作区:其实就是我们直接能看到的文件。我们的修改都是直接体现在工作区的。
- 暂存区:存放在
.git/index
目录,我们使用git add
命令时,会把工作区的内容更新到暂存区。 - 版本库:使用
git commit
时,会把暂存区的内容更新到版本库。
通常开发中总会有个远程仓库,使用 git push
命令会把本地版本库的内容推送到远程仓库。
下面这张图很好地反应了 git 的状态切换。
常用命令
提交相关
提交代码时常用命令有git add
、git commit
、git pull (--rebase)
、git push
。
另外几个就不多说了,这里讨论一下 pull 的时候 rebase 参数。
如果本地和远端都有新的提交,pull 时带 rebase 参数的话,本地与远端做的是 rebase,解决冲突后,相当于把本地的几次提交移动到远端提交之后,提交记录会更清晰。
pull 时不带 rebase 参数的话,做的是 merge,本地和远端的提交会分两条线,最终合并到一个新的 merge 节点。
我个人经历的项目来看,通常更推荐使用git pull --rebase
,提交记录更清晰。
一般性回滚
1. 代码尚未 commit
没提交的时候怎么搞都是小事。视情况 checkout
、reset --hard
、stash
命令都可以拿来用。
2. 代码已经 commit,尚未 push
通常使用 git reset
回滚到指定 commitID,注意区分混合合并(mix)/ 强行合并(hard),要保留代码时用混合合并(mix),不保留代码时可以强行合并。
3. 已 push 代码需要回滚
通常使用 git revert
创建一次回滚提交。基本原则就是不影响远端提交记录。