分布式版本控制工具:Git (原理图解及使用教程 ,包含所有基础命令操作的理解)

目录

前言

版本控制神器git

集中式版本控制与分布式版本控制图解

图解快照原理

图解git三种状态

git命令操作解析

用户身份

检查个人设置

获取git仓库

git仓库中记录变更

查看当前文件状态

暂存已修改的文件

提交变更拉取分支

查看分支,查看git提交记录

分支的使用

分支的总结

分支命令

分支冲突

暂时保存

哈希

关于各个部分如何撤回的问题

合并多个commit 

总结


前言

这篇文章都是参考《Pro Git》中文《精通 Git》主要对前三章进行了总结精简,网上有很多文章已经对git进行解释

但是要么不完整不系统,要不互相模仿看着很凌乱,我顺着这本书的思路对git进行简单的剖析,如果是小白对文章仔细

浏览一定会很有收获,文章不像书上那么冗杂,尽可能精简加上我个人理解,都是最常用最重要的东西!如果只想知道

如何使用,可直接通过目录跳转到总结

版本控制神器git

git是一款分布式版本控制工具,使用这个工具可以轻易的将文件或整个项目恢复到先前的版本,

还可以对比文件随时间的变更,查看什么人最后做出了修改,谁在何时引入了问题,等等,不但

可以恢复原状而且付出的开销也很低。

git大部分操作只需要用到本地资源,一般无需从网络中获取信息,即使断网了仍可以执行几乎所有操作

之前的旧版本也可以在本地直接找到,不像集中控制版本那样多数操作都有网络延时的开销。

优势:

  1. 速度快
  2. 设计简洁
  3. 对非线性开发有强有力的支持
  4. 完全的分布式设计
  5. 有效的处理大型项目(速度以及数据量的优势)

集中式版本控制与分布式版本控制图解

这种方案可以保证不同系统开发人员之间的协作,一定程度上可以掌握其他人在项目中做了什么

管理员可以精细的控制每人权限,但是维护一个集中式版本控制系统的最显著的问题就是,服务器单点故障,

如果服务器宕机一小时,这期间任何人都不能更改提交,如果中央数据库受损,备份也没保住,那么就可能

一无所有。

分布式版本控制系统就是为了解决上述问题,客户端并非是仅仅是检查出最新快照。而是对代码

仓库进行完成的镜像,这样一来不管服务器是否完好,都可以从本地进行恢复,每一次下载库

都是对库的完整备份。

图解快照原理

git与其他版本控制系统最大的不同在于对待数据的方式,其他大多数版本控制系统以文件的变化列表

方式存储,将每次储存的信息视为一组文件对这些文件随时间做出变更。

git则更像是将数据视为一个微型文件系统的一组快照,每次提交时,git会抓取一个当前所有文件状态的

快照,然后储存一个指向该快照的引用,高效的地方在于如果文件没有变动,git不会在重新保存文件

而是会留下一个指向先前保存过文件的链接。

 

快照顾名思义就是相当于一张照片,这个在git回滚的过程用得到,每次的commit就会形成一个id,这个id值就是你项目提交的快照,回滚的时候,找到这次id就能回滚到这次的commit的内容。

快照是整个系统或者应用在某个时刻的状态记录,而不是对文件的存贮

应该理解为对每部分文件最新状态的“指针”

图解git三种状态

git中文件可以处于三种状态

已提交committed :表示数据以及被安全的存入本地数据库

已修改modifide  : 以改动了数据但是尚未提交

已暂存staged :  对已修改的文件当前版本做出了标识并加入了下次以提交的快照中 

Git目录(本地仓库)就是最重要的储存项目的地方

工作目录:就是从Git目录下载以供使用或修改

暂存区:其实就是一个索引文件,一般位于Git目录中,它保存了下次所要提交的内容相关信息,其实就是一个索引文件

           

工作目录(就是拷贝下来的使用的代码)-->使用git add可以添加至缓存区 (暂存待提交的文件信息)

  -->git commit 添加至本地仓库(添加到远程仓库前最后一次修改机会)-->git push添加到远程仓库     

前三区都在本地称为git的三大区域      

git命令操作解析

用户身份

git config --global user.name "wang"
git config --global user.email "123@456.ai"

安装git后第一件事就是设置用户名和电子邮件地址,因为每次提交都会被写入所创建的提交中。

