git 操作常见场景解决方案

192 阅读4分钟

常见场景解决方案

merging问题场景解决方案备注
如图,分支进入merging状态如何退出 image-20230406171923231-168086331680112-168109952440920.png在feature/jiraId分支上想下拉基准分支(develop)上最新的变动,但错误操作执行git pull origin release了,拉下来一大堆冲突,想要取消本次合并git merge --abort该场景期望拉取基准分支,可使用命令 git fetch && git merge @{u} // @{u}表示下拉基准分支;&&表示顺序执行,&表示同步执行;
@{u}可以避免拉错基准分支;
如图,分支进入merging状态,一顿操作后,没有修改的文件,怎么退出merge状态继续提交呢?image-20230406172200279-16808633117756-168109952610722.png进行git pull之后看了一眼冲突,觉得保留current change就行,就直接点击左侧的文件上的discard change撤销了下拉的修改,结果就出现了问题局面方案一:如图,git commit image-20230406172545428-16808633137028-168109954136224.png 方案二:如图,git merge --continue image-20230406172635301-168086331487510.pngmerge操作会生成一个新的节点

冲突问题&场景解决方案备注
文件内容冲突,如何直接定位上一个或下一个冲突位置vscode 冲突文件右上角有按钮定位上、下一个冲突位置 image-20230407155907948-168109954896226.png--
文件内容冲突,如何全部采用current change(或incoming change)方案一:如图 image-20230407162806260-168109955101128.png 方案二:git checkout --ours . (theirs)可以设置vscode快捷键:ctrl+shift+p, 输入merge, 点击设置按钮 image-20230410100837892-168109955304530.png

权限问题&场景解决方案备注
release分支合并到develop分支发生冲突,但这两个分支都没有操作权限,怎么给负责人提mr,解决冲突在release分支上git pull origin develop,合并完冲突checkout一个新分支,提交合并到release上,就可以解决掉release和develop的冲突 image-20230407183008712-168086374942814-168109955505132.pngmerge操作会生成节点,所以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 --amendgit commit --amend 会将最新commit与上一次commit合并,这样就不用git reset HEAD^拉下全部,再检查全部并提交了

零碎命令演示
git生成graphgit log --all --pretty=oneline --abbrev-commit --graphimage-20230410115901960-168109955813234.png
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
image-20230407175434385-168109956039936.png
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

image-20230410104258794-168109956425738.png

使用方式

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。

image-20230407175434385-168109957037640.png

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

参考资料

linux shell 字符串操作详解

Git : how to accept all current/incoming changes

Git Pull Force——如何用 Git 覆盖本地更改

npm scripts 使用指南