Git学习--通俗易懂的学习方法(下)

206 阅读11分钟

Git 分支操作

​ 开发企业项目中在使用Git 或者其他类似版本控制软件对项目版本进行管理时,多人合作的项目在开发时通常不会直接在主干master 上进行操作,而是重新开辟新的分支,在新的分支上进行开发 调试 等操作,当项目调试通过时才会将分支项目的代码合并到主干中,这是在实战中比较好的一种策略,特别是多人协同开发一个项目的情况下尤其明显。Git 对于分支操作提供了一下基本命令:

命令描述
git checkout branch切换到指定分支
git checkout -b new_branch新建分支并切换到新建分支
git branch -d branch删除指定分支
git branch查看所有分支, 并且*号标记当前所在分支
git merge branch合并分支
git branch -m | -M oldbranch newbranch重命名分支,如果newbranch名字分支已经存在,则需要使用-M强制重命名,否则,使用-m进行重命名。

本地分支创建、合并、重命名与删除

​ 以前面git版本库为例。

  • 创建本地分支、并查看分支

    默认Git 版本库所在分支为master 通常称为项目的主干,开发中通常会在主干上创建新的分支类进行本地开发工作 使用命令 git checkout -b new_branch 创建分支

    分支创建完毕 该命令会自动切换到新建分支上 如上图

    使用命令 git branch 查看分支列表 * 号标记为当前git 所在分支

  • 分支上添加文件leaf01.txt 添加操作同主干添加命令 leaf01.txt 文件内容如下:

  • 切换到主干master 并执行合并操作

  • 重命名分支leaf01->leaf02

  • 删除分支(不能再待删除的分支上执行删除当前分支操作!!!)

分支Push与Pull操作

相关命令操作

命令描述
git branch -a查看本地与远程分支
git push origin branch_name推送本地分支到远程
git push origin :remote_branch删除远程分支(本地分支还在保留)
git checkout -b local_branch origin/remote_branch拉取远程指定分支并在本地创建分支
  • 查看远程仓库 此时远程仓库只有主干master

  • 新建分支leaf01 并执行分支推送操作

远程查看 此时本地分支远程推送完成(注:推送远程分支名称可改)。

  • 远程创建dev分支并拉取分支到本地

    GitHub支持远程分支在线创建,这里dev开发分支创建后分支文件内容与主干master一致

    本地执行克隆 并拉取dev 分支到本地

    执行git clone 命令

    查看本地项目并执行命令 git checkout -b dev origin/dev 拉取dev 开发分支

分支操作冲突出现与解决

​ 开发中对不同分支下同一文件进行修改后执行合并时就会出现文件修改冲突情况,这里说明一种比较常见的冲突问题 以master 和leaf01 两个分支进行演示说明。

本地分支操作冲突

  • 修改master与leaf01分支前git01.txt 文件内容状态

    master 主干文件内容:

​ leaf01 分支文件内容:

  • 分支leaf01 下修改给git01.txt 并执行提交操作 效果如下

  • 主干master 下修改git01.txt 并执行提交操作

  • 执行合并操作 此时发现git 在合并中产生冲突

执行cat git01.txt 可以看出冲突文件内容

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容  
<<<<<<< HEAD  当前git 指向分支 这里指的为master
=======  分离不同分支修改的内容
>>>>>>> leaf01  leaf01 与 master 在git01.txt 同一行同时出现了修改操作 这里git 是不允许发生的

此时出现冲突后 这里对git01.txt 内容进行修改 (实际开发视情况而定 这里将内容合并为一行)

修改完毕master下执行提交即可 执行命令查看分支合并图 git log --graph --pretty=oneline

多人协同操作冲突

​ 拉取远程库dev 并在本地创建dev开发库,执行命令 git checkout -b dev origin/dev 这里以同台机器不同窗口来模拟两个用户操作同一分支同一文件(实际开发时多人操作统一文件冲突情况比较常见)

这里两个客户端以c1与c2来描述

c1 客户端本地修改dev 分支git01.txt 文件并在本地执行提交操作 效果如下

执行远程推送 将本地C1客户端提交的git01.txt 推送到远程dev分支

而此时C2 客户端在本地同样修改了dev分支git01.txt 文件并在本地执行提交

执行推送操作 此时冲突出现 原因是另外一个用户推送的文件与当前客户端推送内容存在冲突:

此时解决方式Git 已有对应提示 Push 之前先执行Pull 操作 将远程文件拉取到本地 解决完冲突后再次执行Push 操作

冲突解决

先执行Pull 拉取操作

查看冲突文件内容

这里在本地先处理冲突 将文本进行合并 然后提交 在 push 操作即可

远程仓库内容如下:

标签管理

标签操作基本命令 git tag

命令描述
git tag tag_name新建标签 默认为HEAD
git tag -a tag_name -m 'xxx'添加标签并指定标签描述信息
git tag查看所有标签
git tag -d tag_name删除一个本地标签
git push origin tag_name推送本地标签到远程
git push origin --tags推送全部未推送过的本地标签到远程
git push origin :refs/tags/tag_name删除一个远程标签

