GIT保存的是不是文件差异或者变化量,而只是一系列文件快照

在Git 中提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容快照的指针,包含本次提交的作者等相关附属信息,包含零个或多个指向该提交对象的父对象指针:首次提交是没有直接祖先的,普通提交有一个祖先,由两个或多个分支合并产生的提交则有多个祖先。


暂存操作会对每一个文件计算校验和(即第一章中提到的SHA-1 哈希字串),然后把当前版本的文件快照保存到Git 仓库中(Git 使用blob 类型的对象存储这些快照),并将校验和加入暂存区域


当使用git commit 新建一个提交对象前,Git 会先计算每一个子目录(本例中就是项目根目录)的校验和,然后在Git 仓库中将这些目录保存为树(tree)对象。之后Git 创建的提交对象,除了包含相关提交信息以外,还包含着指向这个树对象(项目根目录)的指针,如此它就可以在将来需要的时候,重现此次快照的内容了。


现在,Git 仓库中有三种对象:表示文件快照内容的blob 对象一个文件一个对象;一个记录着目录树内容及其中各个文件对应blob 对象索引的tree 对象;以及一个包含指向tree 对象(根目录)的索引和其他提交信息元数据的commit 对象。


它保存着一个名为HEAD的特别指针,git通过该指针知道你当前在哪个分支上工作





初始化一个本地目录为git仓库

git init


配置git的一些常用参数,如:user.name, user.email等等

git config


从远端克隆一个仓库

git clone


查看当前仓库状态

git status


配置远端地址或者其他一些设置

git remote


想本地仓库添加文件

git add 


git仓库忽略某些文件不纳入git仓库的管理,不上传到仓库。编辑.gitignore添加文件类型

*.[oa]   忽略以.o或.a结尾的文件

*~   忽略所有以~结尾的文件。

.gitignore的格式规范如下:

  • 所有空行或者以注视符号#开头的行都会被git忽略。

  • 可以使用标准的glob模式匹配。

        glob模式是指shell所使用的简化了的正则,*匹配0或多个任意字符;[abc]匹配任何一个列在方括号中的字符;?只匹配一个任意字符;[0-9] 匹配所有0到9的数字,[a-z]a到z的所有小写字母

  • 匹配模式最后跟\说明要忽略的是目录。

  • 要忽略指定模式以外的文件或目录,可以在模式前加上!取反。



从远端仓库更新仓库内容

git pull


从把修改提交到本地仓库

git commit

git commit --amend   ---- 修改最后一次提交的信息,在提交完后发现漏掉了文件没有加,提交信息写错了,要想撤销刚才提交的操作,用该参数重新提交。



从本地仓库的更改提交到远端仓库

git push


从其他分支比如说dev分支合并到当前所在的分支,如:git merge origin/dev (加入当前分支在master)把dev分支的内容合并到master分支下。

git merge


查看提交信息, 其中的参数-p 展开显示每次提交的内容差异,-2仅显示最近的两次更新

git log


当前做的哪些更新没add到仓库,哪些更新已经add准备提交的

git diff

此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。

如果要看已经添加起来的文件和上次提交时的快照之间的差异,用git diff --cached或者git diff --staged。


git rm 

从仓库中删除文件,并且不不再纳入版本管理。


移动文件

git mv

git并不跟踪文件移动操作,对文件的改名。用其他工具进行批处理改名的话,要在提交前删除老的我呢简明,再添加新的文件名。


取消已经暂存的文件,取消工作目录中已修改的文件。可使用git status 查看当中的提示

git reset HEAD


查看当前的远程仓库

git remote -v


添加远程仓库

git remote add remote-name URL


从远程仓库抓取数据

git fetch [remote-name]


推送本地数据到远程仓库

git push remote-name branch-name


查看远程仓库信息

git remote show [remote-name]


远程仓库的删除和重命名

git remote rename remote-name remote-name-2

git remote rm remote-name



显示已有的标签

git tag


新建标签

轻量级的:就像是一个不会变化的分支,实际上它就是个指向特定提交对象的引用,保存着对应提交对象的校验和信息的文件。

含附注标签:存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件和日志,及标签说明,标签本身也允许使用GNU Privacy Guard(GPG)来签署或验证。

新建一个含附注的标签

git tag -a v1.1 -m "my version 1.1"      -a 指定标签名,-m指定了对应的标签说明。


查看标签的版本新,并联通显示打标签时的提交对象。

git show v1.1


 签署标签 使用-s选项,前提是要有自己的私钥

git tag -s v1.2 -m "my signed version 1.2 tag"


轻量级标签 啥选项都不用。

git tag v1.3



分享标签 -- 默认情况,git push不会把标签推到remote上,只有通过显式命令才能分享标签到remote 

git push origin [tagname]



GIT BRANCH


新建一个分支,并创建文件,提交到仓库,合并新分支到master

git checkout -b hotfix

touch filename

git add filename

git commit -a -m "commit a filename"

git checkout master

git merge hotfix   把hotfix分支合并到master分支

该种合并方式称为(Fast forward 快进)


遇到冲突时的分支合并

在不同的分支中都修改了同一个文件的同一部分,就只能有人来解决。可以使用

git status

来查看

任何包含未解决冲突的文件都会以未合并(unmerged)的状态列出。Git 会在有冲突的文件里加入标准的冲突解决标记,可以通过它们来手工定位并解决这些冲突。


分支的管理

git branch

分支前的* 字符:它表示当前所在的分支

查看各个分支最后一个提交对象的信息

git branch -v

从该清单中筛选出你已经(或尚未)与当前分支合并的分支,可以用--merged 和--no-merged 选项

git branch --no-merged

查看尚未合并的工作


本地分支和远程仓库分支的协同

首先从远程克隆一个分支到本地,然后在本地有更改的时候需要向远程提交的时候需要先在本地执行

git fetch origin      

先同步远程数据到本地再提交到远程



分支的衍合

一个分支中的修改整合到另一个分支中有两种办法:merge和rebase