以下是我在开发过程中,遇到过的某些实际的git应用场景以及我的解决方法。
注意几点:
- 只要不push到服务器上,本地代码随便折腾
- 没push到服务器上的提交,注意暂存备份
- 确认push之前,务必检查push命令的用户名、服务器地址、仓库名、分支名
- 尽量不要abandon已经push的提交
- 本地编辑之前记得同步代码
场景1
正常commit流程
//查看当前状态
git status
//将修改添加到暂存区
git add xxx
//查看是否暂存成功
git status
//提交到本地仓库
git commit
//push到服务器上
git push xxx
//同事审核代码
review
//代码审核没问题,入库
merge
场景2
将本地修改(my code)push到gerrit上后,经过同事review之后,发现某些地方还需要修改
在本地修改之后
//查看当前状态
git status
//将修改添加到暂存区
git add xxx
//查看是否暂存成功
git status
if(需要修改commit信息) {
//--amend表示本次修改是最近一次commit的补丁
git commit --amend
} else {
//--no-edit表示延用初次提交的commit信息,不再编辑commit信息
git commit --amend --no-edit
}
//push到服务器上,之后会发现gerrit上的my code会多一个patch
git push xxx
//同事审核代码
review
//代码审核没问题,入库
merge
场景3
在本地编辑了代码(my code),正准备提交才想起来,同事刚入库的代码(his code)还没有同步到我的本地。
if(my code和his code有冲突) {
if(已经commit了) {
方案一:
//保留工作空间的修改,并重置暂存区和本地仓库到本次提交前的版本
git reset HEAD^
//将工作空间的修改暂存到stash中
git stash
//将服务器git仓库同步到本地
repo sync .
//从stash中取出修改到工作空间
git stash pop
git会提示代码有冲突
解完冲突之后,走正常的提交流程
方案二:
//将my code push到gerrit上,gerrit会提示有代码冲突。(这一步权当暂存代码到gerrit上)
git push xxx
//将服务器git仓库同步到本地。
//注意一定要在reset和push之后同步代码,要不然会在没有任何提示的情况下,冲掉my code
repo sync .
//该条命令要从gerrit上复制过来
git cherry-pick xxx
git会提示代码有冲突
解完冲突之后执行 git cherry-pick --continue
发现my code作为最新的提交存到了本地仓库
//给gerrit上的my code打补丁
git push xxx
} else {
//将工作空间的修改暂存到stash中
git stash
//将服务器git仓库同步到本地
repo sync .
//从stash中取出修改到工作空间,
git stash pop
git会提示代码有冲突
解完冲突之后,走正常的提交流程
}
} else {
走正常的提交流程。merge之后再同步本地代码。
}
场景4
将本地修改(my code)push到gerrit上后,gerrit提示my code与同事先push到gerrit上的代码(his code)有冲突
等his code入库之后
//将服务器git仓库同步到本地。注意一定要在reset和push之后同步代码,要不然会在没有任何提示的情况下,冲掉my code
repo sync .
//该条命令可以在gerrit上复制过来
git cherry-pick xxx
git会提示代码有冲突
解完冲突之后执行 git cherry-pick --continue
发现my code作为最新的提交存到了本地仓库
//给gerrit上的my code打补丁
git push xxx
场景5
将本地修改(my code1)push到gerrit上后,还没等my code1入库,又push了一笔代码(my code2)到gerrit上,review代码时才发现my code1还需要修改。
//将工作空间和本地仓库重置到my code1之前的一笔提交(在Android studio的git可视化界面上操作更直观)
git reset --hard HEAD^^
cherry-pick my code1到本地
没有冲突的情况下,my code1直接作为最新的提交存到了本地仓库
修改本地代码
//查看当前状态
git status
//将修改添加到暂存区
git add xxx
//查看是否暂存成功
git status
if(需要修改commit信息) {
//--amend表示本次修改是最近一次commit的补丁
git commit --amend
} else {
//--no-edit表示延用初次提交的commit信息,不再编辑commit信息
git commit --amend --no-edit
}
//push到服务器上,之后会发现gerrit上的my code1会多一个patch
git push xxx
继续review,直到my code1没有任何问题
cherry-pick my code2到本地
if(本地没有冲突) {
my code2直接作为最新的提交存到了本地仓库
} else {
解完冲突之后执行 git cherry-pick --continue
发现my code2作为最新的提交存到了本地仓库
//给gerrit上的my code2打补丁
git push xxx
}