作 者: BWH_Steven
原文链接:
https://www.cnblogs.com/ideal-20/p/13644420.html
舍友长大想当程序员,我和他爷爷奶奶都可高兴了,写他最喜欢的喜之郎牌Git文章,学完以后,再也不用担心舍友的学习了(狗头)哪里不会写哪里 ~~~
一 先来聊一聊
太多东西属于,总在用,但是一直都没整理的东西了,从刚接触编程那会,就学着各种教程的进行 ”点击“ ,”输入“,Git 也算一个老生常谈的内容,想用好也没那么容易,这一篇从前因,以及下载安装、配置,以及实际的上手方式,整理了出来,不过还是要说,这一篇适合没接触过 Git ,以及 Git 运用不是很熟练的朋友,我用了大量的文字以及图片进行了说明,有些朋友可能会感觉头晕哈哈哈,我感觉,看完起码对于一个新手朋友来说还是有一定帮助的。
不过想进阶,以及想看大量命令的朋友就不太适合了,毕竟这是一篇类似保姆级的入门文章
(1) 为什么要用版本控制?
不管是学生时期,亦或者工作了,有时候免不了需要写一些文档,例如你交一份报告给你的指导老师, 最终通过的报告,总是在不断沟通与修改中完成的,例如 V1、V3、V5 是传给老师的版本,老师标注错误后会回退给我一个偶数的版本,即 V2、V4、V6,这就是版本的一个通俗的概念
而在开发的过程中,随着开发进度的进行,软件的版本也同样需要不断的进行迭代,不管你的代码迭代只进行在你本地,亦或者特定的服务器上,如果按照刚才提交报告的形式进行迭代,就会出现一个问题:即每一个版本中大量代码是重复的
那再想想办法,使用最新的内容替换掉原先旧的版本,或者只保留最新版本以及最新版的前一个版本
但是新问题又出现了:代码重复确实少了,但是如果多个人同时修改,编辑这个文件,更会出现更多冲突与问题
要考虑的东西太多了,有没有一种比较东西可以帮助我们呢?
这就是版本控制这个概念以及相关技术出现的一种原因了
(3) 版本控制简介
版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了记录下来。每一次文件的改变,文件的版本号都将增加。除了记录版本变更外,版本控制的另一个重要功能是并行开发。软件开发往往是多人协同作业,版本控制可以有效地解决版本的同步以及不同开发者之间的开发通信问题,提高协同开发的效率。并行开发中最常见的不同版本软件的错误(Bug)修正问题也可以通过版本控制中分支与合并的方法有效地解决。
所以,需要对内容版本迭代进行管理,以及多人协作时一定需要使用版本控制
(二) 版本控制软件
工欲利其事必先利其器,有这种需求,自然也不用担心,没这种产品,目前常见的版本控制产品很多,不过作为一名开发人员,其实听到最多的还是 Git 和 SVN,来看看区别
(1) 集中版本控制:SVN
SVN是集中式版本控制系统,也就是说,所有版本的数据都是存放在服务器上的,每次要做什么事情,每个人都是使用自己的电脑,去向中央服务器进行拉取最新的版本内容,完事后再推回去新版本,但是这个行为需要联网的支持,没有网络的情况下,用户只能看到本地以前同步过的内容,无法查看历史版本,这种方式,会受到网络,以及服务器损坏导致数据丢失的掣肘
(2) 分布式版本控制:Git
Git 大家应该很熟悉了,或多或者也都有用过,还有马上能联想到的 GitHub、GitLab、Gitee
Git是分布式版本控制系统,换句话说,它没有像 SVN 那样的中央服务器,它最大的特点就是所有版本信息仓库都会同步到每个用户的电脑中,这样每个人即使在本地也可以查看所有历史的版本,没有联网的情况,也可以在本地的仓库提交,联网时 push 即可,一定程度上解决了前面 SVN 遇到的一些问题
(三) Git 历史
感兴趣的简单看看就行了,直接贴的,略过也行
同生活中的许多伟大事件一样,Git 诞生于一个极富纷争大举创新的年代。Linux 内核开源项目有着为数众广的参与者。绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。到 2002 年,整个项目组开始启用分布式版本控制系统 BitKeeper 来管理和维护代码。
到 2005 年的时候,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了免费使用 BitKeeper 的权力。这就迫使 Linux 开源社区(特别是 Linux的缔造者 Linus Torvalds )不得不吸取教训,只有开发一套属于自己的版本控制系统才不至于重蹈覆辙。他们对新的系统订了若干目标:
- 速度
- 简单的设计
- 对非线性开发模式的强力支持(允许上千个并行开发的分支)
- 完全分布式
- 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)
二 下载安装 Git
我这边本来就装着一个旧版本的 Git,为了演示截图,重新装一下,卸载很简单,只需要把环境变量给清了,然后安装目录或者控制面板删除就行了
(一) 下载
下载先考虑的当然是官网:https://git-scm.com/
直接点击右下角的 Download,跳转后选择适合自己的系统版本就行了
不过官网下载毕竟还有个墙的问题,要么一直转圈,要么就下载极其缓慢
那么淘宝镜像下载地址就又来了:http://npm.taobao.org/mirrors/git-for-windows/
- 选择版本,例如:v2.28.0.windows.1
- 选择适合自己系统文件:例如:Git-2.28.0-64-bit.exe
下图为淘宝镜像中选择版本图
(二) 安装
点击下载好的安装程序,刚打开就是一个许可声明,直接下一步就行了,接着就是选择安装路径,选择一个适合的安装位置
首先选择要安装的组件,保持默认即可,没勾选的内容,是关于是否在桌面创建快捷方式,以及是否在控制台中使用 TrueType 字体以及是否每天检查 Git (Windows)更新的
这一步是选择开始菜单的文件夹名称,直接下一步
这一步用来选择 Git 默认的编辑器,默认是 Vim 选择自己用的例如 sublime 、vs code 都可以,这个地方用的不是太多,用默认倒也可以
这一项选择第二个
选择 HTTPS 的后端传输,选择第一项 OpenSSL 库
这是用来配置行尾符号装换的,在 Win 上我们一般推荐使用第一个选项
这里就是用来配置你最后使用 Git Bash 的时候,是使用MinTTY(MSYS2的默认终端)还是 Win 默认的 cmd.exe,但是使用前者可以调整大小窗口,以及使用Unicode字体等特点,后者在某些方面有一些掣肘,所以我们选择第一项
关于 pull 时候的处理,选择默认即可,pull 后面会讲
这里选择第二个选项,即 "启用Git凭证管理器" Windows的 Git 凭证管理器为 Windows 提供安全的Git 凭证存储
下面的第一个选项是 "启用文件系统缓存",文件系统数据将被批量读取并缓存在内存中用于某些操作(“core.fscache”设置为“true”),这提供了显著的性能提升。
第二个选项是 "启用符号链接",启用符号链接(需要SeCreateSymbolicLink权限),不过,现有存储库不受此设置的影响
所以选择第一项即可
这一项不勾选,是一些额外的支持,不一定用得到,且看提示尚存未知 bug
直接点击安装就可以了
(三) 验证安装
安装后,首先开始菜单中会有提示最近添加的内容,同时在任意文件夹下右键也会多出两个选项,Git GUI Here、Git Bash Here,同时它会默认帮我们配置环境变量
例如我右键点击 Git Bash Here,就会弹出,同时输入一些基本命令后,也是有反应的
Git Bash:Unix 与 Linux 风格的命令行,这是一般最常用的
Git CMD:Windows风格的命令行(长得就和 cmd 差不多)
Git GUI:图形界面的Git,不建议入门学习使用,学习还是以学习命令为主,再考虑图形界面
说明一下:使用 git 会涉及到一些常见的 Linux 命令,不过因为使用者是基于像 Windows 这样拥有图形界面的系统,所以也不用每次使用都通过 cd ,直接通过文件夹,右键点开也是可以的,不过Linux 常见的命令还不会的话,建议还是先看一下 Linux 的入门语法
我好像以前写过一篇,Linux 的安装还有详细入门命令的文章,有兴趣可以看一下,想了解更多,可以去度娘一下或者找个教程系统学一下
三 Git 配置和基本理论
(一) 配置
Git 有两种配置文件,一种是系统级别的配置文件,还有一种是用户级别的配置文件,且这两者都存储在本地上,先看一下如何显示所有配置文件内容(注:下面是小写 L 不是数字1或者 大写 i)
git config -l
上述就是杂糅在一起的内容,都查出来了,如果想要分别查看不同的配置文件,也是有办法的
# 查看系统配置
git config --system --list
# 查看当前用户配置
git config --global --list
这里大家可以分别尝试一下
配置都是存在本地的,那么文件的位置在哪里呢?
- 系统配置:XXX\Git\etc\gitconfig 例如 D:\develop\Git\etc\gitconfig
- 用户配置:C:\Users\用户名\ .gitconfig
- 注意:别忘记显示文件夹中的隐藏文件,否则看不到 .gitconfig
如果是第一次使用,应该是没有 .gitconfig ,以前如果用过,或者折腾过例如 hexo 等内容,应该都是配过的,例如我这台机器的 .gitconfig 中的内容如下:
[user]
name = ideal-20
email = ideal_bwh@163.com
[i18n]
commitencoding = utf-8
logoutputencoding = utf-8
[gui]
encoding = utf-8
我在其中配置定义了一个 user ,写入了我的 name 和 email, 这个工作还是非常推荐做的,因为你后面提交内容的时候,就会默认的使用配置,不用填写了
上面是直接修改文件的方式,如果想要使用 git 命令配置,则如下:
git config --global user.name "ideal" #名称
git config --global user.email ideal_bwh@163.com #邮箱
其他的一些编码配置,可以后面根据需要配置也可以
小结:要认识基本配置,最好配置用户名和邮箱作为你这个用户的标识,命令中如果传入--global 也就是告诉 Git 每次默认都用这个内容代表你这个用户,如果你在某个项目中不想使用这个标识,你可以在项目中再次执行此语句,但是不传入 --global 就可以了
(二) 基本理论
(1) Git 工作区域
工作区域这个概念是非常重要的,要留心一下
你想从本地上传一份代码到 github,不同的阶段下,你想上传的内容,会处于不同的位置区域中,Git 的工作区域就分为四大块
- 工作区(Workspace / Working Directory)
- 暂存区(Stage / Index)
- 本地仓库(Git Directory / Repository)
- 远程仓库(Remote Directory / Remote)
工作区:本地项目文件存放位置,也就是你放这个项目代码的地方
暂存区:暂存字面意思就是临时存放的意思,这里用来临时存放你的改动,虽然叫做 XX区 ,但是本质上只是一个文件,其中记录了文件的名称、时间戳、长度等内容
本地仓库:暂存区的内容可以通过命令提交到本地仓库,所以它存放你提交所有提交版本的数据
远程仓库:用来托管代码的远程服务器,供使用者拉取等操作
若仅仅从使用的角度出发,其实我们更需要关注的点在于工作区和远程仓库
虽然到现在,可能对于几大工作区域还是有点懵,不过稍后提到他们之间的关系,以及一些讲解命令,变更当前欲提交代码位置的时候,就会明白了
(2) Git 流程 / 区域间关系
上面书写几个区域流程的时候,其实已经是按照一定的顺序来写了
Git 工作时执行的流程如下:
- 先在工作区中添加或者修改一些文件,说白了就是写完代码,或者修改了旧代码
- 将需要最终提交到 Git 管理的文件存放入暂存区
- 暂存区中的文件提交到本地仓库中
- 本地仓库中的修改推送到远程仓库
上面我们介绍的流程,就是图中从 add 到 commit 到 push 的一个过程,也就是从工作目录到远程仓库的一个过程
上面的一些内容,就是关于项目从云端拽到本地等等,下面这些命令我们都会提到
下面手把书开始进行 Git 项目的创建,以及如何上传以及拉取项目
(三) 创建/克隆仓库
如果你想要在本地上生成一个仓库,要么就是直接创建一个新的本地仓库,要么就是从云端可克隆一个远程仓库
(1) 本地仓库的创建
在当前的目录下了,初始化一个新的仓库
git init
例如我在桌面的 git-stuty 文件夹中打开 git-bash
它会提示初始化了一个空的 Git 仓库在你这个路径下,同时可以在这个文件夹中,直接看到有一个名为:.git 的文件夹出现,默认会有一些初始化的文件在其中
(2) 远程仓库的克隆
第二个方法就是直接克隆远程项目,命令为
git clone [url]
其中的 [url] 部分直接替换成在 Github 或者 Gitee 等上面拿到的克隆地址,Github 实例如下
怎么选择呢?一般来说,如果我们是一个全新的项目或者说一个Demo想要上传到 Github 等这种平台,就需要在项目目录下创建一个 Git 仓库,而如果你想看别人的项目,就直接克隆下来,或者你在别的电脑上想要继续写自己的一个远程存储的项目,你也可以克隆下来
通常一种做法就是,先在远程创建仓库,然后拉取到本地来做
(四) 文件状态及忽略文件
(1) 文件状态
等下我们会带着大家走一遍实操流程,但是我们还需要补充两个点,因为后面我们实操会用到
- Untracked:未跟踪状态,此文件还在你的项目文件夹中,但是还没添加到 Git 仓库中,所以还不受到版本控制,例如编写一个 HelloWorld.java 文件,但是还没做什么操作,只有这么一个文件而已
- 最后通过 git add 命令后,状态变为 Staged
- Staged:暂存状态,但还没有真正入库
- 执行 git commit 命令后,会把你修改的内容,和本地仓库中进行同步,同步后,这时本地仓库中的文件和本地文件又变为一致, 文件就会变成 Unmodify 状态
- 如果想执行取消这种暂存状态,只需要执行 git reset HEAD filename 命令取消暂存, 文件状态会为 Modified
- Unmodify:文件已入库,同时版本库(.git )中的文件快照内容与文件夹中完全一致
- 如果它被修改, 而变为 Modified, 如果使用 git rm 移出版本库, 则成为Untracked 文件
- Modified:文件已修改,不过仅仅是修改,没有进行其他的操作
- git add 可进入暂存 Staged 状态, 使用 git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改
(2) 忽略文件
这块内容,在 IDEA 中应该都有见过,即:.gitignore 文件,其中的内容,就是我们选择要进行忽略的文件,也就是说,这些东西,我们不想纳入版本控制中,例如 sql 文件,或者一些临时文件,直接贴了一份规则
说明:这一块,没仔细整理,或许是有出入的,想深入了解,更推荐去找一份专题的博文
- 忽略文件中的空行或以井号(#)开始的行将会被忽略。
- 可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,…})代表可选的字符串等。
- 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
- 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
- 如果名称的最后面是一个路径分隔符(/),例如 file/ 表示忽略目录file下的全部内容,不管是根目录下的/file/目录,还是某个子目录/child/file/目录,都会被忽略
举个例子:
*.class
#package file
*.war
*.ear
#kdiff3 ignore
*.orig
#maven ignore
target/
#eclipse ignore
.settings/
.project
.classpatch
#idea
.idea/
/idea/
*.ipr
*.iml
*.iws
# temp file
*.log
*.cache
*.diff
*.patch
*.tmp
# system ignore
.DS_Store
Thumbs.db
四 手把手使用 Git
前面该铺垫的内容基本都扯到了,下面手把手试一试,分为两种方式,一种是直接使用命令行,一种就是在 IDEA 中使用图形界面
要说明一下,命令行的方式,并不是仅仅只能在文件夹中使用,更多的情况下,我们一般会把 IDEA 的 terminal 配置我们的 git-bash,这样,我们在 IDEA 中,编写或者修改代码后,就可以直接通过 Git 命令进行提交,我们下面演示的两种方式也都是基于 IDEA 的
(一) 使用 GitHub/码云
不管怎么样,一个 Git 代码托管平台的账号总是要有的,针对个人来说用的比较多的,还是 GitHub,当然国内的码云(Gitee),胜在速度快,GitHub或许就需要使用一些科学的上网方式才能有比较好的速度体验了,还有一个就是 GitHub 是全英文的,后者则为中文
没有账号的小伙伴,注册一个就好了,下面为了照顾所有童鞋,顺便提一下配置 SSH 公钥
说明:为了快一点,我使用码云来进行演示,GitHub 同理
配置 SSH 公钥,也就是可以帮助我们实现免密码登录,否则,我们每一次和远程仓库进行一些操作,都需要输入账号密码
- 进入 C:\Users\用户名\.ssh 目录下
- 如果没有用过 ssh 这里是没有内容的,需要生成
ssh-keygen -t rsa
ssh-keygen 就是生成公钥的命令,后面是指定了加密方式,一般这样写就可以
执行后,控制台会显示一些不规则的图画,接着文件夹中会生成两个文件
- id_rsa.pub 和 id_rsa
带有 pub 后缀的就是代表公钥,另一个就是私钥
用编辑器打开公钥代码,全部复制,接着打开码云中安全设置中的的 SSH 公钥配置,将公钥复制进去,它会默认填充标题,这样就好了
使用SSH公钥可以让你在你的电脑和码云通讯的时候使用安全连接(Git的Remote要使用SSH地址)
(二) 修改 IDEA Terminal
可以直接在 Idea 里的Terminal里面进行 git命令的输入,当然需要把原先的 cmd 修改为 Git 下的 bash,注意:不要设置为 git-bash 否则只能弹窗使用
做完也可以顺便创建一个 readme文件:$ touch README.md 不过无所谓啦,一般直接在 GitHub 等上也能直接生成
(三) 向远程仓库提交代码(命令方式)
说明:我把我这边的执行结果也贴上了,本质命令也就那么几句
1、创建项目,或打开欲上传项目
2、在下方 Terminal 中执行 git init 进行空仓库的初始化,如下(别复制 $ 符号啊):
abc@LAPTOP-5T03DV1G MINGW64 /f/develop/IdeaProjects/temp/git-study (master)
$ git init
Initialized empty Git repository in F:/develop/IdeaProjects/temp/git-study/.git/
3、可以使用 git status 查看当前的状态,可以看到,可以看到当前还没提交
abc@LAPTOP-5T03DV1G MINGW64 /f/develop/IdeaProjects/temp/git-study (master)
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
.mvn/
mvnw
mvnw.cmd
pom.xml
src/
nothing added to commit but untracked files present (use "git add" to track)
4、使用 git add . 将所有添加或者修改过的文件添加到暂存区
abc@LAPTOP-5T03DV1G MINGW64 /f/develop/IdeaProjects/temp/git-study (master)
$ git add .
warning: LF will be replaced by CRLF in .gitignore.
The file will have its original line endings in your working directory
..... 省略
5、add 后可以继续使用 git status 查看当前的状态,可以看到,一下这些文件就是被添加到暂存区的
abc@LAPTOP-5T03DV1G MINGW64 /f/develop/IdeaProjects/temp/git-study (master)
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: .gitignore
new file: .mvn/wrapper/MavenWrapperDownloader.java
new file: .mvn/wrapper/maven-wrapper.jar
new file: .mvn/wrapper/maven-wrapper.properties
new file: mvnw
new file: mvnw.cmd
new file: pom.xml
new file: src/main/java/cn/ideal/DemoController.java
new file: src/main/java/cn/ideal/gitstudy/GitStudyApplication.java
new file: src/main/resources/application.properties
new file: src/test/java/cn/ideal/gitstudy/GitStudyApplicationTests.java
6、使用 git commit -m "提交信息" 提交暂存区中的内容到本地仓库 -m 提交信息
这个提交信息,就是你会在远程仓库中每次看到的提交信息,例如:
abc@LAPTOP-5T03DV1G MINGW64 /f/develop/IdeaProjects/temp/git-study (master)
$ git commit -m "first commit"
[master (root-commit) 4c9acbe] first commit
11 files changed, 735 insertions(+)
create mode 100644 .gitignore
create mode 100644 .mvn/wrapper/MavenWrapperDownloader.java
create mode 100644 .mvn/wrapper/maven-wrapper.jar
create mode 100644 .mvn/wrapper/maven-wrapper.properties
create mode 100644 mvnw
create mode 100644 mvnw.cmd
create mode 100644 pom.xml
create mode 100644 src/main/java/cn/ideal/DemoController.java
create mode 100644 src/main/java/cn/ideal/gitstudy/GitStudyApplication.java
create mode 100644 src/main/resources/application.properties
create mode 100644 src/test/java/cn/ideal/gitstudy/GitStudyApplicationTests.java
7、像远程 add git remote add origin 远程仓库地址
abc@LAPTOP-5T03DV1G MINGW64 /f/develop/IdeaProjects/temp/git-study (master) $ git remote add origin git@gitee.com:ideal-20/git-study.git
8、由于是第一次提交,所以需要先将远程仓库的内容拉取下来,直接 push会报错,执行:git pull
9、提交上去:$ git push -u -f origin master 注意:-f 是强制提交,因为可能咱们第一次拉取过后会出现 项目没有刚才采取到的新的错误,以后不加 -f
效果如下:
(四) 向远程仓库提交代码(图形界面方式)
1、首先在左侧目录结构中,右键点击项目名,选择 Git Add
2、接着再次点击右键项目名,这次选择 Commit Directory
这个界面,会显示变更的文件,以及让你输入需要上传的提交信息,如果你之前已经配置过用户级别的配置信息,不填写个人信息也行,下面是代码的比对,右侧默认勾着一些检查的勾选,会增加一些时间,也可以全部取消勾选
3、在上方菜单栏中有一项叫做 VCS ,点击后 选择 Git 然后选择 Push
4、然后看到了我们刚才 commit 的内容,选择直接 Push
5、去仓库看一下,仍然上传成功了
(五) 补充方式
刚才命令行的方式,我们是在我们创建好的本地 Java 项目中初始化 Git 本地仓库,然后提交到远程仓库,还有一种方式,就是直接克隆远程的空仓库下来,例如克隆下一个名为 test 的文件夹,其中含有例如 .git 、.gitignore 等文件或文件夹,然后将这些内容全部复制到你的 Java 项目的根目录下也是可以的
五 分支开发
分支就是指,例如多人开发中,1.0 的版本后,可能会同时开发其他多个版本,就需要的分支的概念,还例如,你在项目中对于一个问题的解决方案还不能保证完美,但你又不想影响正常的内容,所以,你可以在分支上进行开发,而不影响主干
所以为了不影响别人开发以及主干的稳定,所以你可以创建一个属于自己的分支,保证分支上没有问题了,再合并到主干上
1、在master上创建分支 v1.0:$ git checkout -b v1.0 origin/master 并且默认使用它
2、将分支推到远程仓库:$ git push origin HEAD -u
这样我们的远程仓库中就会多出一个分支 v1.0
3、给这个分支提交一个内容,信息为第三次提交
abc@LAPTOP-5T03DV1G MINGW64 /f/develop/IdeaProjects/temp/git-study (v1.0)
$ git add .
xxx
$ git commit -m "第三次提交"
xxx
$ git push
xxx
4、准备向 master 主干合并这个 v1.0,先切换到 master git checkout master
abc@LAPTOP-5T03DV1G MINGW64 /f/develop/IdeaProjects/temp/git-study (v1.0) $ git checkout master
5、将 v1.0 并入 master,注意,现在已经是在 master下操作了哦
abc@LAPTOP-5T03DV1G MINGW64 /f/develop/IdeaProjects/temp/git-study (master) $ git merge v1.0
6、Push 上去,origin master 不写也行,默认就是 master
abc@LAPTOP-5T03DV1G MINGW64 /f/develop/IdeaProjects/temp/git-study (master)
$ git push origin master
你就会发现,master 主干下已经并入了 v1.0 的内容
说明:提交信息,出现一个小乱码,是编码没设置好,没设置的情况下,还是推荐使用英文提示信息,修改后再根据需要选择是否提交中文信息