【Git教程】版本控制工具

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

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值