Git 是Linux之父 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 GitHub 作为全球最知名的代码管理平台 使用 git 分布式版本控制系统,为代码的托管提供了非常便捷的服务
在使用Git之前,需要了解Git系统的相关机制
3个容器
- 工作区 :
- 当前项目目录 文件分为两种状态: 已跟踪 、 未跟踪
- 已跟踪的文件为以及被纳入Git版本库中的文件,具有快照记录,
- 已跟踪的文件在一段时候后有 3种 状态: 已提交 、 已修改 、 已暂存
- 暂存区:
- 当生成Git对象后,从Git版本库中放入Git对象所对应的文件的占存容器
- Git版本库:
- Git对象的直接存储容器
3个对象
Git对象(blob)
将目标文件一git对象的方式存储于Git版本库的objects中,使用hash算法生成一个唯一的SHA-1值来标识当前文件的Git对象.
树对象(tree)
将多个Git对象(一个项目版本的多个文件)对应的SHA-1索引生成一个树对象,记录文件的层次结构
提交对象(commit)
将一个树对象以及上一个commit对象使用注释打包(标明当前提交信息:时间、地点、人物),
Git 基本操作流程
- 初始化git:
git init
- 选择文件生成Git对象:
git add ./
- 将对应文件生成Git对象,并保存到Git版本库(只要工作区中的文件被修改过,就会生成新的Git对象):
git hash-object -w 文件名
- 将更新后的Git对象(多个)放入暂存区:
git update-index
- 生成一个树对象,并生成一个commit对象并提交:
git commit -m “注释内容”
上面的命令执行与下面两句命令执行等效:
- 生成快照: 根据暂存区(index)中的文件SHA-1索引生成树对象,返回生成树对象的SHA-1值,
只要文件有改动就会生成新的树对象
git write-tree
- 生成commit对象:
git commit-tree <树对象SHA-1> -p <上一个commit对象SHA-1>
- 生成快照: 根据暂存区(index)中的文件SHA-1索引生成树对象,返回生成树对象的SHA-1值,
Git 高层命令(CRUD)
- 初始化
git init
- 查看git状态
git statue
- 查看那些更新还没有被暂存
git diff –cached
- 查看那些修改 以及 被暂存了未被提交的部分
git diff –staged
- 将对象提交到暂存区
git add ./
- 将暂存区提交到版本库
git commit -m “注释”
- 直接将工作区中的文件提交到版本库,跳过暂存区
git commit -a
- 查看暂存区内容
git ls-files -s
- 打开提交日志
git log
- 将文件从工作目录中删除并提交删除状态到暂存区
git rm <文件名>
- 将文件从工作目录中 移动 或者 重命名 并提交修改状态到暂存区
git mv <文件名>
分支管理
改变指向最新提交对象的指针
- 不加参数,得到分支列表
git branch
- 分支名 : 在当前的提交对象上,创建一个可移动的新指针,创建后不会自动切换到新指针上
git branch
- 新建一个分支并指向指定的提交对象
git branch <分支名> <commit对象SHA-1> :
- 查看每个分支的最后一次提交
git branch -v
- 将HEAD指针切换到新分支上
git checkout <分支名> :
- 新建一个分支,并切换到这个分支
git checkout -b <分支名>
- 强制删除分支,不能直接删除当前所在的分支,需要切换到其他分支
git branch -D <分支名> :
合并分支:
快进合并:
git merge 分支名
如果当前分支和将要合并的分支处于同一分支线上(父子或祖孙关系),则启用快速合并
将master指向合并的分支上需要切回需要合并的分支,再执行合并.
执行后主分支(master)会和新分支指向同一个commit 且 之前主分支指向的commit会得以保留
典型合并:
- 如果当前分支和将要合并的分支没有处于同一分支线上,则启用典型合并,Git需要做额外工作
注意:
切换分区所改变的 对象: HEAD 指针 、 暂存区 、 工作目录
切换分支会改变当前工作目录中的内容,所以每次在切换分支之前最好提交当前分支
在切换分支时,如果当前分支有未跟踪的文件,则分支可以切换成功
未跟踪或未提交的文件在切换分支后得以保留,但可能会污染分支
文件被改动后未提交 ,则切换分支不会成功
Git 存储
如果不想当前工作仅仅做了一半而提交,然后切换分支的话,Git存储命令会帮助储存当前未提交的文件(被改动的)
将未提交的修改保存到一个栈上
git stash
查看栈中存储的文件
git stash list
从栈中指定位置恢复文件,如果不指定位置默认为栈顶,而且不会删除栈中文件
git stash apply <栈号(可选)>
立即弹出栈顶的文件到工作区,并且将那个文件从栈中删除
git stash pop
删除栈中指定的位置的文件
git stash drop <栈号>
Git 撤回提交
工作区:
撤回工作目录中的刚刚保存的文件
git checkout -<要撤回修改的文件名>
暂存区:
撤回暂存区中刚刚放入的文件
git reset HEAD <暂存区中要撤回的文件名>
版本库:
撤销提交了的commit对象(因为提交内容有误,注释写错等)
git commit –amend
- 撤销上一次提交,回到写入注释的地方,重新提交当前暂存区的内容,
可使用:q! 退出注释,然后重新进行提交
- 撤销上一次提交,回到写入注释的地方,重新提交当前暂存区的内容,
Git 撤回分支
携带撤回到某一个分支
git reset –soft <提交对象SHA-1>
- 移动HEAD指向的提交对象 ,会携带分支一起移动,
- 本质上是撤销了上一次的commit命令,但是重新提交后,错误的提交对象不会被删除,
- 这个命令只更改HEAD以及分支指向的commit对象,不会修改工作区和暂存区的内容
携带暂存区,撤回到某一个分支
git reset –mixed <提交对象SHA-1> :
- 和上个命令相似 ,不仅更改HEAD以及分支指向的commit对象,而且会将暂存区修改为当前HEAD指向的commit
携带工作目录、暂存区,撤回到某一个分支
git reset –hard <提交对象SHA-1>
- 撤销最后的提交,并将 暂存区和工作区 修改为当前HEAD指向的commit对象(不推荐)
使用Github远程仓库
远程仓库是指托管在因特网或其他网络中的你的项目的版本库。你可以有好几个远程仓库,
通常有些仓库对你只读,有些则可以读写。
多人远程协作基本流程
项目经理操作
使用命令创建本地仓库
为远程仓库配置别名 和 用户信息
添加一个新的远程Git仓库,将次仓库设置一个别名:
git remote add <仓库别名> url
查看 远程仓库别名 对应的URL:
git remote –v
查看某一个远程仓库的更多信息:
git remote show <仓库别名>
重命名仓库别名:
git remote rename <仓库别名> <新别名>
应为某种原因,要移除一个远程仓库:
git remote rm <仓库别名>
推送本地项目到远程仓库
推送分支到远程仓库:
git push <仓库别名> <分支名>
在推送分支到远程仓库后,本地仓库默认会生成 红色标注 的远程跟踪分支
获取成员提交的新内容到本地
- 同步新数据到本地:
git fetch <仓库别名>
- 同步新数据到本地:
获取成员提交的新内容到本地
同步新数据到本地:
git fetch <仓库别名>
项目成员操作
成员在工作目录中使用git配置自己的用户信息
配置当前 工作目录 下的 用户名(name)以及邮箱(Email):
git config user.name <用户名>
git config user.email <邮箱>删除配置的默认用户信息:
git config –global –unset user.name
git config –global –unset user.email
成员克隆远程仓库到本地
克隆远程仓库(将远程仓库同步到本地),不需要初始化git
克隆到本地的仓库别名默认为Origingit clone url
修改默认远程仓库名:
git clone -o <自定义仓库名>
成员推送提交到远程仓库:
推送分支到远程仓库(需要成员在Github上拥有远程仓库的写入权限,并且当前分支没有被推送过)
git push <仓库别名> <本地分支名>