​ 同大多数 VCS 一样,Git 也可以对某一时间点上的版本打上标签。开发中在发布某个软件版本(比如 v1.0 等等)的时候,通常使用版本库软件命令来对某一版本打上一个标签,以方便标识。

  • 添加本地标签

      ![](https://img-blog.csdnimg.cn/20201223104825357.png#pic_center)
    

标签默认会打到最近的一次提交记录上

也可以对某个指定的提交标识进行标记

打标签时给标签添加说明信息 git tag -a v0.0.1 -m '软件基础版本' a4a44dc

推送本地标签到远程

远程查看

  • 删除本地标签

  • 删除远程标签

Idea下Git基本操作

环境集成配置

全局setting 下 git 环境指定

指定git.exe 文件路径

远程GitHub 配置

克隆远程仓库到本地

或者在Idea 打开情况下

设置远程url 地址(这里使用ssh) 并指定本地项目路径

克隆到本地 idea 打开效果:

Idea 下分支拉取与远程推送

分支拉取

默认情况下,使用Idea检出远程仓库master文件到本地,这里点在idea中可以方便查看(与使用命令方式一致)

或者 idea 右下角 查看如下:

检出远程库dev 分支到本地 这里可以使用前面的命令 git checkout -b local_branch origin/remote_branch 或者使用图形化界面进行操作 这里介绍第二种 图形化操作 在idea 右下角拉取远程dev 到本地

检出成功后提示信息如下:

命令查看分支情况

远程推送

​ 在以上拉取到本地的dev 分支下修改文件git01.txt 然后执行推送操作

修改为文件添加到暂存区

执行本地提交操作

此时提交出现提交窗口

这里发现 仅仅修改了git01.txt 文件 为什么会出现这么多新增的文件? 这些文件也不是从远程拉取到本地的,没有必要进行提交操作 如果提交会影响他人本地环境!!! 此时的解决方案比较简单,将暂存区的无用文件转移到工作区即可 执行命令 git reset HEAD 文件名 即可达到效果 (取消提交操作,这里需要借助git 命令进行操作 后续会介绍一种简单办法)

执行命令 git reset HEAD .idea/* git reset HEAD git01.iml 将暂存区无需提交文件转移到工作区

执行 git status 查看暂存区文件 即将提交到本地版本库文件 发现待提交的文件只有git01.txt

执行提交操作

执行远程推送操作

或者

提交分支确认

远程查看

ignore插件集成

​ 前面讲到dev 分支拉取与文件修改推送操作,遇到一个小的问题-在修改完git01.txt 文件后添加文件到暂存区后会将idea 本地环境相关配置文件一并提交,而这些文件没有必要提交 如果提交对于另外一方更新到本地后反而会影响项目运行 前面解决的方式是借助命令方式将暂存区文件转移到工作区来解决。

​ 命令方式虽然能够解决,但操作麻烦,每次提交不可避免会遇到同样问题,这里介绍一个插件-gitignore,使用gitignore 插件可以在执行文件添加前将没有必要提交的文件让git给自动忽略掉这样开发中就只需要关注修改的文件即可,想想是不是很美!

1) 安装插件ignore

​ settings->plugins->Marketplace 搜索.ignore插件 如果之前没有使用过该插件 点击install按钮,idea会自动下载并执行安装操作,当插件安装成功后重启idea即可。

2) .ignore忽略文件使用

​ 插件安装成功重启idea后,ignore插件即生效,接下来就可以使用插件来忽略待添加的相关文件。

新建.ignore忽略文件

点击generate 新建文件即可

文件创建成功后会放在项目根目录下 这里将新创建的.ignore文件加入暂存区(会有相应提示 点击add to git 即可)

配置忽略文件

​ .ignore 忽略文件创建成功后,即可配置待忽略文件,配置方式相当简单 在待忽略的文件上右键 添加到忽略文件即可 如下:

自动产生的文本内容如下:

修改git01.txt 文件后执行添加并提交 此时未受版本控制的文件列表已消失 执行提交即可(也可以提交同时进行推送一步到位!)。

分支操作与冲突处理

​ idea 下对于分支的操作使用起来相比命令操作是比较简单的,开发环境下idea分支操作比较常见

本地分支创建与切换

设置本地分支名称leaf01

idea下分支切换比较简单 Git->Repository->Branches 选择指定分支 执行checkout即可。

冲突出现与解决

多用户操作同一文件同一行内容提交冲突

多用户同时修改某个文件同一行内容,并能够提交,此时便会出现冲突,对同一版本文件不能出现不同内容的文件

文件提交前状态模拟

用户:张三

用户:王五

此时 假如张三抢先一步进行提交操作

此时,对于张三来说,本地提交并推送没有问题,回到王五这端,此时假如王五在不知道张三对同一文件进行修改的情况下也进行了提交操作,此时,王五这端提交结果如下:

此时,在对文件进行提交时,系统提示 建议先进行合并操作,意思就是将服务器端最新内容先合并到本地后再进行提交操作。

执行merge合并操作

最后提交 王五这端内容。

张三 这端执行拉取操作

分支操作内容冲突

在使用git 对文件进行版本控制时,在不同分支同一文件同一行进行修改的情况下,此时对分支文件进行合并时,同样会有出现冲突的可能。

在master 下创建新的分支leaf01

分支下修改文本第三行内容:

此时在分支leaf01 上执行提交与push 操作 此时是没有问题的(假如其它用户没有在当前分支对应文本同一行修改与提交操作)

回到主干上 修改主干文本第三行内容

主干上执行提交与push 操作此时主干提交没有问题(假如其它用户没有在当前主干对应文本同一行修改与提交操作) 然后在主干上执行合并操作 选择待合并的leaf01 分支:

此时出现冲突场景

冲突之所以出现的原因在于:主干与分支在统一位置同时进行了修改操作,此时执行合并操作是不被允许的 因为git 此时再合并时不能区分是执行替换操作 还是执行追加新内容到主干此时需要用户来进行冲突解决(合并分支内容到主干或者进行替换处理)这里执行追加处理(注意:在企业中具体场景具体分析 添加还是做替换操作)

追加完毕后主干上执行提交与push 操作即可 此时冲突解决。