如果么每次使用不用户可以不见 --global .

git可以使用不同的协议传输数据,https,ssh

使用ssh时必须先配置密钥,但是在以后使用时不需要再重复输密码

检查个人设置

需要检测个人配置和身份信息只需在所属用户下使用:git confit  --list

 

//查看用户名
git config user.name
//查看用户邮箱地址
git config user.email

//修改用户名称
git config --global user.name "username"
//修改邮箱地址
git config --global user.email "email@xxx.com"

获取git仓库

在git上建立项目的方式主要有两种,第一个就打本地项目导入git中,第二就是从服务器是clone

一:在现有项中初始化git仓库

对现有项目进程跟踪管理。只需进入目录:
git init
会创建一个.git目录,包含所有构成git仓库的必备文件
然后对项目进行初次提交
git add . //提交当先目录下所有文件
git add LICENSE //获取许可
git commit -m "inital project version" //初始版本提交

二:现有仓库的clone

git clone [URL] 后面路径和生成文件名可以指定,默认当前文件下并使用库名。

git仓库中记录变更

对项目进行修改完下一个操作就是向仓库提交这些变更的快照

每一个文件都处于两种状态之一:

已追踪tracked :指的是上次提交快照总包含的文件,这些文件可以分为已修改,未修改,以暂存

 未追踪untracked:不在上一次快照中,也不再暂存区的文件(新建文件,在vscoed上使用绿色U标记)

查看当前文件状态

git status 
//使用这个命令可以检测当前文件状态
//可以获取当前分支 
//列出已跟踪文件中 已修改和以提交的记录
//未跟踪的文件 (尚未提交以备变更的文件)
 + -s 以简约方式显示
 + -u 默认显示所有未跟踪文件 
也可以使用 git diff
会打印出所有已经改动的细节,但是只限于未进入暂存区的变更
如果所有文件都进入暂存区则不会有任何输出

在大型的项目很多时候会生成很多相关文件,比如日志文件,编译文件,动态库等等
不需要上传的冗余文件,git提供文件的忽略方式
可以创建名为 .gitignore 的文件

举个例子:

第一行:忽略以.a  .o 结尾的文件 第二行:忽略以~结尾的文件,

暂存已修改的文件

git add 
这个命令主要有两个功能:
1:跟踪未跟踪的文件
2:将文件添加到暂存区
这个命令的理解方式为“添加内容到下一次提交”而不是“把文件加入项目中”

提交变更拉取分支

git commit 
将缓存区文件推送到Git目录
使用命令时会打开文本编译器添加注释
可直接添加 -m
git commit -m "提交说明"
将远程指定分支 拉取到 本地指定分支上:

git pull origin <远程分支名>:<本地分支名>

git pull 

可以直接git pull 更新到最新分支
主分支git pull后其他分支可使用 git merge master 更新

 

将本地当前分支 推送到 远程指定分支上(注意:pull是远程在前本地在后,push相反):

git push origin <本地分支名>:<远程分支名>


git push 可以直接将本地库提交到远程库

如果远程库已经跟新,应先git pull 更新在git push
因为要确保本地master是最新的,否则出现问题,你的分支可能无法合并
再git rebase master 将master最新的分支同步到本地,这个过程可能需要手动解决冲突(如果进行了上一步的话,只用解决一次冲突)

查看分支,查看git提交记录

git branch 查看分支
git log    查看更新记录

分支的使用

分支的总结

  1. 同时并行推进多个功能开发,提高开发效率
  2. 各分支在开发过程中,如果一个分支开发失败,不会对其他分支有任何影响,删除分支重新开始
    (即通过分支去试错)
  3. 一旦初始化完成,master是肯定存在的,可以理解为主线,分支确保正确才能合入主线
    主线出现问题一般是创建一个hot-fix分支去修复(热修复,因为主线不能停止工作)
  4. 其实git分支就是一个指向某次提交的轻量级的可移动指针(指向当前分支最新快照,不管更新还是回滚效率很高),默认是master,每次提交都会向前
  5. 如果想知道当前在那个分支git branch ,其实git维护一个HEAD的指针,通过指针指向当前分支

