Git使用及原理

简介

版本管理工具,具体介绍自行百度
gitlab环境搭建:https://blog.youkuaiyun.com/eos2009/article/details/102560951

使用

操作命令

全局设置

git config --global user.name "chenfei"  #设置登录名
git config --global user.email "chenfei@qq.com" #设置登录邮箱

基本操作命令

git init #初始化本地仓库
git add hello.txt #向本地仓库添加文件
git commit -m "first commit" #向本地仓库提交
git status #查看本地仓库当前状态
git log #查看提交历史记录
git reset HEAD  #撤销上一次add内容  可以指定具体文件
git rebase -i master #-i交互模式  master(当前分支基于那个分支切出来的)表示与master分支比较 

分支操作命令

git checkout -b dev #基于当前分支创建一个dev分支,并切换到dev分支
merge单个commit
git cherry-pick 5a2ae0cf037d55090a761 #将dev分支上的一个commit合并到master分支

远程仓库

git clone http://192.168.138.129:8080/root/test.git #从远程分支克隆代码(默认拉取所有分支)
git remote add origin http://192.168.138.129:8080/root/test.git  #添加远程仓库
git push origin master #向远程仓库master分支推送代码
git pull origin master #从远程仓库master分支拉取最新代码

推送本地项目到远程仓库

创建远程仓库

内网可以:gitlab
外网可以:gitoschina(码云)或github)
演示使用的gitlab
在这里插入图片描述

本地项目提交到远程仓库

git init #初始化本地仓库
git add * #向本地仓库添加文件
git status #查看当前状态
git commit -m "first commit" #向本地仓库提交
git remote add origin http://192.168.138.129:8080/root/test.git  #添加远程仓库
git pull origin master #从远程仓库master分支拉取最新代码   --allow-unrelated-histories , 把两段不相干的 分支进行强行合并
git push origin master #向远程仓库master分支推送代码

添加文件后状态
在这里插入图片描述
commit后状态
在这里插入图片描述
提交到远程仓库

  • 注意:此时本地仓库和远程仓库是不相干的,需要使用强制合并
    在这里插入图片描述

从远程仓库拉取项目

注意可以使用 -b branchName 拉取指定分支

git clone http://192.168.138.129:8080/root/test.git #从远程分支克隆代码(默认拉取所有分支)

开发过程中提交、合并代码

第一步:一般基于dev分支切出一个当前需求的分支,如下

git checkout -b checkDetail #基于当前分支创建一个checkDetail分支,并切换到checkDetail分支
在这里插入图片描述

第二步:开发完成功能,合并多次commit

简单老说,就是将多个commit合并为1个
git rebase -i dev #-i交互模式 dev(当前分支基于那个分支切出来的)表示与dev分支比较

  • 结果如下,将对个commit合并为一个commit了
    在这里插入图片描述
rebase分两步
  • 设置哪些分支需要合并,设置完成保存(wq)
    在这里插入图片描述
  • 设置commit注释,设置完成保存(wq)
    在这里插入图片描述
rebase命令说明
  • pick:保留该commit(缩写:p)
  • reword:保留该commit,但我需要修改该commit的注释(缩写:r)
  • edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
  • squash:将该commit和前一个commit合并(缩写:s)
  • fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
  • exec:执行shell命令(缩写:x)
  • drop:我要丢弃该commit(缩写:d)

合并代码(将功能分支代码合并到主流分支dev上)

建议使用cherry-pick,合并单个commit(与rebase联合使用)

  • git checkout dev #切换分支到dev
  • git cherry-pick 5a2ae0cf037d55090a761 #将checkDetail分支上的一个commit合并到dev分支
  • git log #查看commit记录
    在这里插入图片描述

原理

git的原理

操作命令

git cat-file --batch-check --batch-all-objects  #查看所有对象
git cat-file -p 9b2675164c4f8ae9e9e4dd69f9a6e2994004acff #查看指定对象内容
git ls-files --stage #查看index空间

git文件类型

blob(对应仓库中的文件)
tree(对应仓库中目录)
commit(对应提交记录,包含一个面向根目录的tree对象指针和committer个人信息及commit注释)
  • git初始化并添加一个文件,如图在这里插入图片描述
  • 在创建一个目录,添加文件,并commit,可以看到如下结果
    在这里插入图片描述
  • 修改hello文件并提交,可以看到
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

结论
* Git并不储存一个文件不同版本之间的diff,Git把同一个文件的每个版本都当做一个独立的文件来储存。
* commit之间就是单向链表,新的commit会指向一个原有的commit,知道最新commit位置,就能找到所有commit信息

git分支概念

git的branch,其实就是一个指向某个commit的指针文件,一般被存放在./.git/refs/heads里面。一个新建的Git 仓库会有一个默认的master分钟。这个branch的信息实际上就存在./.git/refs/heads/master这个文件里,指向当前分钟最新的commit
在这里插入图片描述

HEAD是一个指向目前工作目录的commit的指针。它的信息存储在./.git/HEAD这个文件中
在这里插入图片描述

git暂存(index空间)

git add hello.txt 实际新的hello.txt已经被作为一个新的blob对象添加到了git仓库中了,而并不是被添加到index中。git只是更新index中这个文件的指针来指向新版本的blob对象。

  • 此时执行commit,git将会基于index里面所指向的这些blob对象以及他们对应的路径来生成tree对象,最终生成commit对象。可以理解index空间是新的commit的一个快照(snapshot)
    在这里插入图片描述

  • 此时执行回滚取消add,index中这个文件的指针会指向最后一次commit,但是该文件其实已经提交到git仓库了
    在这里插入图片描述

对index空间(stage空间错误理解)
  • 临时存放新文件的地方
  • 包含的并不是当前commit和新commit的diff信息

参考

https://www.jianshu.com/p/ae3f7c954061
https://www.jianshu.com/p/6bb76450d763
https://www.jianshu.com/p/ae3f7c954061
https://www.jianshu.com/p/6bb76450d763

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值