Git的基础使用

219 阅读12分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情

一、什么是Git?

1. Git的定义

Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。

2. 与SVN有何区别?

  1. Git是分布式的,SVN不是:

这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。好处是跟其他同事不会有太多的冲突,自己写的代码放在自己电脑上,一段时间后再提交、合并,也可以不用联网在本地提交;

  1. GIT与SVN版本机制不一样:

Git 只关心文件数据的整体是否发生变化,而SVN这类版本控制系统则只关心文件内容的具体差异。这类系统(如SVN)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容,然而Git 并不保存这些前后变化的差异数据。实际上,Git更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。

  1. GIT不需要联网:

SVN 断开网络或者断开VPN就无法commit代码,但是Git 可以先commit到本地仓库。用SVN的话,没有网络或者断开VPN时,你当然也可以继续在本地开发,但是无法commit代码,因为SVN 每次commit都必须联网,长时间不commit代码会丢失大量开发进程的历史纪录。有个比喻是:不能commit就像用word写文档不能save一样危险。而且有网络的情况下每一次commit都会花上数秒甚至更长时间。但用 Git 的话,就算你在飞机或者火车上,都可以非常愉快地频繁提交更新,因为是在本地仓库commit所以几乎不需要时间,而且commit一定要频繁,不然无法记录你的改动,如果你一天commit一次,中间的修改你就找不回来,然后等到了有网络的时候再将版本纪录和代码一起上传到远程仓库。

  1. Git 的内容完整性要优于SVN:

因为Git 在commit(存储在本地)或者push(上传到远程仓库)之前,通过对文件的内容或目录的结构计算出一个 SHA-1哈希值,作为指纹字符串进行内容的校验,并将此结果作为数据的唯一标识和索引,在远处仓库接受到commit的文件之后,会再计算一遍哈希值然后跟传递过来的哈希值做比较,如果不一致,说明文件在传输时变得不完整,或者磁盘损坏导致文件数据损坏。另外在 Git 数据库中的东西都是用此哈希值来作索引,而不是靠文件名;

3. 为什么要用Git?

  1. git 每台电脑都有一个版本库,可以在本地做版本管理;

  2. 速度快。git的速度远超大部分版本管理系统,包括svn

  3. 强大的分支管理功能

  4. 活跃的开源社区,如最著名的github

4. Git与GitHub

gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub。

gitHub除了git代码仓库托管及基本的 Web管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。—— 摘自百度:作为开源代码库以及版本控制系统,Github拥有超过900万开发者用户。随着越来越多的应用程序转移到了云上,Github已经成为了管理软件开发以及发现已有代码的首选方法。

二、安装和配置

除了官方版本,也有其他软件公司将Git包装成GUI操作界面类型的程序(官方版本主要是使用指令模式进行操作)。虽然GUI的图形化操作界面看起来比较吸引人,但是建议还是先从Git的指令模式开始学习,这样才能够清晰的了解Git的工作细节。玩转了指令模式,界面工具自然能够水到渠成。

1. Git安装、部署和运行

Windows安装

Git下载地址

image.png 傻瓜式安装,我是一路next点下去的。

因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识。

  • git config --global user.name "xxx"
  • git config --global user.email "xxx@xx.com"

image.png

我这边用Git连接Github仓库,所以需要先进行生成RAS密钥并去配置 ssh-keygen -t rsa -C xxx@xx.com 输入后一直回车即可完成。

image.png

根据上图红框中的公钥地址寻找到对应的公钥:

image.png

然后去配置github上对应的公钥,右上角-->setting-->SSH and GPG keys-->new SSH key。把刚才本地生成公钥粘贴至key中且保存(保存后会提示输入密码,github的登录密码)。

image.png

Linux安装

请看我另外一篇文章 centos7安装git并配置

2. GIT指令模式

安装完git后,在任意一个文件夹(我自己的一个简单项目:D:\Code\owntest\wiremvc),右键进入git bash

image.png

本地项目初始化

git init    让git开始管理这个文件夹,在同级目录下会出现一个隐藏的.git文件。

image.png

image.png

本地提交

git status  检查版本状态

image.png

本地提交(可以两个步骤,也可以一个步骤)

两个步骤:

git add .git add filename (.代表所有新增、修改;  filename 表示要添加的文件名称)

git commit -m 'new project'   提交版本  '版本提交描述'

一个步骤: git commit -am 'new project'   加入缓存区并提交

这个时候如果上面的不想推送了,可以执行 git rm -r --cached . 命令进行,删除提交的缓存

忽略和排除

忽略那些不需要管理的文件夹或文件(比如此项目中.idea文件就需要忽略掉)

touch .gitignore   创建一个.gitignore文件

输入一下内容,因为 .gitignore 本身就需要忽略,所以此文件需要忽略

image.png

  1. “.gitignore”文件的影响范围是它所在的文件夹和所有的子文件夹

  2. 每一个文件夹都可以创建自己的“.gitignore”文件,如果它上层的文件夹也有“.gitignore”文件,这个文件夹也会受到它的影响。

  3. “.gitignore”文件中可以使用“#”字符开头表示注释,文件夹路径是用“/”字符,文件名可以使用通配符“*”,另外还可以使用“!”字符表示排除。

提交远程仓库

项目可以提交到GitHub、Gitee、GitLab、码云、第三方代码仓库等等。我这边以GitHub为例子。

登录Github,点击右上角+,再点击 new repository。新建一个和本地一样的工程,“wiremvc”

