1.Git版本控制系统
1.1为什么使用Git
-
项目组成员的代码如何整合在一起?
-
编码过程中,出现问题,需要回退到之前没有问题的状态?
-
合并之后如果出问题了,怎么追踪是谁的问题?
1.2.Git分布式版本控制器
分布式版本控制器,主要是将备份的代码以及记录完全独立在本地存储,当你想将代码恢复到某一个版本的时候,本地版本控制器,不需要依赖网络便可以完成此操作,因为本地版本控制器拥有完整独立的控制系统

1.3.Git的工作流程

1.4.安装Git客户端
下载
Git官网地址:https://git-scm.com/downloads下载

安装步骤








鼠标右击桌面,看到这个Git GUI Here,Git Bash Here两个选项说明你的Git客户端安装完成,如下所 示。

在上图中选择右键菜单中的Git Bash Here,出现如下所示的命令窗口

绑定Gitee用户
因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识,用户和邮箱为你gitee 注册的账号和邮箱。
命令的语法如下:
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
注:上面的 Your Name 表示自己的Gitee账号,email@example.com表示GitHub账号邮箱
git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这 个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
IDEA中配置Git

2.创建远程仓库
我们的远程仓库使用gitee(码云)
1.注册gitee账号
省略.......
2.组长或项目主管创建仓库

创建仓库,指定仓库名称

3.邀请项目组成员加入

