GIT (分布式版本控制系统)

一、简介

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

 Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper

特点

分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库

 版本控制系统

版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
简单来讲就是如果你是一位软件开发工程师,你可能需要保存你的项目代码的所有文件的修订版本,那么采用版本控制系统(VCS)将会轻松解决这个问题。
它可以将某个文件回溯到之前的版本,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。
使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子。 但额外增加的工作量却微乎其微

Git (分布式)与 SVN(集中式)的区别

1、GIT是分布式的,SVN是集中式:这是GIT和其它非分布式的版本控制系统,例如SVNCVS等,最核心的区别。
说明:集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。集中式版本控制系统最大的缺点就是必须联网才能工作
2、GIT的模式不仅速度快还更加灵活,生成版本时不依赖网络,交换数据时才需要;svn 在生成版本信息和交换数据时都需要网络
3、GIT把内容按元数据方式存储,而SVN是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn, .cvs等的文件夹里。
4、GIT分支和SVN的分支不同:分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了
5、GIT没有一个全局的版本号,而SVN有:目前为止这是跟SVN相比GIT缺少的最大的一个特征。
6、GIT的内容完整性要优于SVN:GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏;GIT的缺点:代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。

GIT工作原理

GIT (分布式版本控制系统)_第1张图片

工作流程:
1、git clone 克隆远程资源到本地目录,作为工作目录;
2、然后在本地的克隆目录上添加或修改文件;
3、如果远程修改了,需要同步远程的内容,直接git pull就可以更新本地的文件;
4、本地在修改之后,可以通过git status 查看修改的文件。然后使用git add 添加修改的文件暂到缓冲区,可以从文件所处的位置来判断状态:如果是 Git 目录中保存着的特定版本文件,就属于已提交状态;如果作了修改并已放入暂存区域,就属于已暂存状态;如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态;
5、在添加之后,可以使用git commit添加到当前的工作区;
6、在修改完成后,如果发现错误,可以撤回提交并再次修改并提交;
7、git push将本地的修改推送到远程的GIT服务器。

二、部署GIT服务器

系统 主机名称 IP 角色
CentOS 7.4 GIT-Server 192.168.2.2 中央服务器(交换数据)
CentOS 7.4 Client 192.168.2.3 客户端
windows 7 windows 7 192.168.2.50 客户端
    设置ssh交互

[root@GIT-Server ~]# ssh-keygen           
...........
.....
..
[root@GIT-Server ~]# ssh-copy-id [email protected]                 
[root@GIT-Server ~]# ssh-copy-id [email protected]                  
——————————————————————————————————————————————————————————————————————————

[root@Client ~]# ssh-keygen                        
.........
...
[root@Client ~]# ssh-copy-id [email protected]               
[root@Client ~]# ssh-copy-id [email protected]              

 1、安装GIT服务


[root@GIT-Server ~]# yum install -y git             
...........
.... 
————————————————————————每个机器都必须设置:你的名字和Email地址
[root@GIT-Server ~]# git config --global user.name "server"                  
[root@GIT-Server ~]# git config --global user.email "[email protected]"        

————————————————————————————————————————————————————————————————————————————————————

[root@Client ~]# yum install -y git                  
..............
.........
[root@Client ~]# git config --global user.name "client"
[root@Client ~]# git config --global user.email "[email protected]"

 如果你碰巧用DebianUbuntu Linux,通过一条sudo apt-get install git就可以直接完成Git的安装

2、GIT的命令使用

2.1、服务端用户创建空仓库(cong11)


[root@GIT-Server ~]# mkdir project                 #创建仓库
[root@GIT-Server ~]# cd project/                   
[root@GIT-Server project]# git init --bare         #初始化仓库
初始化空的 Git 版本库于 /root/project/

 瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了

2.2、客户端初始化测试


[root@Client ~]# mkdir git              #创建工作目录

                 拉取库到本地
           ————————————————————————
[root@Client ~]# cd git                       
[root@Client git]# git clone [email protected]:/root/project                       
正克隆到 'project'...
warning: 您似乎克隆了一个空版本库。
[root@Client git]# ll                                  
总用量 0
drwxr-xr-x 3 root root 18 2月  10 06:42 project
                                给本地添加新项目文件
                    ————————————————————————————————————————————
[root@Client git]# echo "未雨绸缪" > project/indes.html                      

                                     添加到暂缓区
                    ————————————————————————————————————————————
[root@Client git]# cd project/
[root@Client project]# git add indes.html        #加入到git缓存区

也可以使用 . 点

[root@Client project]# git add .                 #进行加入到缓存区


                                     查看文件状态
                    ————————————————————————————————————————————
[root@Client project]# git status                
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
#   (使用 "git rm --cached ..." 撤出暂存区)
#
#       新文件:    indes.html
#

                                     撤出暂存区
                    ————————————————————————————————————————————