1670156270185.png

回到仓库,查询出wiremvc仓库远程地址

1670156386938.png

  1. 选定主分支 git branch -M main
  2. 本地新建一个远程连接 git remote add origin git@github.com:xxx/wiremvc.git
  3. 查看远程连接 git remotegit remote -v
  4. 推送 git push -u origin main

1670157077776.png

再次刷新下github上的项目(内容已经成功上传)

image.png

修改远程仓库内容,本地进行拉取同步

我再github中随便修改了一个文件,然后回到本地执行 git pull,拉取更新

image.png

远程仓库克隆

本地执行克隆命令git clone git@github.com:xxx/wiremvc.git

image.png

Git分支管理

创建分支

git branch newtest  创建一个名字为 newtest 的分支

git branch 不加任何参数,查看分支情况(master代表主版本)

1670159671564.png

切换分支

git checkout newtest   切换分支(newtest)

切换提交

在分支newtest上修改  git commit -am 'branch 1'

然后再进行提交 git push --set-upstream origin newtest

image.png

分支的冲突和解决

切回主干版本修改内容,然后提交主干版本

查看冲突 git merge newtest       master版本与newtest分支

image.png

git status 查看当前状态,java类中冲突显示出来了 image.png

image.png

解决冲突(手工修改内容再次提交)---注意如果出现了冲突,就必须先解决冲突才能切换分支

image.png

Git日志

查看提交日志:git log

image.png

简化为一行:git log --oneline image.png

简化成一行,同时显示分支 git log --oneline --graph image.png

Git提交点

在命令行使用gitk可以展示简单的git界面。

commit的中的这些字母和数字就是commit节点的标识(比如最新的提交点是 bdca960..)

image.png

标签

git tag -a v0.1 acc6c33    给第一个提交点打上标签

image.png

恢复

在利用github实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,本文总结了两种解决方法:回退(reset)、反做(revert)

比如我已经修改了控制类的方法,并且已经提交(上面图中的723e84f)这个提交点。

在Git里,有一个HEAD指针指向当前分支(只有一个分支的情况下会指向master,而master是指向最新提交)

git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本。(比如需要回到到第三次提交,也就是723e84f)

使用git reset --hard 目标版本号命令将版本回退

image.png

再进行查看日志:

image.png

git revert的作用通过反做创建一个新的版本,这个版本的内容与我们要回退到的目标版本一样,但是HEAD指针是指向这个新生成的版本,而不是目标版本。

比如我已经修改了控制类的方法,并且已经提交(723e84f)这个提交点。 使用git revert HEAD撤销前一次的commit

image.png

看log信息,revert已经把新建了一个提交点dc5d7f2,这个点的内容和723e84f提交点的内容是一样。区别就是新建了一个commit点。

合并分支

对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。

这时分两种情况。一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(git merge)。另一种情况是,你只需要部分代码变动(某几个提交),这时可以采用 Cherry pick。

比如把newtest的某个提交合并到master分支,先切换到master分支,然后执行 git cherry-pick 723e84f

当然 Cherry pick 支持一次转移多个提交,比如: git cherry-pick 723e84f 723e83f 723e82f

合并多次提交为一次提交

注意:不要合并了其他人的提交!不要合并了其他人的提交!不要合并了其他人的提交!

首先 查找要历史提交版本 git log --oneline

然后找到最早要合并的提交id的父commit-id git rebase -i 09124ed

image.png

进入编辑页面

pick 的意思是要执行这个 commit
squash 或者 s 的意思是这个 commit 会被合并到前一个 commit image.png

若无冲突或者冲突已 fix,则会出现一个 commit message 编辑页面,修改 commit message ,然后保存退出。Successfully表示操作成功。

image.png

image.png

这个时候看日志,3个commit提交变成了两个,最后2次提交进行了合并

三、Git Flow必备技能,规范团队Git操作

代码管理需要一个清晰的流程和规范

master分支

  • 主分支
  • 保持稳定
  • 不允许直接往这个分支提交代码,只允许往这个分支发起merge request
  • 只允许release分支和hotfix分支进行合流 , 所有在Master分支上的Commit应该Tag

develop分支

  • 开发分支
  • 相对稳定的分支
  • 用于日常开发,包括代码优化、功能性开发

feature分支

  • 特性分支
  • 从develop分支拉取,用于下个迭代版本的功能特性开发
  • 功能开发完毕合并到develop分支, 合并完分支后一般会删掉这个Feature分支,但是我们也可以保留。

release分支

  • 发布分支
  • 从develop分支拉取
  • 用于回归测试,bug修复
  • 发布完成后打tag并合入master和develop, (记住:一旦打了Release分支之后不要从Develop分支上合并新的改动到Release分支)

hotfix分支

  • 热更新分支
  • 从develop分支拉取
  • 用于紧急修复上线版本的问题
  • 修复后打tag并合入master和develop

四、IDEA 使用Git

IDEA使用Git进行管理,可以不使用命令,简单许多。

打开 IDEA 设置,之后按照下面图片中的步骤进行操作即可。需要注意的是,在 Path Git executable 中,也就是设置 Git 可执行路径中,找到本机电脑上 Git 的安装位置,根据情况进行路径选择。例如,我这里的路径是 D:\Git\cmd\git.exe,而在 IDEA 中这里默认是 C 盘路径下的目录,这里要根据个人情况而定,不可忽视。

image.png

image.png

然后就可以直接通过界面按钮,进行操作git相关指令了

image.png