热门标签 | 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操作中常见的问题及解决办法。如有疑问欢迎文末留言。

 


推荐阅读
  • 持续集成概述与实践指南
    本文探讨了持续集成(CI)的基本概念、目的及其在现代软件开发中的应用。通过实例分析,帮助读者理解如何有效实施持续集成,提高软件开发效率。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 本题旨在通过给定的评级信息,利用拓扑排序和并查集算法来确定全球 Tetris 高手排行榜。题目要求判断是否可以根据提供的信息生成一个明确的排名表,或者是否存在冲突或信息不足的情况。 ... [详细]
  • C#设计模式学习笔记:观察者模式解析
    本文将探讨观察者模式的基本概念、应用场景及其在C#中的实现方法。通过借鉴《Head First Design Patterns》和维基百科等资源,详细介绍该模式的工作原理,并提供具体代码示例。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 作为一名在大型手机游戏公司工作的程序员,尽管主要负责游戏逻辑和内容的开发,但对iOS底层开发接触较少。现在有了iPhone和可以虚拟MAC环境的电脑,希望能找到有效的iOS开发学习路径。 ... [详细]
  • 本题探讨了在一个有向图中,如何根据特定规则将城市划分为若干个区域,使得每个区域内的城市之间能够相互到达,并且划分的区域数量最少。题目提供了时间限制和内存限制,要求在给定的城市和道路信息下,计算出最少需要划分的区域数量。 ... [详细]
  • 算法题解析:最短无序连续子数组
    本题探讨如何通过单调栈的方法,找到一个数组中最短的需要排序的连续子数组。通过正向和反向遍历,分别使用单调递增栈和单调递减栈来确定边界索引,从而定位出最小的无序子数组。 ... [详细]
  • 树链问题的优化解法:深度优先搜索与质因数分解
    本文介绍了一种通过深度优先搜索(DFS)和质因数分解来解决最长树链问题的方法。我们通过枚举树链上的最大公约数(GCD),将所有节点按其质因子分类,并计算每个类别的最长链,最终求得全局最长链。 ... [详细]
  • 如何将本地Docker镜像推送到阿里云容器镜像服务
    本文详细介绍将本地Docker镜像上传至阿里云容器镜像服务的步骤,包括登录、查看镜像列表、推送镜像以及确认上传结果。通过本文,您将掌握如何高效地管理Docker镜像并将其存储在阿里云的镜像仓库中。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
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社区 版权所有