[root@Client project]# git rm -f indes.html            #撤出暂存区后需要重新添加项目文件
rm 'indes.html'
————————————————————————————————
[root@Client project]# git status
# 位于分支 master
#
# 初始提交
#
无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪)


                                     提交到本地仓库
                    ————————————————————————————————————————————
[root@Client project]# git commit -m "词语"              #-m  添加备注信息
[master(根提交) 001e3ec] 词语
 1 file changed, 1 insertion(+)
 create mode 100644 indes.html


                           确认本地仓库和远程仓库的状态是否正常
                    ————————————————————————————————————————————
[root@Client project]# git remote add origin [email protected]:/root/git/project.git
fatal: 远程 origin 已经存在。


                             把本地仓库代码推送到远程仓库
                    ————————————————————————————————————————————
[root@Client project]# git push origin master               
Counting objects: 3, done.
Writing objects: 100% (3/3), 221 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:/root/project
 * [new branch]      master -> master


                               从远程仓库进行克隆项目
                    ————————————————————————————————————————————
[root@Client git]#  rm -rf *   
[root@Client git]#  ls                 
[root@Client git]#  git clone [email protected]:/root/project            
正克隆到 'project'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
接收对象中: 100% (3/3), done.

[root@Client git]# cat project/indes.html 
未雨绸缪

 3、windows系统使用GIT服务

下载git官方网站:Git - Downloads

因为是国外服务器所有下载特别慢

3.1、 安装git:需要修改的如下

GIT (分布式版本控制系统)_第2张图片

安装路径可以自己修改

GIT (分布式版本控制系统)_第3张图片

 Additional icons                                                 附加图标
​ On the Desktop                                                  在桌面上
Windows Explorer integration  Windows        资源管理器集成鼠标右键菜单
​ Git Bash Here
​ Git GUI Here
Git LFS (Large File Support)                             大文件支持
Associate .git* configuration files with the default text editor  将 .git 配置文件与默认文本编辑器相关联
Associate .sh files to be run with Bash               将.sh文件关联到Bash运行
Use a TrueType font in all console windows     在所有控制台窗口中使用TrueType字体
Check daily for Git for Windows updates           每天检查Git是否有Windows更新

按照上述默认配置,直接点击“Next”进入下一步

GIT (分布式版本控制系统)_第4张图片

 默认路径即可,直接点击“Next”

GIT (分布式版本控制系统)_第5张图片

 Use the Nano editor by default                                                          默认使用 Nano 编辑器
Use Vim (The ubiquitous text editor) as Git's default editor           使用 Vim 作为 Git 的默认编辑器
Use Notepad++ as Git's default editor                                               使用 Notepad++ 作为 Git 的默认编辑器
Use Visual Studio Code as Git's default editor                                 使用 Visual Studio Code 作为Git 的默认编辑器
Use Visual Studio Code Insiders as Git's default editor                  使用Visual Studio Code Insiders 作为 Git 的默认编辑器

建议使用vim编辑器

GIT (分布式版本控制系统)_第6张图片

1、这是最安全的选择,因为您的PATH根本不会被修改。您只能使用 Git Bash 的 Git 命令行工具
2、这个选项被认为是安全的,因为它只向PATH添加一些最小的 Git包,以避免使用可选的Unix工具混淆环境。 您将能够从 Git Bash 和 Windows 命令提示符中使用 Git
3、Git和可选的Unix工具都将添加到您计算机的 PATH 中

一般选择:user Git from Git Bash only

GIT (分布式版本控制系统)_第7张图片

 默认选项下一步

GIT (分布式版本控制系统)_第8张图片

 行末换行符转换方式使用默认即可

GIT (分布式版本控制系统)_第9张图片

 执行Git命令的默认终端使用默认即可

GIT (分布式版本控制系统)_第10张图片

 默认为启用文件系统缓存下一步即可

GIT (分布式版本控制系统)_第11张图片

 安装完成

3.2、使用git

右击鼠标即可

GIT (分布式版本控制系统)_第12张图片

GUI:图形操作 
Bash:命令行操作

 3.2.1、使用命令行进行操作

 GIT (分布式版本控制系统)_第13张图片


Administrator@jj-PC MINGW64 ~/Desktop
$ git clone [email protected]:/root/project                 
Cloning into 'project'...
The authenticity of host '192.168.2.2 (192.168.2.2)' can't be established.
ECDSA key fingerprint is SHA256:iKbLEhg8UfqGICLymBBNoZqynedjXefz3LSjpQlcREg.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.2.2' (ECDSA) to the list of known hosts.
[email protected]'s password:
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.

从远处仓库进行克隆代码到本地桌面

GIT (分布式版本控制系统)_第14张图片

操作方式基本相同与linux命令

 名字与邮箱地址

 进行推送 >>新建文件dm.txt