3.如何使用Git协作开发
项目组成员
组长:王经理
组员:小刘
1.创建项目
组长创建项目.....
配置Git忽略文件 .gitignore ,直接在项目的根目录下创建该文件
#complied class file
*.class
#log file
*.log
#package file
*.jar
*.war
#other
target
out
.idea
*.iml
2.初始化本地仓库
新建的项目还没有被Git接管,我们需要在项目所在目录创建Git本地仓库
菜单栏=>VCS=>Create Git Repository (图8)
选择项目所在目录,作为Git本地仓库(图9)
如果项目创建成功,项目目录下可以看到
.git文件夹
3.推送项目到远程仓库
添加到暂存区 => 提交到本地仓库 =>推送到远程仓库
-
选中项目右键=>Git=>Add (图11)
-
提交到本地仓库,选中项目=>Git=>Commit Directory (图12、图13)
-
推送到远程仓库,选中项目=>Git=>Push (图14)
-
打开码云仓库可以看到项目已经上传到仓库
4.拉取项目到本地
各个组员需要拉取项目到本地
菜单栏=>VCS=>Get from Version Control (图20)
弹框中输入远程仓库地址 (图21)
输入登录用户名和账号,登录成功就会自动导入项目到Idea (图22)
4.项目编码
4.1推送自己写的代码
添加到暂存区 => 提交到本地仓库 =>推送到远程仓库
4.2拉取其他组员的代码
菜单栏=>Git=>Pull
5.分支操作
5.1使用分支的目的
可以多个分支进行多版本并行开发,相互不干扰,而且任何时候都可以合并。同时,也保证了主干的稳定性
5.2创建分支
组员小刘创建一个分支(xiaoliu),在该分支上进行项目开发
选中项目=>Git=>New Branch (图23)
在idea右下角可以看到当前已经切换到了xiaoliu这个分支 (图24)
5.3推送分支
组员小刘将分支推送到远程仓库
选中项目右键=>Git=>Push
小刘在该分支下新建或修改代码后,同样需要完成以下三步
添加到暂存区 => 提交到本地仓库 =>推送到远程仓库
5.4合并分支
新功能开发完成,体验很好,组长需要将分支(xiaoliu)合并到主分支(master)
- 拉取分支
Ctrl+F5更新分支
- 合并分支
合并分支需要切换到master主分支
选中项目右键=>Git=>Merge
Git常用命令
- 推送到远程master
4.Git常用命令
初始化本地 Git 仓库
git init
查看工作区状态
git status
将所有文件都加入到暂存区
git add .
提交到本地仓库
git commit -m "init project"
推送到远程
git remote add origin https://gitee.com/mingoodjob/gitdemo10.git
git push -u origin "master"
在本地创建 test子分支,并切换到该分支
git checkout -b test
如果只是切换分支,删除-b参数
git checkout master
查看当前所处分支
git branch
将本地的 test 分支推送到远程仓库进行保存
git push -u origin test
将本地的 test分支合并到本地的 master 分支 (需要先切换到master主分支)
git checkout master
git merge test
删除本地分支
git branch -d 分支名称
5.时光穿梭机
切换到test分支进行演示测试
git checkout test
第二次修改a.txt内容,添加如下内容
this is version control
查看diffrent
$ git diff
diff --git a/a.txt b/a.txt
index e69de29..ad0d66a 100644
--- a/a.txt
+++ b/a.txt
@@ -0,0 +1 @@
+this is version control
\ No newline at end of file
git diff 命令可以查看工作区和版本库的区别,如果是一样的不会有任何输出
然后像之前一样,完成以下三步
git add .
git commit -m "add one line"
git push -u origin test
1.版本回退
第三次修改a.txt,在原来的基础上加了distribute
this is distribute version control
git add .
git commit -m "add one line"
git push -u origin test
像这样,你不断对文件进行修改,然后不断提交修改到版本库里,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit 。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。
我们回顾一下a.txt文件一共有几个版本被提交到Git仓库里了
版本1:new file
版本2:add one line
this is version control
版本3:add distribute
this is distribute version control
当然了,在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看:
$ git log
commit 427436c8b51e3e976070d290ec15e4362d255c1a (HEAD -> test, origin/test)
Author: mingoodjob <liuxiaomin1688@sina.cn>
Date: Wed Jul 6 10:10:31 2022 +0800
add distribute
commit cc9af03b68bb88784253725e5304408b900d8541
Author: mingoodjob <liuxiaomin1688@sina.cn>
Date: Wed Jul 6 09:49:44 2022 +0800
add one line
commit dc89384e29a93784bb449736a4066cbaffcb6989
Author: mingoodjob <liuxiaomin1688@sina.cn>
Date: Tue Jul 5 17:43:21 2022 +0800
new file
git log命令显示从最近到最远的提交日志,我们可以看到3次提交, 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数 , 你看到的一大串类似1094adb...的是commit id(版本号)
现在我们启动时光穿梭机,准备把a.txt回退到上一个版本,也就是add one line的那个版本,怎么做呢
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
使用git reset命令:
$ git reset --hard HEAD^
HEAD is now at cc9af03 add one line
看看a.txt是否回退到上一个版本
$ cat a.txt
this is version control
不过我们再查看一下日志,发现 add distribute 哪个版本已经看不到了
$ git log
commit cc9af03b68bb88784253725e5304408b900d8541 (HEAD -> test)
Author: mingoodjob <liuxiaomin1688@sina.cn>
Date: Wed Jul 6 09:49:44 2022 +0800
add one line
commit dc89384e29a93784bb449736a4066cbaffcb6989
Author: mingoodjob <liuxiaomin1688@sina.cn>
Date: Tue Jul 5 17:43:21 2022 +0800
new file
好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?
办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个add distribute的commit id,于是就可以指定回到未来的某个版本:
$ git reset --hard 427436c8b51e3e97607
HEAD is now at 427436c add distribute
版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了
再小心翼翼地看看a.txt的内容
$ cat a.txt
this is distribute version control
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向add distribute:
┌────┐
│HEAD│
└────┘
│
└──> ○ add distribute
│
○ add one line
│
○ new file
改为指向add one line:
┌────┐
│HEAD│
└────┘
│
│ ○ add distribute
│ │
└──> ○ add one line
│
○ new file
然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。
现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?
Git提供了一个命令git reflog用来记录你的每一次命令
$ git reflog
427436c (HEAD -> test, origin/test) HEAD@{0}: reset: moving to 427436c8b51e3e97607
cc9af03 HEAD@{1}: reset: moving to HEAD^
427436c (HEAD -> test, origin/test) HEAD@{2}: commit: add distribute
cc9af03 HEAD@{3}: commit: add one line
72bdc0b (origin/master, master) HEAD@{4}: checkout: moving from master to test
72bdc0b (origin/master, master) HEAD@{5}: merge test: Fast-forward
dc89384 HEAD@{6}: checkout: moving from test to master
72bdc0b (origin/master, master) HEAD@{7}: commit: new file b.txt
dc89384 HEAD@{8}: checkout: moving from master to test
dc89384 HEAD@{9}: checkout: moving from test to master
dc89384 HEAD@{10}: checkout: moving from master to test
dc89384 HEAD@{11}: commit (initial): new file
add one line 的commit id 是 cc9af03
现在总结一下:
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。- 穿梭前,用
git log可以查看提交历史,以便确定要回退到哪个版本。 - 要重返未来,用
git reflog查看命令历史,以便确定要回到未来的哪个版本。
2.管理修改
Git跟踪并管理的是修改,而非文件,你会问,什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改
注意:如果不用git add到暂存区,那就不会加入到commit中