这两天有个同事用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
创建一次回滚提交。基本原则就是不影响远端提交记录。
发表回复