目录
简介
版本管理工具,具体介绍自行百度
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

被折叠的 条评论
为什么被折叠?



