热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Git初学札记(四)————GitPush的常规操作与Pull冲突解决

目录引言Git命令行的远程PushEGitPush操作中的冲突问题同步工作区与本地库同步工作区与远程库同步图标重点引言在团队开发当中,GitPush是多人协作环节中的最重要的一环可

目录

引言

Git命令行的远程Push

EGit Push操作中的冲突问题

同步

工作区与本地库同步

工作区与远程库同步

图标

重点


引言

在团队开发当中,Git Push是多人协作环节中的最重要的一环可能没有之一。同SVN一样,push操作可以看做是对远端程序的提交。

在多人协作中,push往往是最容易出现问题的一个环节,因为其他开发者有可能修改了你正准备提交的文件,并且已经先你一步提交到了远程仓库中。由此,才会引出后面一系列的pull、merge等操作。

由于在之前的博客《实现个人的Git远程代码版本控制————EGIT完成Eclipse到GitHub一条龙》中已经详细介绍了通过EGit Push新项目的操作,因此本篇博客主要介绍一下Git命令行的操作,以及在Push中可能会遇到的种种问题及解决办法。

Git命令行的远程Push

不论以哪种方式push到远程仓库,都需要先在远程建立一个可以与之关联的空的仓库。为了简化演示过程,我们采用GitHub作为远程仓库的创建服务器。

首先,我们已经在远程建立了一个空仓库:

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

复制仓库地址,执行git命令:

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

如上图所示,首先我们为本地仓库add(关联)一个远程仓库,并默认命名为origin,然后通过push命令推送到远程仓库,输入git push -help,可以查看一下push命令的参数,其中-u代表设置上游(远程库)

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

第一次通过-u参数push项目的同时设置好远程库之后,后面就可以直接git push origin master了。

EGit Push操作中的冲突问题

正如引言中所述的情况,我们将分支push到远程仓库的时候恰巧远程仓库中已经有了改动而与我们正准备提交的代码有冲突。这种情况在过去的开发中屡见不鲜,在svn中也存在同样的问题,常常是一个工具类,大家都添加了自己的工具方法,如果不希望merge混乱,就需要有一个专门的merge人员,每天定点去服务器上对大家的修改进行merge操作。虽然近些年微服务的口号喊得响彻,但是对于不适合微服务的项目,就仍然存在多人同时修改了共有文件的情况发生。虽然我们不希望这样的情况发生,也会尽量避免这种情况的发生,但仍然要学习如何使用Git去处理冲突的情况。

最有用的建议是:

push之前请先同步对比!

EGit的全部功能都封装自git命令,应该说git命令包含了全部的EGit插件操作。但是对于某些比对性的操作,命令行的体验往往是差强人意的,尤其是在项目文件繁多的情况下,几十个文件进行比对,绝对会让你看的眼花缭乱。

假设此时,我们已经对自己修改的代码充满了信心,并且提交到了本地仓库,正准备push到远程库上去,这个时候我们应该怎么做?是直接push还是先pull?我觉得先查看一下同步比对数据的情况,然后对我们接下来的操作结果做到心中有数才是上策!接下来就来讲解一下对比的操作。

同步

工作区与本地库同步

选择Team>Synchronize Workspace

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

Synchronize Workspace”翻译过来是“同步工作区”,这听起来有些“吓人”,但是实际上,它仅仅是将本地库与工作区内容进行比对。

工作区与远程库同步

同步之前,需要先将 Remote Tracking 的远程库进行Fetch...操作。

Fetch步骤如下:

切换到Git Repository视图,右键项目名 > Remote > Fetch...

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

Fetch 完成!

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

这样我们就可以任意选择远程分支与本地工作区进行比对:

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

注意这里EGit为了区分工作区与本地库的比对和工作区与远程库的比对,特意加了一个with,因此这里的“Synchronize with Workspace”代表的是工作区与远程库的一个分支进行比对。

比对图标

这里的一些图标信息和svn的用法是类似的,灰色箭头代表本地有修改,蓝色箭头代表远程有修改,红色双箭头代表此文件有冲突。

在EGit官网上也给出了具体图标的解释:

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

(但愿各位的英语和我一样好 罒ω罒 !)

从上图可以看出,我们的项目仅仅是有一个本地的修改,因此可以确定的是push之后不会出现任何冲突问题,可以放心大胆的push。也不需要每次push之前都无脑的pull。

