git是分布式版本控制系统;
什么是版本控制系统?
比如写游戏,会分版本,从一代的基础上复制并修改为二代,一代保留(类似MC的1.7.10和1.19);
当出了很多个版本之后,一点是想要回去玩之前的经典版本,但在版本丛中不好找;第二点是两个部门合作一个版本时分工不同,需要对一个共享文件进行改动,但是不知道另一个部门在什么时候做了什么改动,要合并内容,会比较难顶;
而一个软件能解决这些毛病,记录每次文件的改动,且允许共同编辑,称其为版本控制系统,目的为了方便开发大项目;
分布式与集中式?
集中式:版本库集中于中央服务器,每次改动会从其中获取新版本,之后推送回去;
分布式:每个人的文件中都有版本库,所以工作时不需联网,合作时,只需要将改动推送给对方,多人合作时,会有一人充当中央服务器;
Git工作流程
Workspace:工作区,平时存放项目代码的地方。
Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息。
Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。
Remote:远程仓库(github) ,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换。
一个文件夹即可成为工作区,其中初始化后有一个.git后缀子目录,存放Git管理信息;.git里又有暂存区和仓库区;
命令
基本操作
使文件夹成为工作区:
1 | git init (指定目录) |
添加文件到暂缓区:(name可以是*.加上后缀名,表示全部的一类后缀名都加入)
1 | git add (name) |
告知后提交,真正加入仓库中:
1 | git commit -m "初始化项目版本" |
查看仓库当前状态,显示有变更的文件:
1 | git status |
回退版本:
1 | git reset (place) |
从暂缓区和工作区中删除:
1 | git rm |
移动或重命名工作区文件:
1 | git mv |
远程操作
控制远程仓库:
1 | git remote (基本操作) |
从远程获取代码库:
1 | git fetch |
下载远程代码并合并:
1 | git pull |
上传远程代码并合并:
1 | git push |
撤回:
1 | git revert |
实际上是将之前的提交记录的相同状态再提交了一遍;
分支管理
创建分支:(不加name则是列出分支)
1 | git branch (name) |
带参:-d,表示delete,删除该分支;
-f,强制移动;例如:git branch -f main HEAD~3 将main分支移动到HEAD所指的提交记录上;
切换分支:
1 | git checkout (name) |
带参:-b,意思是先branch,再checkout,可以直接切换到新创的分支里;
name是某个具体提交记录那么就会分离HEAD,name如果是分支名加^,就会移到前一个提交记录;
如果是HEAD加~x,就会移动到前x个提交记录;
合并分支:(当前分支上融合另一个,另一个会存在一个副本)
1 | git merge |
合并同一分支上且不留副本:
1 | git rebase |
带参:-i,交互式rebase;
将其他提交记录直接放到当前分支下:
1 | git cherry-pick (name1) (name2) |
结尾
github添加一个远程库命令:
1 | git remote add origin git@github.com:XXXXX |