使用IDEA模拟git命令使用的常见场景

大家好,最近白泽第一次开始参与小组合作开发,以前都是自己用git保存自己的代码,自己维护,用git的场景也比较单一,没有遇到过拉取代码合并出现冲突的问题。但是小组开发拉取远程仓库的代码时,遇到他人所提交代码与自己的本地代码出现冲突在所难免,所以白泽特意去学习了一下git的冲突处理,接下来用一个小demo复现一下我学习的过程

前期准备

新建一个远程仓库

在一个文件夹内建立两个子文件夹作为两个本地仓库的存放位置
  • 之所以建立两个文件夹,这样做的目的是为了模拟两个用户对同一个项目进行合作开发,假设demo1为用户A的本地仓库,demo2为用户B的本地仓库,后面会用两个本地仓库模拟多人开发中会遇到一些常见场景,并给出解决方案

  • 在demo1文件夹中新建test1与test2两个文件作为demo1仓库的初始内容,此时demo2文件夹为空

本地仓库与远程仓库建立联系
  • 下面这张图是新建git远程仓库成功之后显示的提示文档,指示你该如何将本地仓库与远程仓库建立联系,我给出了每条命令的解释

echo "# 内容" >> README.md 		  //生成一个帮助文档,可以不通过命令行创建,也可以不创建
git init //将当前文件夹初始化为一个git本地仓库
git add README.md //将README.md添加到暂存区
git commit -m "第一次提交" //将暂存区中的文件提交到本地的git仓库
git branch -M main //将当前分支重命名为main
git remote add origin git@github.com:BaiZe1998/git-idea-demo.git//添加远程仓库(建立联系)
git push -u origin main //将本地仓库当前分支的内容推送到远程仓库的main分支,使用-u参数后以后推送如果不加origin main,就会默认推动到origin的main分支
  • 此时依旧在git-idea-demo1的文件夹内,在下方的终端输入处输入上述所有的命令,结束之后结果应该与下图相同

  • 细心的你发现远程仓库的内容确实更新了,但是有一个问题就是你发现远程库并没有test1.txt与test2.txt两个文本文件,原因在于上面我们使用了一个命令 git add README.md,这个命令只是将README.md这一个文件添加到缓存区,后面的 git commit -m "第一次提交" 负责将缓存区中内容全部提交到本地仓库,然后由git push -u origin main命令将本地仓库内容全部推送到远程仓库,为了使得我们远程仓库也能同步test1.txt与test2.txt必须一开始就将这两个文件加入本地的缓存区

    接下来通过输入三行代码将test1.txt与test2.txt同步到远程仓库

git add .					//表示将当前文件夹内所有文件加入缓存区
git commit -m"描述信息" //提交时可以添加一些描述信息"
git push //第一次使用了git push -u origin main之后下一次提交只需要git push简写即可
  • 最后远程仓库也同步了本地仓库的数据,我们的准备工作也做好了,接下来正式开始模拟两个用户协同开发时会遇到的场景

模拟两个用户协同开发的场景(使用IDEA自带界面操作,不使用命令行)

假设:员工A是某公司的老员工,员工B是公司的新人

推送代码到远程仓库(当只有一个人在维护远程仓库时)

事实上上述操作git的步骤都是使用了git的命令行操作的方式,并没有发挥出IDEA的强大,接下来将尽量使用IDEA的界面上的可视化按键去完成对git的操作

  • 当员工B还未加入到员工A的开发小组,整个项目只有员工A在维护的时候,员工A在自己的新建了test3.txt,接下来将该文件添加到缓存区,并提交到本地仓库,然后再从本地仓库推送到远程仓库(修改->添加->提交->推送,这是很常见的一个git操作流程,注意接下来将不使用命令行操作)
  • 修改项目内容(添加了test3.txt)

  • 添加到缓存区

  • 提交到本地仓库,并且选择commit and push

  • 远程仓库完成了数据的同步

克隆远程仓库项目
  • 今天员工B被分配到员工A所在的小组参与开发,所以他首先要将小组当前正在开发的分支的项目代码从远程仓库克隆到本地,首先用IDEA打开git-idea-demo2文件夹,在终端Terminal处输入git clone 远程仓库的地址将整个项目拷贝到git-idea-demo2文件夹内

  • 注意,虽然员工B在git-idea-demo2文件中用了克隆,但是git-idea-demo2中的git-idea-demo文件才是员工B本地仓库的存放文件(进入之后看到.git文件在哪个文件夹内,哪个文件夹就是本地仓库文件夹)

拉取远程仓库的代码(远程仓库与本地仓库无冲突)
  • 就在员工B开始正式参与A小组的开发,当前他还未对上一次克隆下来的版本的代码做任何修改,在准备开始编码前,他又尝试去远程仓库拉取最新的代码(因为员工A有可能又提交了新的修改的版本)

  • 为了满足情景,我们让员工A修改一下test3.txt,然后推送到远程仓库

  • 员工B拉取远程仓库的最新版本的代码,选择第一个,将要修改的代码合并到当前分支

  • 此时员工B本地仓库的main分支已经已经合并了员工A提交到远程仓库main分支上的修改(注意此时员工B,从远程仓库拉取代码,将代码合并到本地仓库,都是IDEA自动完成,这只有在没有冲突发生的情况下才能做到)

