常见场景解决方案
| merging问题 | 场景 | 解决方案 | 备注 |
|---|---|---|---|
| 如图,分支进入merging状态如何退出 | 在feature/jiraId分支上想下拉基准分支(develop)上最新的变动,但错误操作执行git pull origin release了,拉下来一大堆冲突,想要取消本次合并 | git merge --abort | 该场景期望拉取基准分支,可使用命令 git fetch && git merge @{u} // @{u}表示下拉基准分支;&&表示顺序执行,&表示同步执行; @{u}可以避免拉错基准分支; |
| 如图,分支进入merging状态,一顿操作后,没有修改的文件,怎么退出merge状态继续提交呢? | 进行git pull之后看了一眼冲突,觉得保留current change就行,就直接点击左侧的文件上的discard change撤销了下拉的修改,结果就出现了问题局面 | 方案一:如图,git commit | merge操作会生成一个新的节点 |
| 冲突问题&场景 | 解决方案 | 备注 |
|---|---|---|
| 文件内容冲突,如何直接定位上一个或下一个冲突位置 | vscode 冲突文件右上角有按钮定位上、下一个冲突位置 | -- |
| 文件内容冲突,如何全部采用current change(或incoming change) | 方案一:如图 | 可以设置vscode快捷键:ctrl+shift+p, 输入merge, 点击设置按钮 |
| 权限问题&场景 | 解决方案 | 备注 |
|---|---|---|
| release分支合并到develop分支发生冲突,但这两个分支都没有操作权限,怎么给负责人提mr,解决冲突 | 在release分支上git pull origin develop,合并完冲突checkout一个新分支,提交合并到release上,就可以解决掉release和develop的冲突 | merge操作会生成节点,所以feature分支上虽然无代码变动但有commit |
| pull问题 | 场景 | 解决方案 |
|---|---|---|
| 下拉云端(origin)更新,保留本地修改 | 协同开发时,主分支(develop)有他人新的提交,需要在自己的开发分支(feature)上保留开发内容并拉取远程更新 | git fetch --all; git stash; git merge @{u} ; git stash pop; |
| 云端直接覆盖本地 | 协同开发时,主分支(develop)有他人新的提交, 需要下拉更新本地develop分支内容,期望云端直接覆盖本地。不关心本地的develop分支啥样,也不用解决冲突,直接下拉覆盖就完事儿啦 | git fetch --all; git reset --hard origin/release; git pull; |
| commit问题 | 场景 | 解决方案 | 备注 |
|---|---|---|---|
| 合并本地多个commit为一个commit推送到云端 | 刚提交一个改动很多的commit,但发现commit -m信息写错了或者有个文件漏改了。原方案:git reset HEAD^重新修改检查 | git commit --amend | git commit --amend 会将最新commit与上一次commit合并,这样就不用git reset HEAD^拉下全部,再检查全部并提交了 |
| 零碎 | 命令 | 演示 |
|---|---|---|
| git生成graph | git log --all --pretty=oneline --abbrev-commit --graph | |
| git stash相关 | git stash <=> git stash save "添加描述信息" git stash pop <=> git stash pop --index ${index} git stash clear <=> git stash drop ${index} | |
| git fetch相关 | git fetch // 更新远程 git fetch -p // 更新远程并删除无用关联,但分支未删除,删除的是关联状态;比如远程删除了的分支,本地状态会更新为gone | |
| git pull相关 | git pull = git fetch + git merge; // git merge会生成新的节点 | |
| git show相关 | git show targetBranch:file; // 可以查看targetBranch:file 分支上的指定文件 |
git alias 套路开发流程
在开发新需求或者修复bug时,我们经常需要进行套路操作,可以将这些组合套路操作设置别名进行一键执行。
git alias 使用方式
单行命令创建alias:
git config --global alias.别名 "commit -m"; // 注意:是“commit -m”, 而非“git commit -m”
多行命令创建alias:
git config --global alias.别名 "!fn() { git switch master; git pull origin master; }; fn"; // 亲测powershell下能用,git bash识别不了
直接修改gitconfig文件创建alias:
vi ~/.gitconfig
移除alias:
git config --global --unset alias.别名
查看alias:
git config --global -l |grep alias 或
cat ~/.gitconfig
创建分支进行开发
场景
基于迭代分支(develop)创建新分支(feature/giraId)开发需求
git 命令套路
git switch develop
git fetch && git reset --hard origin/develop && git pull // 云端develop直接覆盖本地
git checkout -b feature/giraId
alias快捷方式
cover: !fn() { git fetch; git reset --hard origin/$1; git pull; }; fn
checkout-branch: !fn() { git switch $1; git cover $1; git checkout -b $2; }; fn
使用方式
git checkout-branch develop feature/giraId
开发完成提交分支
场景
在开发分支上完成开发需要提交固定格式commit信息后推送云端
git 命令套路
git add .
git commit -m "fix: jiraId commit信息" 或 git commit -m "feat: jiraId commit信息"
git push -u origin bugfix/jiraId
shell脚本
branch=$(git symbolic-ref --short -q HEAD)
if [[ $branch == bugfix* ]]
then
git add .
git commit -m "fix: ${branch: 7} $1"
git push -u origin $branch
elif [[ $branch == feature* ]]
then
git add .
git commit -a -m "fix: ${branch: 8} $1"
git push -u origin $branch
fi
echo finished.
使用方式
运行shell脚本,比如:命令行执行./1.sh ${params}
开发完成后,清理本地分支:
场景
开发完成后,清理本地分支,保留有引用关系的分支。如图,远程已删除的分支为gone。
git 命令套路
git fetch -p && git branch -vv | grep gone | awk '{print $1}' | xargs git branch -D
alias快捷方式
git config --global alias.clear-branch "!fn() { git fetch -p; git branch -vv | grep gone | awk '{print $1}' | xargs git branch -D; }; fn"
使用方式
git clear-branch
参考资料
Git : how to accept all current/incoming changes