1.1git简介
1.1.1安装
git是一个版本管理系统,window上安装git bash即可,linux安装命令为apt install git
1.1.2分布式和集中式
1.集中式
集中式版本控制系统中版本库是放在中央服务器上的,干活的时候使用自己的电脑,活干完了就的把自己做的东西提交到中央服务器.
缺点:必须联网
2.分布式
分布式版本控制系统中,每个人的电脑都是一个完整的版本库,如果一个人的电脑坏掉了不要紧,随便从其他地方复制一份就可以了,不过为了方便数据的交换,我们也会设置一个中央服务器,只不过这个中央服务器是用来交换数据的,即使没有了这个中央服务器,我们也能进行数据的交换,只不过麻烦一点而已.
优点:安全性高(每个人的电脑都是一个完整的版本库,如果一个人的电脑坏掉了不要紧,随便从其他地方复制一份就可以了.而集中式版本控制系统的中央服务器出了问题,所有人都没办法干活.)
1.1.3创建版本库
1.创建空目录
# 创建空目录
mkdir learngit # 创建一个文件夹
cd laerngit # 进入到该版本库中
pwd # 查看当前路径
2.创建管理仓库
git init # 将目录文件变成管理仓库
创建完成之后我们git仓库瞬间建立好了.learngit文件夹下瞬间产生了一个.git的目录,这个目录是用来跟踪版本库的,最好不要乱动,如果没有看到.git文件目录(那是因为当做隐藏文件隐藏起来了),我们可以使用ls -al进行查看
注意:
1]所有的版本控制系统只跟踪文本文件的改动,也就是txt文件,而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。
2]使用window的同学建议不要使用window自带的记事本,因为该记事本文件头添加了0xefbbbf(十六进制)的字符,如果使用它编写会遇到很多问题.
3.文件添加和提交
# 编写一个文本文件readme.txt
git checkout 从暂存区回退到工作区
git add readme.txt # 从工作区添加到暂存区
git reset HEAD # 分支转移到暂存区
git commit -m '本次提交的说明申请' # 暂存区到分支
4.版本管理
vim readme.txt # 修改我们上次提交的readme.txt文件
git status # 查看仓库状态,"modified:readme.txt"说明我们对该文件进行了修改,但是并没有进行提交.
git diff 文件名 # 指定具体某个文件,查看该文件修改前和修改后的内容差异
如果知道了git是怎么修改的 现在提交就可以放心了,提交修改和提交新文件是一样的两步:git add 文件名;git commit
1.2时光穿梭机
1.2.1版本回退
1.代码实现
git log --pretty=oneline # 查看历史记录
# 版本回退到上一个最新版本;
# 版本回退到上上一个版本:git reset -hard HEAD^^;
# 如果要回退多个版本,我们可以使用git reset -hard HEAD~100
git reset -hard HEAD^
# 如果我们后悔了回退,我们可以使用指定版本号进行回退
git reset --hard 1094a(表示commit id)
# 如果我们忘记了commit id,我们可以使用
git reflog
2.代码解析
head指向的版本就是当前版本,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id,
每提交一个新的版本,git就会把它们自动串成一条时间线
用git log
可以查看提交历史
要重返未来,用git reflog
查看命令历史,以便确定要回到未来的哪个版本。
1.2.2工作区和暂存区
1.工作区
电脑中能看到的目录.learngit这个目录,也就是我们刚开始初始化的目录
2.版本库
工作区中的隐藏目录.git就是我们的git版本库,它不属于工作区,一帮情况下我们也不要对其随便进行修改.
包含:暂存区,master分支,执行master分支的指针head
图解:
git add其实是将工作区中的文件添加到暂存区中
git commit其实是将暂存区中的内容修改提交到当前分支中(默认是master).
提交之后,如果我们对工作区没有进行任何修改,工作区就是干净的(暂存区中没有任何内容).
3.diff命令
git diff --cached查看暂存区和仓库差异;
git diff a.txt 指定文件比较暂存区和分支中的内容;
git diff HEAD 查看工作区和仓库的差异
1.2.3管理修改
git管理的是一种修改,而不是文件.
vim a.txt
-->git add
-->vim a.txt
-->git add
-->git commit
1.2.4撤销修改
1.没有git add时,用git checkout -- file
2.已经git add时,先git reset HEAD <file>回退到1.,再按1.操作
3.已经git commit时,用git reset回退版本
1.2.5删除文件
rm a.txt 将文件直接从工作区中进行了删除
git status查看状态,出现工作区和版本库不一致,这时有两种情况:
确定删除:git rm-->git commit
误删了:git checkout --a.txt
小结:只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
1.3远程仓库
1.3.1远程仓库简介
要么自己搭建一个git的服务器,有一个网站github,提供了git仓库托管服务.
以github为例,使用远程仓库
- 创建ssh key.主目录下查看是否有.ssh目录,如果有查看是否有id_rsa(私钥)和id_rsa.pub(公钥)两个文件.如果有直接跳到下一步,如果没有,打开git bash,创建ssh key
ssh-keygen -t rsa -C "youremail@example.com"
- 登录github,打开“Account settings”,“SSH Keys”页面,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴
id_rsa.pub
文件的内容,点“Add Key”,你就应该看到已经添加的Key:
- 当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub
1.3.2添加远程库
1.创建远程仓库
创建完成
2.本地和远程进行连接
git remote add origin git@github.com:152****1014/learngit.git
git push -u origin master 将master中的内容推导origin中,以后在本地修改完代码之后,我们只需要使用git push origin master就可以推送到最新版本.
1.4分支管理
1.4.1分支的创建合并
1.merge方式
- 创建分支并切换:git checkout -b dev -b表示创建并切换;
- 创建分支:git branch dev
- 切换分支git checkout dev
- 查看当前分支:git branch # 当前分支的结点前面会标*
- 编辑dev分支:vim a.txt
- git add a.txt
- git commit -m 'branch test'
切换回master分支:git checkout master
合并分支:git merge dev
合并完成后我们就可以放心的删除dev分支了
git branch -d dev
删除之后查看所有分支
git branch
2.switch方式
通过上面的操作我们会发现git checkout <branch>和git checkout --<file>一个命令两个作用.
实际上我们使用switch切换分支更加科学
git switch -c dev 创建并切换到新的分支
git switch master 直接切换到已经存在的分支
git marge dev 将当前分支和dev分支进行合并
git branch -d dev 删除分支
1.4.2解决冲突
git switch -c feature1
git add readme.txt
git commit -m "AND simple"
git switch master
git add readme.txt
git commit -m "& simple"
当我们的master 分支和feature分支各自都有新的提交的时候变成了这样
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,必须手动解决冲突后再提交,git status也可以告诉我们冲突文件.
再次添加:git add readme.md;再次提交:git commit -m ''fixed
git log --graph查看分支情况
git branch -d feature1删除分支
注意:
提示超前是指的本地master比远程仓库的master超前; 影响超前的原因是:master曾经commit过; 或者本地分支dev等commit过,之后切换到本地master之后进行合并过; 这个时候相当于本地master分支后拥有的新的记录;但从未push过远程; 由于与远程的master有关联,当你切换本地分支再切换到本地master之后它会提示你超前远程仓库master多少了提交;
1.4.3分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息
如果要强制禁用Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
下面我们实战一下--no-ff
方式的git merge
:
git switch -c dev
git add readme.txt
git commit -m "add merge"
git switch master
# --no-ff参数,表示禁用Fast forward
git merge --no-ff -m "merge with no-ff" dev
git log 查看分支历史
团队合作项目开发
为什么会产生冲突?
a,b两个分支,我们的a是基于master版本1的,b来自master,对b进行编辑之后与master进行合并,这个时候如果想要将a与master合并就会发生冲突,如果解决冲突呢?我们有两种方式,一种是恢复到没改变的版本1的状态,也就是对主分支进行相关的恢复操作,另一种方式是shiyongrebase将a这个分支由基于版本1直接拉到基于版本2的状态
参考文档:https://www.liaoxuefeng.com/wiki/896043488029600
参考视频:https://www.bilibili.com/video/av16377923?p=1