拉取远程仓库的代码(远程仓库与本地仓库有冲突)
  • 员工B修改了test3的代码,并且执行添加->提交->推送

  • 接下来员工A也修改了test3.txt文件,这次将原来的第一行内容改变(此时员工A还没有去拉取远程仓库的代码),然后在提交修改之前员工A又去拉取远程仓库的代码(提交自己的更改前拉取远程仓库代码是一个好的习惯)

  • 发生了冲突,因为员工A本地所做的修改是在员工B推送到远程仓库的前一版本的基础上做的修改,而员工B的推送使得远程仓库的最新版本与员工A本地版本不同(很明显员工B修改了test3文件,而员工A本地也在修改test3文件,如果贸然将远程仓库的代码合并到员工A的本地,远程仓库的代码很有可能覆盖掉员工A当前所做的修改,所以此时需要手动处理冲突,选择最终需要保留的部分)

  • 手动处理冲突,最终选择保留A自己的修改,以及额外又添加上了第三行修改

  • 员工A将修改推送到远程仓库(本次整体的流程为:拉取->处理冲突(如果有)->添加->提交->推送)

使用IDEA模拟git命令使用的常见场景的更多相关文章

  1. git 沙河游戏节点图, 自由沙盒模拟git, 各类交互git命令

    git学习练习总资源链接: https://try.github.io/ (练习已通,有document) 本沙盒游戏教学:https://learngitbranching.js.org/?demo ...

  2. 一些常见的shell命令和git命令

    shell命令: pwd : (Print Working Directory) 查看当前目录 cd (Change Directory) 切换目录,如 cd /etc ./当前目录  ../上级目录 ...

  3. 使用 Git 命令去管理项目的版本控制(二)

    参考 上一篇  完成本篇博客,本篇为作者原创,仅供学习参考. 本篇博文在上一篇的基础上这里记录了我的一个小模拟练习.本篇作为自己的学习笔记,也意在方便其他人的学习使用,达到分享目的.下面主要是操作截图 ...

  4. 【转】Github轻松上手4-常用的git命令

    转自:http://blog.sina.com.cn/s/blog_4b55f6860100zzih.html 附上一些git的常见命令: •    git remote add origin git ...

  5. Git命令详解

    一个中文git手册:http://progit.org/book/zh/ 原文:http://blog.csdn.net/sunboy_2050/article/details/7529841 前面两 ...

  6. 一天工作所用到的Git命令

    一天工作所用到的Git命令 像大多数新手一样,我一开始是在网上搜索 Git 命令,然后把答案复制粘贴,并没有真正理解它们究竟做了什么. 后来我曾经想过:"如果有一个最常见的 Git 命令的列 ...

  7. git命令的理解与扩展

    Git的模式如图: Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Repository:仓库区(或本地仓库) 一.新建代码库 # 查看gi ...

  8. git命令详解( 三 )

    此篇为git命令的第三篇 目录 git Pull 模拟团队合作 Git Pull 在上一篇的结尾我们已经知道了如何用 git fetch 获取远程的数据, 现在我们学习如何将这些变化更新到我们的工作当 ...

  9. 颠覆Git 命令使用体验的神器 - tig

    颠覆 Git 命令使用体验的神器 -- tig     tig, 就是把 Git 这个单词倒过来念, 它是一个命令行工具, 日常使用中我用它来取代 Git 最高频的几个操作, 如 git log, g ...

随机推荐

  1. 树的遍历c/c++

    先序遍历(递归) 1 void preOrderTraverase(TreeNode * r) 2 { 3 if(r) 4 { 5 printf("%d\t",r->_dat ...

  2. Docker Hub 镜像加速器

    一.概述 国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器.Docker 官方和国内很多云服务商都提供了国内加速器服务. 二.配置加速地址 Ubuntu 16.04+.De ...

  3. C#连接Excel读取与写入数据库SQL ( 下 )

    接上期 dataset简而言之可以理解为 虚拟的 数据库或是Excel文件.而dataset里的datatable 可以理解为数据库中的table活着Excel里的sheet(Excel里面不是可以新 ...

  4. Java 面向对象 04

    面向对象·四级 多态的概述及其代码实现 * A:多态(polymorphic)概述 * 事物存在的多种形态 * B:多态前提 * a:要有继承关系 * b:要有方法重写 * c: 要有父类引用指向子类 ...

  5. Maven配置ali镜像

    Maven目录,Conf文件夹下settings.xml 找到mirrors节点 添加配置 <mirror> <id>alimaven</id> <mirro ...

  6. Git详解和Github的使用

    Git和Github的概念: Git是分布式版本管理系统,简单说就是一个软件,用于记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的软件. Github是一个为用户提供Git服务的网站,简单说 ...

  7. Qt update刷新之源码分析总结

    大家好,我是IT文艺男,来自一线大厂的一线程序员 经过前面几次的Qt源码讲解,我相信大家对Qt update刷新机制从底层原理上有了一个深刻的理解:这次做一个收尾总结,来复盘前面几次所讲解的内容: 分 ...

  8. CodeMonkey少儿编程第7章 函数

    目标 了解函数是什么 掌握如何定义一个函数 函数是什么 本章我们学习一个新的概念----函数. 你可以简单的将函数看作为一个黑匣子,给它输入参数后,它将会按照一定的规则,执行相应的指令或输出数据. 让 ...

  9. 安装JDK步骤,配置环境变量

    DK是Java语言的软件开发工具包,主要用于移动设备.嵌入式设备上的java应用程序.JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具.所以今天教一 ...

  10. dk.exe自动填报程序的反编译

    dk.exe自动填报程序的反编译 dk.exe用于学校每日健康报的自动填写.