这里注意一下,Git的Push操作无法在Synchronize视图中进行,因为Git的push操作都是针对于分支而言的,也就是说,我们实际上只能push当前的分支,而非文件,就算是只有一个文件的修改,也必须是push分支,也就是命令行中看到的git push origin master,master就是当前的分支。而Svn可以直接在Synchronize视图中提交单个或多个文件,这一点应该说svn要优于git。但是瑕不掩瑜,Git强大的分支开发和版本管理体系是svn无法匹敌的。

为了push我们的分支,需要先回到基础Java视图中来,右键项目>Team>Remote>Push...或者 :右键项目>Team>Push to Upstream(前提是已经与远程库建立关联关系)

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

push成功!

重点

假设,我又对程序进行了修改(添加了一行输出语句“I wanna learn Vue.js very well!”),并且已经提交到本地库中,正准备push到远程仓库。

我们如之前的建议,正确的将工作区代码与远程仓库的代码进行比对:

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

但是不幸的是,有人已经对这个文件进行了修改,并且冲突甚是嚣张!如果我们不做任何感想,直接push会有什么情况发生?

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

我们心里很清楚,push操作在冲突的情况下是不可能完成的,不过貌似返回的错误信息还是很友好的。但请注意红框内的单词:rejected ,拒绝 ,而且还是过去时,那啥也别说了,远程库已经拒绝了我的push请求!所以英语不好的小伙伴一定注意了,这里的push失败对话框真的是不太鲜明,有可能误以为push操作已经成功。这里千万要注意。

我们可以检查一下远程的仓库,来进一步验证我们的判断:

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

果然没有push成功。

那么这个时候我们应该做什么?我们应该先pull,然后解决冲突再进行push操作。

右键项目>Team>Pull... 或者:右键项目>Team>Pull (前提是已经有远程库关联)

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

建议刚开始使用的小伙伴可以先使用“Pull...”进行拉取操作,因为会弹出一个Pull对话框,里面的信息对我们理解我们的操作会有不小的帮助,后面熟练了可以使用“Pull”直接从默认的远程库中去拉取。

执行完成后,我们的冲突文件就变成了这个样子:

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

可以看到,Git会将HEAD和远程库的修改内容全部都写入冲突文件中,并且使用<<<<<<<======= >>>>>>>进行区分。

我们手动进行修改即可,修改结果如下:

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

再次commit的时候,Git会为我们自动生成一个Commit Message信息,非常智能:

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

提交完成后,我们再次尝试Push操作,弹出结果对话框如下:

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

这回貌似没有rejected了,进一步检查一下GitHub上的文件内容:

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

和我们push的结果一样。

综上,就是冲突发生的时候我们的处理办法。但是这种开发者之间无沟通的冲突解决办法只是一种方案,我们通过pull,手动删减内容,来完成冲突的解决。但是如果这个文件发生冲突的地方达到几十行甚至上百行的情况又该怎么办?

如果一个文件的冲突内容参差不齐,且数量很多,达到了几十行甚至上百行的级别,那么我们应该与发生冲突的开发者进行线下沟通,尝试以版本回退后共同merge的方式来解决冲突,即先进行线下merge,然后由其中一人进行push操作。

总的来说,解决冲突的办法还是比较多的,如果讨厌删删改改的小伙伴,可以同事之间协调沟通,共同merge,这样也可以相互学习,交流经验。

 

综上,就是push操作中常见的问题及解决办法。如有疑问欢迎文末留言。

 


推荐阅读
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 熟练掌握Spring Cloud,终于成为Java工程师的面试门槛 ... [详细]
  • 说出来你可能不信,我用三天做了一个完整的项目
    Java在人工智能中能起到什么作用?作为编程语言中的扛把子,Java20多年稳定不倒,就在于它的稳定性,维护成本极低。这使得 ... [详细]
  • 都说Python处理速度慢,为何月活7亿的 Instagram依然在使用Python?
    点击“Python编程与实战”,选择“置顶公众号”第一时间获取Python技术干货!来自|简书作者|我爱学python链接|https:www.jian ... [详细]
  • SOA架构理解理解SOA架构,了解ESB概念,明白SOA与微服务的区别和联系,了解SOA与热门技术的结合与应用。1、面向服务的架构SOASOA(ServiceOrien ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
author-avatar
雨霖铃111130
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有