Git:是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件
Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper
分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
简单来讲就是如果你是一位软件开发工程师,你可能需要保存你的项目代码的所有文件的修订版本,那么采用版本控制系统(VCS)将会轻松解决这个问题。
它可以将某个文件回溯到之前的版本,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。
使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子。 但额外增加的工作量却微乎其微
1、GIT是分布式的,SVN是集中式:这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。
说明:集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。集中式版本控制系统最大的缺点就是必须联网才能工作
2、GIT的模式不仅速度快还更加灵活,生成版本时不依赖网络,交换数据时才需要;svn 在生成版本信息和交换数据时都需要网络
3、GIT把内容按元数据方式存储,而SVN是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn, .cvs等的文件夹里。
4、GIT分支和SVN的分支不同:分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了
5、GIT没有一个全局的版本号,而SVN有:目前为止这是跟SVN相比GIT缺少的最大的一个特征。
6、GIT的内容完整性要优于SVN:GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏;GIT的缺点:代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
工作流程:
1、git clone 克隆远程资源到本地目录,作为工作目录;
2、然后在本地的克隆目录上添加或修改文件;
3、如果远程修改了,需要同步远程的内容,直接git pull就可以更新本地的文件;
4、本地在修改之后,可以通过git status 查看修改的文件。然后使用git add 添加修改的文件暂到缓冲区,可以从文件所处的位置来判断状态:如果是 Git 目录中保存着的特定版本文件,就属于已提交状态;如果作了修改并已放入暂存区域,就属于已暂存状态;如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态;
5、在添加之后,可以使用git commit添加到当前的工作区;
6、在修改完成后,如果发现错误,可以撤回提交并再次修改并提交;
7、git push将本地的修改推送到远程的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]
[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]"
如果你碰巧用Debian或Ubuntu Linux,通过一条
sudo apt-get install git
就可以直接完成Git的安装
[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仓库给破坏了
[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
未雨绸缪
下载git官方网站:Git - Downloads
因为是国外服务器所有下载特别慢
安装路径可以自己修改
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”进入下一步
默认路径即可,直接点击“Next”
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编辑器
1、这是最安全的选择,因为您的PATH根本不会被修改。您只能使用 Git Bash 的 Git 命令行工具
2、这个选项被认为是安全的,因为它只向PATH添加一些最小的 Git包,以避免使用可选的Unix工具混淆环境。 您将能够从 Git Bash 和 Windows 命令提示符中使用 Git
3、Git和可选的Unix工具都将添加到您计算机的 PATH 中
一般选择:user Git from Git Bash only
默认选项下一步
行末换行符转换方式使用默认即可
执行Git命令的默认终端使用默认即可
默认为启用文件系统缓存下一步即可
安装完成
右击鼠标即可
GUI:图形操作
Bash:命令行操作
3.2.1、使用命令行进行操作
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.
从远处仓库进行克隆代码到本地桌面
操作方式基本相同与linux命令
名字与邮箱地址
进行推送 >>新建文件dm.txt
$ 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、使用图形化进行克隆
从192.168.2.2远程仓库克隆到本地的桌面上的project文件中
无需创建project文件会自动创建:需要输入3次密码
进行推送
点击 Rescan 扫描修改的文件
添加到暂缓区
没有写名字和邮箱可以在repository在进行填写
提交到本地仓库:在右面输入备注如:add 1.txt
推送到服务器远程仓库
在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
下载TortoiscGit:https://download.tortoisegit.org/tgit/2.13.0.0/TortoiseGit-LanguagePack-2.13.0.0-64bit-zh_CN.msi
安装顺序:先安装程序包,然后安装语言包(LanguagePack).
安装说明:因为TortoiseGit 只是一个程序壳,必须依赖一个 Git Core,所以安装前请确定已完成git安装和配置
3.3.1、安装TortoiseGit
双击TortoiseGit-2.8.0.0-64bit.msi
前面默认即可 直接点 next下一步
点击Finish,如果以前有老版本,则选择覆盖,关闭旧程序并尝试重启即可
3.3.2、安装语言包
安装省略点下一步就完成了
设置中文
在空白处点击鼠标右键, 选择 --> TortoiseGit --> Settings, 弹出配置界面(当TortoiseGit安装完成后,鼠标右键点击后,默认出现 TortoiseGit 相关选项)
设置完成后点确定
3.3.3、把远程代码克隆到本地目录
在桌面 新建一个git目录,进入目录 >> 后 >> 右击 Git 克隆 >> 在 >> URL中填写服务器信息
完成
查看代码
3.3.4、 推送到远程仓库
创建新文件
增加到缓存区:在空白区右击
提交到本地仓库
输入注释信息
推送到远程仓库
完成推送
[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
[root@Client project]# git reset --hard 3b417d #取commit 号的前六位即可
HEAD 现在位于 3b417dc dm.txt
[root@Client project]# ls #查看1.txt没有了
dm.txt indes.html
假如回退版本后悔了,可以使用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
分支就相当于有两个你在同一时间学习GIT以及SVN,互不干扰也对现在的你没什么影响,在某一个时间点的两个你合并了,结果,你既学会了GIT又学会了SVN!
假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
防止线上代码BUG,我们可以创建回滚分支,当我们部署的新版本的软件出现问题,可以马上使用回滚分支进行回滚到上一个稳定版
[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
[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
Git会用
<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容,修改内容相同后保存再次提交
详细过程可以看:解决冲突 - 廖雪峰的官方网站