分支命令

  1. git branch 查看分支
  2. git branch 查看分支细节(包括提交时的日志说明)
  3. git branch name 新建分支
  4. git checkout name 切换指定的分支 :
    这条命令可能会失败,造成的原因有两个 1:远程库更新,需要拉去分支git pull 2:已修改文件未提交git add
  5. git push origin --delete 分支名 删除远程库分支
  6. git branch -d(-D) 删除本地分支
  7. git branch --delete -f 分支名(强行删除)
  8. git branch -r -D origin/BranchName(删除本地的远程分支:)

  9. git push origin --delete BranchName(远程删除git服务器上的分支)

  10. git branch -m 要改的本地分支名 修改后的分支名(修改本地分支)

  11. git push origin 修改后的分支名:修改后的分支名(push 到远程分支)

     

分支冲突

  1. 合并分支:
    1:必须切换到接受修改的分支上(被合并,增加新内容)git checkout 被合并分支名
    2:git merge 合并分支名
  2. 合并分支产生冲突:出现冲突就是不同分支修改了同样的地方,这个地方会有提示
  3. 冲突的表现:
  4. 冲突解决:
    1:编辑文件,删除特殊符号
    2:将文件修改到满意的程度,保存退出
    3:git add 冲突文件名
    4:git commit -m "日志名"  此时不需要带任何文件名

暂时保存

git stash
命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,
后续可以在某个分支上恢复出堆栈中的内容。

stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。

git stash作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。

git stash --git stash pop

哈希

哈希是一个系列的加密算法,各个不同的哈希算法加密强度不同,但是有共同点

  1. 当哈希算法确定时:
  2. 不管数据量有多大,同一个哈希算法,得到的加密结果长度固定
  3. 输入变化,输出一定变化且变化很大(输入多一个. 输出也会完全不一样)
  4. 哈希算法不可逆
  5. git采用SHA-1 的算法

关于各个部分如何撤回的问题

如果 git add 进入暂存区后需要撤回暂存

git reset HEAD 文件名 撤销暂存

git checkout -- 文件名 丢弃工作区改动 

当我们git commit -m  “test” 之后
会提交至本地库,git log可以查看记录

撤销时 git reset --soft HEAD~1
回到提交前 git log 日志也会取消

HEAD^的意思是上一个版本,也可以写成HEAD~1
如果你进行了2次commit,想都撤回,可以使用HEAD~2
~ 和 ^ 不区分

参数:
--mixed:不删除工作空间改动代码,撤销commit,并且撤销git add . 
这个是默认参数,不加参数默认是这个

--soft:不删除工作空间改动代码,撤销commit,不撤销git add . 

--hard:删除工作空间改动代码,撤销commit,撤销git add . 

注意完成这个操作后,就恢复到了上一次的commit状态

如果仅仅是注释写错了:
修改注释:git commit --amend

合并多个commit 


在提交时如果本地库有多个commit 备份,push需要合并:

首先git log 查看记录

git rebase -i comitID 所有需要合并项前一项的ID

pick ---》 s 执行到合并

继续修改commit

保存退出

https://blog.csdn.net/u013276277/article/details/82470177

总结

一.基本工作流的使用
* git init  创建新的git仓库
* git clone     克隆
* Git add .    提交自己的改动
* git commit -m   提交代码信息  
* git push   +  任何自己想推送的分支  推送到分支合并
* git pull         更新本地仓库至最新

二. 其他使用
* git remote add origin <server>   没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器
* git log    查看提交的信息
* Git stash    保存当前进度的代码
* git status    查看当前分支
* Git config    可以修改仓库拥有者

三.分支
* 创建一个叫做"feature_x"的分支,并切换过去:
       git checkout -b feature_x
* S再把新建的分支删掉:
       git branch -d feature_x
* 除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的:
       git push origin <branch>

消除git diff中 ^M的差异

git config --global core.whitespace cr-at-eol

将远程的git仓库的指定分支拉取到本地(本地不存在的分支)

git checkout -b 本地分支命名 origin/远程分支名

若出现提示,先git fetch

如何删除远程仓库

git branch -a 
查看远端所有分支

git push origin --delete branch1

新建分支的推送

 git push --set-upstream origin testname

远程代码更新之后: 

使用git stash 保存本地修改的代码到缓存区,此时代码会还原为没修改之前的,
此时在使用git pull拉取代码,然后使用git stash pop恢复缓存区的代码,此时解决冲突即可提交

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值