1Git初始化
1-1git配置
- 全局配置git config –global
- 设置你的名字和email,即你在提交commit时的签名
- ~/.gitconfig文件:Git全局配置的文件
- 局部配置 git config
- 会在你的项目目录下的.git/config文件中增加[user]内容
1-2对于新建项目,这部分定制操作要在git初始化之后执行
2 acquire a repository
- clone from the existing repository
- create a new repository
2-1Clone一个仓库
git url协议
- ssh://
- http(s)://
- git://
git clone http http://github.com/shiyanlou/gitproject.git
2-2Create一个新的仓库
#进入文件夹
git init
会在相应的文件夹中创建.git的目录
3 正常的工作流程
- 创建、编辑文件
$ cd project
$ touch file1 file2 file3
- git add命令将更新的内容添加到索引中
$ echo "testcontent1" >> file1
$ echo "testcontent2" >> file2
$ echo "testcontent3" >> file3
$ git add file1 file2 file3
- 查看修改变化
$git diff --cached (查看哪些文件及内容被提交)
$git diff (显示当前你已做的但没有加入到索引里的修改)
$git status (获取当前项目的一个状况)
- 提交修改
git commit -m "put a message to commit"
#-m添加注释
git commit -a -m "put a message to commit"
#-a自动把所有内容被修改的文件(不包括新创建的文件)都添加到索引中,并且提交
完成后就会记录一个新的项目版本
4分支与合并
Git跟踪的是内容不是文件
4-1分支
一个git库可以维护很多开发分支
git branch experimental #创建分支
git branch #查看分支
git checkout experimental #转换到”experimental“分支
git merge experimental #合并分支master和experimental
- 如果两个分支没有冲突,成功合并
- 如果存在冲突,不合并; git diff 来查看冲突的文件
- 编辑完冲突文件之后,提交一下命令完成合并
git commit -a -m "put a message to commit"
git branch -d #只能删除那些已经被合并了的分支
git branch -D#强制删除某个分支
4-2解决合并中的冲突
- 如果执行自动合并没有成功,git会在索引和工作树设置一个特殊的状态,提示如何解决冲突。
4-3撤销一个合并
- 合并后修改,但是修改未提交
git reset --hard HEAD
- 合并后修改,且修改已提交
git reset --hard ORIG_HEAD
4-4快速向前合并
5git日志
5-1查看日志
git log 可以显示所有的提交
5-2日志统计
git log --stat
显示每个提交中哪个文件被修改了,分别添加或删除了多少行
5-3格式化日志
git log --pretty=oneline
5-4日志排序
git merge experimental #合并分支
5-5比较提交 git diff
git diff master..test #比较两个分支的差异
git diff master...test#比较两者共有父分支和test分支之间的差异
git diff
git diff --cached
git diff HEAD #显示你工作目录与上次提交之间的所有差别
--stat参数用来统计
git diff --stat 用来统计一下有哪些文件被改动,有多少行被改动
6 GIT对象模型
SHA
- 通过一个40字符的”对象名“来索引用来表示项目历史信息的文件, SHAI哈希计算得到值
- 好处
- git只需要比较对象名,就可以判断对象
- 不同仓库中相同的内容会存放在相同“对象名”下
- 检查对象名和内容的SHAI哈希值,盘对对象内容是否正确
对象
- 类型
- blob 类型用来存储文件数据, git show查看
- tree 有点像一个目录,用来管理一些tree和blob:git ls-tree看到更多tree的细节
- commit指向一个tree,用来标记某一个特定时间点的状态
- tag用来标记某一次提交的方法:
- 大小
- 内容
- 类型
GIT目录与工作目录
- Git目录:你的项目存储所有历史和元信息的目录, .git
- 工作目录:存储着你现在签出来用来编辑的文件
GIT索引:一个在你的工作目录和项目仓库间的暂存区
- 查看索引 git status
7分布式的工作流程
#alice 创建一个repo
#bob取得copy
git clone /home/alice/project myrepo
# bob modify it and commit
#alice pull the modification of bob
git pull /home/bob/myrepo master
git pull命令完成:
- 从远程分支抓取修改的内容
- 合并进当前分支
- 不带地址时默认从父分支中pull
git remote:
- 重命名远程分支,定义所学
git remote add bob /home/bob/myrepo
git fetch
- 从远程分支中抓取修改的内容,当并不合并进当前分支里头
git fetch bob
#查看bob远程分支对master对源的修改
git log -p master...bob/master
#上述命令把Bob从Alice的主分支中牵出后所做的修改全部显示出来
检查完修改了,合并进本地主分支中
git merge bob/master
git同时也保存了一份最初的alice主分支,在origin/master下面
git branch -r
git可以像cvs一样工作:有一个中心仓库,不同的用户向它推送所作的修改;
git push gitcvs-migration
8公共git仓库
- 告诉项目的维护者用git pull命令从你的仓库把修改抓取下来
一般的工作流程:
- 你在本地私人仓库工作
- 把修改push到公开仓库
- 把他人的修改pull到本地仓库
将修改推送到一个公共仓库
- 通过http协议或者git协议,用户维护者可以抓取修改,但是没有写权限
- 通过ssh歇息和git push来更新
- 最好把远程仓库初始化为bare仓库
- git init –bare :创建的仓库是裸仓库,只能生成一类文件:用于记录版本库历史记录的.git目录下面的文件,不包含实际项目源文件的拷贝。
- 原本在.git目录下的文件都在根目录下面,只保存git历史提交的版本信息
- git init则不同,附带的.git信息才用于记录项目历史提交的版本信息
Git标签
- 轻量级标签
- 用git tag不带任何参数来创建一个标签指定某个提交
git tag stable-1 1b2e1d63ff #stable1就成了代称
- 标签对象:可以指向任何对象,但通常是一个提交
- 标签的签名