前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【多图慎入】Git(2)

【多图慎入】Git(2)

作者头像
用户8902830
发布2022-09-22 11:19:00
3190
发布2022-09-22 11:19:00
举报
文章被收录于专栏:CodeNone

上篇文章把平常最最最经常用到的一些命令,但是基本是常规情况下,接下来讲讲不太正常情况下的命令。

首先,我们在本地最直接接触的是远程自己仓库,至于远程别人的仓库(大家共同修改文件的仓库,后文简称远程仓库)主要是通过远程自己的仓库进行mr。

那么我们如何保证自己的仓库里面有别人的修改呢

pull

可以看到远程仓库里面有个others.txt文件,而本地是没有的,为了能让本地和远程仓库同步,就需要用到pull

和push是对应的,一般后面也会跟着远程仓库的地址(上一篇文章中简单地说了下如何设置不同的远程仓库的地址)

mr时conficts

可以发现本地也已经有了新增的文件。注意,我们修改的文件也是在远程仓库中的,那如果别人觉得我们的文件写得不够好然后修改了。

就比如上次提交的helloworld,觉得不行,太简单了,只打印了一次,然后加了个for循环打印了100次,并且在每次打印后面加上序号。

于此同时,我们也觉得代码也得不够好,需要重复执行1000遍,并且想在输出完后再来一句经典台词,于是乎我们改了本地的代码。

接着心高彩烈地push了代码,并且提起了Merge Request,也有的平台称为Pull Request,这时候就会发现

有告警此Pull Request无法自动合并,你应该手动合并它 ,其实就是你和其他人同时修改了文件中的统一行,冲突了。之后就得是解决冲突,不同平台的解决冲突的界面应该不同,但是本质都是git。

此时就需要到程序员之间讨(撕)论(b),究竟是以谁的为准,这里假设这种,保持后面的i + 1 但是需要循环1000次。所以就需要修改为

其实这个文件的代码原则上你删了都没关系,因为git已经跟你说这个文件有冲突了,至于如何选择,需要保留什么,git觉得我们会处理好的。当完成这一切之后就和之前的mr是一致的,审核通过就可以合入了

但是在mr的时候再去解决冲突,总感觉有点麻烦,所以一般工作中常用的做法就是在commit之后,先pull一下最新代码

pull时conflicts

可以看到远程的仓库此时是这样滴

「然后远程对文件进行了修改,模拟其他同事合入了新代码」

同样在不知道的情况下,我们想要添加一个getStr的方法,并且在main函数里面调用

编辑完后正常add,commit,「但是不要push,先pull一下远程仓库的代码」

在最后可以看到一个这样的信息,就是让我们解决冲突

代码语言:javascript
复制
Auto-merging hello.java
CONFLICT (content): Merge conflict in hello.java
Automatic merge failed; fix conflicts and then commit the result.

如何解决呢,就是编辑冲突的文件即可,用vim来看下冲突的文件此时长啥样

只需要把<<<<<<<=======>>>>>>> 还有HEAD这些非我们想要的字符删掉,然后保留需要的代码,最后就正常add commit push mr即可。

这时候肯定会有刚学的小伙伴就问了,那如果改的期间别的人又往仓库中合入了代码咋办呢

开玩笑开玩笑,但是这种情况99.99%只会存在在理论中,现实工作中基本不会出现,如果恰巧碰到了那就再解决冲突呗。

stash
  • 我们修改了多个文件比如修改了ABCDEF...Z这26个文件
  • 主管就过来说有个模块非常急,需要先合入ABCD这4个文件
  • 远程仓库已经有人合入了LX这两个文件
  • 然后记得养成良好的习惯,「commit后pull一下远程代码库」

总结就是不想提交所有修改的文件,且修改的文件中有冲突的情况下

意思就是,本地有些文件可能在合入的时候被覆写,此时有两种选择

  • commit,然后解决冲突
  • stash,然后pull下来,之后stash pop的时候如果有冲突,解决冲突

stash就是把本地的所修改的先放在一个git的“堆栈”中,本地对远程就是未修改的状态,然后就能正常的pull

使用git stash save [save message] 来暂存改变之后,能够成功的pull下来,接下来看下git的状态

既然能保存,那肯定能取出来,上面也说过,如果你save的文件和远程仓库修改的文件一样,那么pop出来的时候肯定会有冲突

解决方案同样是处理冲突,这里就不再赘述了

reset

第一篇文章中有说到根据status中的提示,add和commit都可以回撤,那push后肯定也有对应的操作。

可以看到至少有两个文件是在本次的push中进行的,要想撤回push,首先得知道push了啥,都有哪些push

通过git log来查看,但是git log有很多骚操作(就是美化),最常用的就是以下几种

  • 啥都不加,输出全部且冗长
  • 输出前几个,git log -p
  • 单行输出,git log --oneline

当然是可以组合的,git log --oneline -2 自然就是单行输出前2条记录。

不难看到,每次的提交主题都是一串数字(版本号)和commit时候的消息,当我们想回退到其他版本的时候,就可以git reset [版本号] 即可。我知道网上关于reset也有很多骚操作,回退前多少次啥的,但是都不如查看版本号回退来得好使,非要用的时候查一下就好了。

加入我要回退到上个版本,只需要这样做

可以看到原本push的两个文件现在已经变成了待提交的状态。

「创作不易,如果对你有帮助,欢迎点赞,收藏和分享啦!」

「下面是个人公众号,有兴趣的可以关注一下,说不定就是你的宝藏公众号哦!!!」

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 咖啡编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • pull
  • mr时conficts
  • pull时conflicts
  • stash
  • reset
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档