GIT (分布式版本控制系统)_第15张图片


$ cd project/              

Administrator@jj-PC MINGW64 ~/Desktop/project (master)
$ ls                
dm.txt  indes.html

Administrator@jj-PC MINGW64 ~/Desktop/project (master)
$ git add .                

Administrator@jj-PC MINGW64 ~/Desktop/project (master)
$ git commit -m "dm.txt"
[master 3b417dc] dm.txt
 1 file changed, 1 insertion(+)
 create mode 100644 dm.txt

Administrator@jj-PC MINGW64 ~/Desktop/project (master)
$ git push origin master                    
[email protected]'s password:
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 270 bytes | 270.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To 192.168.2.2:/root/project
   001e3ec..3b417dc  master -> master

3.2.2、使用图形化进行克隆

GIT (分布式版本控制系统)_第16张图片

GIT (分布式版本控制系统)_第17张图片

  从192.168.2.2远程仓库克隆到本地的桌面上的project文件中

GIT (分布式版本控制系统)_第18张图片

 无需创建project文件会自动创建:需要输入3次密码

GIT (分布式版本控制系统)_第19张图片

 进行推送

GIT (分布式版本控制系统)_第20张图片

 点击 Rescan 扫描修改的文件

GIT (分布式版本控制系统)_第21张图片

 添加到暂缓区

GIT (分布式版本控制系统)_第22张图片

 没有写名字和邮箱可以在repository在进行填写

GIT (分布式版本控制系统)_第23张图片

GIT (分布式版本控制系统)_第24张图片

提交到本地仓库:在右面输入备注如:add 1.txt

GIT (分布式版本控制系统)_第25张图片

 推送到服务器远程仓库

GIT (分布式版本控制系统)_第26张图片

GIT (分布式版本控制系统)_第27张图片

GIT (分布式版本控制系统)_第28张图片

 在Client服务器上测试克隆


[root@Client git]# git clone [email protected]:/root/project                
正克隆到 'project'...
remote: Counting objects: 9, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 9 (delta 0), reused 0 (delta 0)
接收对象中: 100% (9/9), done.

[root@Client git]# cd project/                     
[root@Client project]# ls                 
1.txt  dm.txt  indes.html


3.3、使用TortoiscGit工具

 下载TortoiscGit:https://download.tortoisegit.org/tgit/2.13.0.0/TortoiseGit-LanguagePack-2.13.0.0-64bit-zh_CN.msi

GIT (分布式版本控制系统)_第29张图片

安装顺序:先安装程序包,然后安装语言包(LanguagePack).

安装说明:因为TortoiseGit 只是一个程序壳,必须依赖一个 Git Core,所以安装前请确定已完成git安装和配置

3.3.1、安装TortoiseGit

双击TortoiseGit-2.8.0.0-64bit.msi

前面默认即可   直接点 next下一步

GIT (分布式版本控制系统)_第30张图片

 点击Finish,如果以前有老版本,则选择覆盖,关闭旧程序并尝试重启即可

3.3.2、安装语言包

安装省略点下一步就完成了

设置中文

在空白处点击鼠标右键, 选择 --> TortoiseGit --> Settings, 弹出配置界面(当TortoiseGit安装完成后,鼠标右键点击后,默认出现 TortoiseGit 相关选项)

GIT (分布式版本控制系统)_第31张图片

设置完成后点确定

 3.3.3、把远程代码克隆到本地目录

在桌面 新建一个git目录,进入目录 >>  后 >> 右击  Git 克隆   >>  在  >>  URL中填写服务器信息

GIT (分布式版本控制系统)_第32张图片

GIT (分布式版本控制系统)_第33张图片

GIT (分布式版本控制系统)_第34张图片

 完成

查看代码

GIT (分布式版本控制系统)_第35张图片

3.3.4、 推送到远程仓库

创建新文件

GIT (分布式版本控制系统)_第36张图片

 增加到缓存区:在空白区右击

GIT (分布式版本控制系统)_第37张图片

GIT (分布式版本控制系统)_第38张图片

 提交到本地仓库

GIT (分布式版本控制系统)_第39张图片

 输入注释信息

GIT (分布式版本控制系统)_第40张图片

推送到远程仓库

GIT (分布式版本控制系统)_第41张图片

GIT (分布式版本控制系统)_第42张图片

GIT (分布式版本控制系统)_第43张图片

 完成推送

GIT (分布式版本控制系统)_第44张图片

4、版本回退

4.1、检测项目版本


[root@Client project]# git log                     
commit 2ce6ca3dc20896ec4abc3171ed2a8570449c6680
Author: winds 
Date:   Thu Feb 10 11:31:52 2022 +0800

    add 1.txt

