此篇记录:在项目中使用Git时,遇到的一些常见场景和解决方式,主要是提升工作效率,很多所谓的问题并不是本身存在的问题,更多想带给大家的是我在项目实战中git的多样性操作…
关联篇
- Git指南 - 你该掌握的那些基础认知和首次配置
- Git指南 - 项目实战中天天用的那些基础命令
- Git指南 - 通过规范使用Git来证明你是一个牛牛
- Git指南 - 我经常遇到的那些项目实战场景
- Git项目实战 - 我遇到的那些Git问题是这么解决的
- Git指南 - 刚提的commit 怎么找不到了(游离分支)?
在最早的时期,我将所有对Git的认知都记录在了一篇blog内,后期感觉职责混乱,不太利于查看,所以重新翻一下,分多篇记录
场 景
分支相关
那天看到 这里 也统计了挺多分支场景,感觉不错,有兴趣也可以去直接去看,相当于一个 git
文档
本地分支 绑定 远程分支
使用命令 git branch --set-upstream
;示例如下(debug为创建的分支)
Git提示:
git branch --set-upstream-to=origin/<branch>
git branch --set-upstream-to=debug(本地分支名称) origin/debug(远程分支名)
俩者一样,防止误导
Git提示:
git branch --set-upstream-to=origin/<branchName>
git branch --set-upstream-to=本地分支名称/远程分支名
将本地分支与远程同名分支相关联
git push -u origin <本地分支名>
基于当前分支创建新分支(本地)
git checkout master #切换分支
git checkout -b newBranch #创建分支
git push origin newBranch #将新建的分支推到远端
# 常规三件套
git add .
git commit -m "***"
# 介意命令长的话,可以直接绑定对应分支
git push origin newBranch
本地显示已删除的远程分支(清缓存)
主责:缓存导致
#执行以下这行命令
git remote show origin
本地查询不到远程全部分支
可结合 - 本地查不到 “某” 远程分支 的 处理方式
# 已自创本地分支(类似关联操作)
git fetch <远程主机名> <分支名>
或
# 未自创本地分支,通过下面命令一起创建
git branch test origin/test #将远程分支test拉取到本地,并新建分支test(如果失败,可以先运行 git fetch)
git命令行内示例 :
YongLiu@DOW-NP-140 MINGW64 /e/garage_android (dev2.0.0)
$ git branch --set-upstream-to=origin/dev dev2.0.0
将远程指定分支 → 本地指定分支上(pull)
以下为三种常见场景
# 将远程指定分支 拉取到 本地指定分支上
git pull origin 远程分支名:本地分支名
# 将远程指定分支 拉取到 本地当前分支上
git pull origin <远程分支名>
# 将与本地当前分支同名的远程分支 拉取到 本地当前分支上(`需先关联远程分支`)
git pull
提交本地分支代码 → 指定的远程分支(push)
# 将本地当前分支 推送到 远程指定分支上(注意:pull是远程在前本地在后,push相反)
`准确的说,应该是提交本地分支代码 -> 指定的远程分支`
## HEAD代码近期修改的分支
git push origin HEAD:dev
## 同上
git push origin <本地分支名>:<远程分支名>
# 将本地当前分支 推送到 与本地当前分支同名的远程分支上(注意:pull是远程在前本地在后,push相反)
git push origin <本地分支名>
# 将本地当前分支 推送到 与本地当前分支同名的远程分支上(`需先关联远程分支`)
git push
拉取远端tag并创建分支
#newBranch 为新分支 v1.6.0为我们之前打好的 tag
git checkout -b -NewBranch v1.6.0
合并冲突
通过git diff
获取冲突部分,也可以直接跑项目查看报错部分
- 发生冲突的文件:
#冲突区域
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
#解释区域
其中,git使用<<<<<<<,=======,>>>>>>>标记文件中自己和别人产生冲突的部分
在<<<<<<<,=======之间为自己的代码
=======,>>>>>>>之间为别人的代码
如果保留自己的代码,将别人的代码删掉即可
#冲突解决后提交
git status
git add .
git commit -m "fix bug"
git push origin 分支名
分支间临时存储
切换分支,提交当前本地的代码(stash)
stash(临时)空间 - 项目实战
场景:准确的说,应该是切换分支时将最近的代码同步切换
git stash push #将文件给push到一个临时空间中
git stash list #可以将当前的Git栈(临时空间)信息打印出来,
git stash pop #将文件从临时空间pop下来
git存储(stash)
stash(临时)空间 - 项目实战
我记得,这个场景适用于在本地分支切换时将A分支的刚写的代码,切换到B分支上,主要用到的是临时存储区;当然有一种方式是将A分支进行提交,然后B分支拉A分支的代码,但是这种操作可能会造成部分垃圾数据
git stash <- 保存当前的工作进度 ->
git stash save "message" # 保存进度加说明
git stash list # 显示进度列表
git stash pop # 恢复最新保存的工作进度,并将恢复的工作进度从存储的列表中删除
git stash apply # 恢复最新保存工作进度,但不删除
git stash drop # 删除一个进度,默认删除最新的
git stash clear # 删除所有
1、储藏更改:将当前更改的代码储藏起来,等以后恢复使用
git stash
2、恢复储藏的代码
git stash pop //恢复的同时把stash内容删掉
或者
1.git stash apply #恢复stash,但是stash内容并不删除
2.git stash drop #在上面操作的基础上,以此来删除stash
注: git stash list #查看全部的stash列表。
git遴选(cherry-pick)
用于把另一个本地分支的commit修改应用到当前分支
git cherry-pick <commit_id>
git重新基变(rebase)
git rebase <branch_name> # 合并分支
git rebase --continue # 执行rebase出现冲突解决后,执行该命令会继续应用(apply)余下的补丁
git rebase --skip # 跳过当前提交
git rebase --abort # 终止rebase, 分支会回到rebase开始前的状态
失误操作
修改commit备注
这里指的主要是已commit到本地,未push远端
的场景
其实关于类似场景有好几种,日后有机会补足一下
git commit --amend
#进入编辑模式之后,你会看到之前你的commit备注信息!~ 进行修改,然后保存,最 后关闭! 然后git会自动重新保存
撤销修改
注:一旦执行了git commit -m "*"
,就不能再使用以下命令回退
。
git checkout -- 文件
分两种情况分析:
1.还没有执行 git add 操作,执行上面的操作后,会恢复到和版本库中一模一样的版本状态。
2.执行了git add ,还没执行 git commit ,再执行上面的操作后,会恢复到git add 结束后的状态
git撤销(revert)
git revert commit # 撤销指定commit
git revert HEAD # 撤销上一次commit
git revert -no-edit HEAD # 撤销上一次并直接使用默认注释
git revert -n HEAD # 撤销上一次但不commit
回退已push版本
git reflog //查看所有分支的所有操作记录
通过 git reflog 获取commit id (版本号),如下:
//版本号:62e6739 都是7位数,填写在回退的版本号处即可!
62e6739 HEAD@{1}: reset: moving to HEAD^
git reset --hard 版本号 //本地回退到指定的版本
git push -f origin dev //将远程的也回退到指定版本
/**华丽的分割线**/
科普内容 - Git log和reflog区别:
git reflog 可以查看所有分支的所有操作记录(包括commit和reset的操作),
包括已经被删除的commit记录
git log则不能察看已经删除了的commit记录
分支提交错误,导致分支冗余
忘记切换分支,误将代码提交到了别的分支,同时远端也创建了此次错误提交的分支(之后 pull 、push、都会又有问题,且远端正确的分支下看不到此次提交)
首先这个是可以曲线救国的,例如我们在这条看似错误的分支上拉取目标分支的代码,然后push后,对目标分支发起合并请求
我的工作场景
因为本地有多条分支用于开发,所以当 本地分支与远端分支名不同时,采用 git push orgin HEAD:远程分知名 进行代码提交,但是因为速度太快,导致输入远程分知名错误 ,误将代码提交到了错误分支,导致自身git操作时报错,工作受影响
git pull 报错信息
#锁定节点有问题
cannot lock ref 'refs/remotes/origin/branch_name': is at
95b2ddb09e303b4857d6c0fd6545a5062349e00e but expected 20525f2edbef6ce8b3f6ff8c107abc25e9de973f
解决方式
首先 上文中的 95b2ddb09e303b4857d6c0fd6545a5062349e00e / 20525f2edbef6ce8b3f6ff8c107abc25e9de973f
#通过show命令,可查看对应节点的代码
git show 95b2ddb09e303b4857d6c0fd6545a5062349e00e
主要解决流程
1.查看远端与本地分支
git branch -a
2.删除远端的错误分支 ,然后在进行分支查看
git branch -a
场景1 :远端错误分支已不存在,此时可正常使用git
场景2:远端错误分支依旧存在,那么进行如下处理
#用来清除已经没有远程信息的分支,这样git branch -a 就不会拉取远程已经删除的分支了
git fetch origin -p
3.此时如果不出意外的话,那么远端的错误分支肯定不在咯! 那么进行正常Git命令操作即可!
服务器变动
GitLab迁移,修改本地代码库的服务器路径
修改方法
1.查看当前代码库服务器地址
命令:git remote get-url origin
命令行会输出:ssh://git@你的ip地址/dowgroup_web.git ######
2.修改当前代码库服务器地址,替换“你的ip地址/”为“新的服务器ip地址”
命令:git remote set-url origin git@gitlab.kjdow.com:dowgroup/dealer_web.git
#示例
git remote set-url origin git的HTTP地址