背景
本文记录工作中使用git常遇到的四种问题的对应解决方案:
1. 合并分支时PR冲突,不可自动合并
2. 要挑选某次提交紧急上线(cherry-pick)
3. 本地commit了发现commit错了要撤销
4. 都push到远程了才发现有点问题要撤销
1、pull-request冲突解决
场景:
修复线上bug,在生产分支prd拉了一个紧急修复分支hotfix开发上线,开发完后正常迭代的dev分支要合并到prd分支进行下个迭代上线时报pr冲突,无法自动合并。
解决方法
合并路径:hotfix->prd->dev
下面以prd->dev为例(hotfix->prd此时一定无冲突)
git checkout prd # 本地切换到prd分支
git pull # 本地拉取最新的prd代码
git checkout dev # 切到dev分支
git pull # 本地拉取最新dev分支代码
git merge prd # 本地将prd-> dev
# 手动解决冲突后重新提交
git add .
git commit
git push
# 此时dev已经有prd最新代码了,再pr无冲突,可自动合并
2、cherry-pick
场景:
要从dev分支选择某些提交到prd分支上线。
解决方法
git checkout prd # 切换到生产分支
git pull # 更新本地仓库生产分支代码
git cherry-pick f4ac2d9e2 # 挑选要上线的提交
如果无冲突,直接push就好(已经commit了)
如果冲突了,分支名会变为:(prd|CHERRY-PICK),先手动解决冲突 ,然后
git add 冲突文件
git commit 冲突文件
git cherry-pick --continue
git push
3、撤销本地提交
场景:
已经提交到本地仓库了发现提交错了(commit了没push)
解决方法
git reset --soft HEAD^ # 撤销上次本地提交
git reset --soft HEAD~3 # 撤销上3次本地提交
# --soft 撤销commit,不删除本地空间代码,不撤销git add .
# --mixed 撤销commit,不删除本地空间代码,撤销git add .
# --hard 撤销commit,删除本地空间代码,撤销git add .
4、撤销已经提交到远程仓库的提交
场景:
已经提交到远程仓库了发现提交错了(已经push成功了)
网上有人说用git reset --hard再git push -f,这显然是不安全的
解决方法1
git log # 找到要回滚的提交,假设是f4ac2d9e2
git revert f4ac2d9e2 # 用一次反向提交去覆盖,分支往前走
git push
解决方法2
简单粗暴的方式:拷代码,利用git的文件跟踪能力。
前提:此时把分支抢占,禁止其他人再提交代码
1、先复制下项目整个文件夹到项目副本
2. 在项目副本文件夹中使用git回退到某个版本
git reset --hard bd143431c3afd816a477b86dbbc9caeef8a860c5
3. 把原项目除了.git文件夹统统删掉
4. 把项目副本除了.git文件夹复制到原项目下
5. git commit, push…
注意:reset的id不要搞错了,可以理解为git reset到该id的版本,也就是该id的提交时有的。该iid后面的提交没有了。