commit 3b417dc82b384c5e5d4f6e23b3eba55ec70b1b48
Author: winds 
Date:   Thu Feb 10 11:02:47 2022 +0800

    dm.txt

commit 001e3ec79d34bba0881783e74de80aae28976a31
Author: client 
Date:   Thu Feb 10 07:14:14 2022 +0800

4.2、版本回退


[root@Client project]# git reset --hard 3b417d         #取commit 号的前六位即可
HEAD 现在位于 3b417dc dm.txt
[root@Client project]# ls                              #查看1.txt没有了
dm.txt  indes.html

4.3、查看历史版本更改

假如回退版本后悔了,可以使用git reflog命令查看历史命令,来查看我们版本都经过了哪些变化,然后根据历史ID接着回退


[root@Client project]# git reflog                      
3b417dc HEAD@{0}: reset: moving to 3b417d           
2ce6ca3 HEAD@{1}: clone: from [email protected]:/root/project          

进行版本回退

[root@Client project]# git reset --hard 2ce6ca3                 
HEAD 现在位于 2ce6ca3 add 1.txt
[root@Client project]# ls               
1.txt  dm.txt  indes.html

5、分支

 5.1、分支介绍

分支就相当于有两个你在同一时间学习GIT以及SVN,互不干扰也对现在的你没什么影响,在某一个时间点的两个你合并了,结果,你既学会了GIT又学会了SVN

GIT (分布式版本控制系统)_第45张图片

假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
防止线上代码BUG,我们可以创建回滚分支,当我们部署的新版本的软件出现问题,可以马上使用回滚分支进行回滚到上一个稳定版

5.2、分支的常规操作


[root@Client project]# git branch               #列出所有的分支
* master

[root@Client project]# git branch fz            #分支创建

[root@Client project]# git checkout fz          #分支切换
切换到分支 'fz'

[root@Client project]# git checkout -b fz       #分支切换


[root@Client project]# git checkout master         
切换到分支 'master'
[root@Client project]# git branch -d fz         #删除本地分支
已删除分支 fz(曾为 2ce6ca3)。


[root@Client project]# git checkout -b fz       #创建加切换
切换到一个新分支 'fz'
[root@Client project]# git branch               #切换到哪前面的*号就在哪
* fz
  master


——————————————————————————————————————
[root@GIT-Server project]# git branch fz           
[root@GIT-Server project]# git branch            
  fz
* master
————————
[root@Client project]# git push origin --delete fz   #删除远程分支
To [email protected]:/root/project
 - [deleted]         fz
———————
[root@GIT-Server project]# git branch        
* master

5.3、将分支fz上的代码合并到master分支


[root@Client project]# git checkout -b fz                  
切换到一个新分支 'fz'

[root@Client project]# echo "fz" > fz.txt          
[root@Client project]# ls                 
1.txt  dm.txt  fz.txt  indes.html


[root@Client project]# git add .               
[root@Client project]# git commit -m "fz"              

[root@Client project]# git push origin fz                 
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 254 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:/root/project
   68744e8..5256281  fz -> fz

[root@Client project]# git branch             
* fz
  master

[root@Client project]# git checkout master        #切换分支
切换到分支 'master'
[root@Client project]# ls                         #查看发现没有fz.txt文件
1.txt  dm.txt  indes.html

[root@Client project]# git merge fz               #把fz分支的文件合并到merge分支中
Already up-to-date.
[root@Client project]# ls                         #分支合并文件
1.txt  dm.txt  fz.txt  indes.html

[root@Client project]# git push -u origin master  
Total 0 (delta 0), reused 0 (delta 0)
To [email protected]:/root/project
   2ce6ca3..3d2b98c  master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。

master代码改动了,需要更新开发分支(fz)上的代码


[root@Client project]# git checkout master             
已经位于 'master'
[root@Client project]# git pull            
Already up-to-date.
[root@Client project]# git checkout fz              
切换到分支 'fz'
[root@Client project]# git merge master               
Already up-to-date.
[root@Client project]# git push -u origin fz              
分支 fz 设置为跟踪来自 origin 的远程分支 fz。
Everything up-to-date

[root@Client git]# rm -rf *
[root@Client git]# git clone -b fz [email protected]:/root/project
正克隆到 'project'...
remote: Counting objects: 12, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 12 (delta 1), reused 0 (delta 0)
接收对象中: 100% (12/12), done.
处理 delta 中: 100% (1/1), done.
[root@Client git]# cd project/
[root@Client project]# ls
1.txt  dm.txt  fz.txt  indes.html
[root@Client project]# cat fz.txt 
fz

5.4、分支合并冲突解决

Git会用<<<<<<<=======>>>>>>>标记出不同分支的内容,修改内容相同后保存再次提交

详细过程可以看:解决冲突 - 廖雪峰的官方网站

你可能感兴趣的:(git,分布式,github)