常见版本管理工具:
- SVN
集中式的版本控制系统,只有一个中央数据仓库,
如果中央数据仓库挂了或者不可访问,所有的使
用者无法使用SVN,无法进行提交或备份文件。
- Git
分布式的版本控制系统,在每个使
用者电脑上就有一个完整的数据仓库,
没有网络依然可以使用Git。当然为了
习惯及团队协作,会将本地数据同步
到Git服务器或者GitHub等代码仓库
实验:
Git的安装配置
cat /etc/redhat-release
yum install -y git
git --version
源码安装:
Git下载地址:https://github.com/git/git/releases
yum groupinstall "Development Tools"
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum install asciidoc xmlto
-------
tar -xzf git-2.23.0.tar.gz
cd git-2.23.0/
make configure
./configure --prefix=/usr/local
make all doc
make install install-doc install-html
git --version
配置:
system 系统层面配置
global 用户层面配置
local 仓库层面配置
只讲用户层面的配置:
git config --global user.name alex
git config --global user.email [email protected]
cd ~
cat .gitconfig
git config --list
对空目录进行初始化形成Git仓库
mkdir git_test
cd git_test
ll
git init
ll
执行完后,生成了.git,可以理解为git仓库
cd .git/
里面的objects是真正的数据仓库,存的数据
tree .
-----
git仓库有四个区域
工作目录、暂存区域、本地仓库、远程仓库
工作目录:刚刚创建的get_test
暂存区域:第一次暂存文件后,在工作目录下的index文件
本地仓库:.git文件夹
远程仓库:例如公共的GitHub或者Gitlab
把文件提交到暂存区再提交到本地仓库,再对文件进行修改时,会被Git记录
cd git_test //进入仓库工作区
如果提示“working directory clean”表示三个区域的文件是一致的
git status //查看仓库的状态
touch a b c //在工作区创建文件
git add a //把a从工作区->暂存区 untract->staged 1份->2份
git add . //把工作目录的所有文件移到暂存区
git rm --cached a //在暂存区->工作区 staged->untract 2份->1份
git rm -f b //同时从暂存区和工作目录删除b文件 2份->0份
git commit -m "commit a" //把a文件从暂存区提交到->本地仓库 存了3份 a文件真正被Git管理,可以进行回退等
如果从工作区和暂存区删除了a文件,提交后,本地仓库也删除了,删了也没用,因为可以回退找回来
改名:在工作区
---
mv a a.txt
rm --cached a
git add a.txt
git commit -m "commit a.txt"
----
前面的四步等价于:
git mv a a.txt
git commit -m "rename a to a.txt"
比较a文件:本地工作目录与暂存区内容是否一致
git diff a
比较a文件:暂存区与本地仓库内容是否一致
git diff --cached a
git commit类似虚拟机快照,一次commit相当于一次快照
查看做过哪些快照
git log
git log --oneline
git log --oneline --decorate
git log -p
git log -1 #显示第1条,显示第二条为git log -2
做完commit,怎么回到前面的状态?
1、本地工作目录改了,暂存区和仓库没动,
git checkout -- a.txt
2、本地工作目录改了,并提交到暂存区,仓库没动
git reset HEAD a.txt
git checkout -- a.txt
3、想回到之前的某次commit
git log
git reset --hard [某次commit的ID] #通过`git log`查看
4、回到之前某次commit后,还想返回之后的commit
git reflog
git reset --hard `id`
创建分支:b1
git branch b1
查看所有分支
git branch
创建后master分支和b1分支指向同一个commit
但是当前分支还是在master分支上,HEAD指向master
如何切换分支?
git checkout b1 //切换后HEAD指向了b1
假如在b1分支上创建test文件并提交到仓库
touch test
git add .
git commit -m "commit test on branch b1"
git log --oneline --decorate
ll //工作区多了test文件
这样,b1分支指向了新的commit,master分支还是指向之前的commit
再切换到master分支:
git checkout master
ll //在master分支下,工作区没有test文件
/*
结论:在多人协同工作时,每个人创建一个分支,自己在自己的分支上工作,各个分支之间互不影响,每个人一个HEAD只能指向自己工作的分支
*/
此时,b1分支比master分支多前进了一步,现在让master分支也前进一步
git checkout master //切换到master
touch mm.txt
git add .
git commit -m "commit mm.txt on branch master"
现在两个分支master和b1都从同一个commit延伸出来一步,两个分支master、b1都能通过log向前找到共同的commit,
现在在这个commit上让他们进行合并:
git checkout master //先切换到主分支
git branch
git merge b1
git log --oneline --decorate
合并后master分支包括了之前b1的commit,master的commit,合并之后的commit
这是没有冲突的情况下,不报错
如果都对同一个文件做了修改怎么样
git checkout master
echo 'master' >> a
git add .
git commit -m "modify a on master branch"
git log --oneline -- decorate
git checkout b1
git branch
echo "ttt" >> a
git add .
git commit -m "modify a on b1 branch"
有冲突的情况下合并:
git checkout master
git merge b1 //会提示失败。冲突了
vim a //里面会展示冲突的内容,需要手工处理
处理完后,
git add .
git commit -m "merge b1 to master both modify a"
// git commit -m "备注" 备注里写什么都行
删除分支,例如合并到主分支后需要删除别的分支
git branch -d b1
标签:一般命名为V1.0 V1.1等等,标签是也是指向commit的指针,用来标识一个commit
因为如果用ID来标识commit,那个ID是一串乱七八糟的字符串,看起来没有意义
git的标签的指针是不能变的,针对某次commit使用
先看看有哪些commit:
git log --oneline
不指定就是最后一次commit,执行后再输入描述信息
git tag -a v1.0
指定ID=aa27de7的commit打标签,执行后再输入描述信息
git tag -a v2.0 aa27de7
查看有哪些tag
git tag
查看v1.0标签的详细信息
git show v1.0
通过标签回到v2.0的commit状态
git reset --hard v2.0
拉取代码:
1.通过分支拉取
2.通过tag拉取
3.通过commit对象拉取,需要知道ID
234
234
23234