起步
原理
git使用的是一种分布式的版本控制结构,通过记录文件快照来实现。
运行前配置
用户信息(必须)
参数 | 说明 | 文件目录 |
---|---|---|
git config --system | 对应系统的所有用户的配置 | /etc/gitconfig 文件 |
git config --global | 用户目录下的配置 | ~/.gitconfig |
git config | 当前git目录的配置 | . |
git config --global user.name "shuihan"
git config --global user.email lxq_xsyu@163.com
用户名称和电子邮箱,git每次提交的时候都会引用这两条信息,说明是谁提交了代码。
默认编辑器
git config --global core.editor emacs
差异分析工具
git config --global merge.tool vimdiff
查看配置信息
git config --list
获取帮助
git help <verb>
例如,config 命令可以使用 git help config
基础
获取仓库
创建新仓库: git init
初始化后,当前目录下就会多出一个.git的目录,所有git需要的数据和资源都存放在这个目录中。
git add *.java
git commit -m "init project"
克隆仓库: git clone
git clone git://github.com/test/gittest.git
这样默认目录会是gittest,如果要更改目录名称可以追加在后面。
git clone git://github.com/test/gittest.git newname
检查文件状态
git status
查看文件变化
暂存前: git diff
暂存后: git diff --cached
跳过暂存区 -a
git commit -a -m "跳过暂存区提交"
移除文件
git rm
文件名
如果只想删除仓库中的文件(也会从暂存区移除)但任然保留工作区文件,可以使用 git rm –cached 文件名(比如删除不小心纳入仓库的需要忽略的文件)
移动文件
git mv file_from file_to
查看提交历史
git log
git log
有许多可选项帮助搜寻感兴趣的提交:
显式文件提交的内容差异: git log -p -2
//-2表示仅仅显式最近的两次更新
显式文件提交的内容差异(单词层面比较):git log -p -word-diff -2
修改最后一次提交
有时候我们提交完了,但是发现漏掉了几个文件,或者提交信息写错了,想要撤销刚才的提交,可以使用–amend 追加提交暂存区
git commit --amend
取消暂存的文件
git reset HEAD 暂存区文件名
取消对文件的修改
git checkout -- 已经修改的文件名
查看远程仓库
git remote -v
添加远程仓库
git remote add
[shortname] [url]
$ git remote
orign
$ git remote add pb git://github.com/pp/ppt.git
$ git remote -v
orgin git://github.com/test/gittest.git
pb git://github.com/pp/ppt.git
此时,本地仓库没有pb的信息,可以使用 git fetch pb
修改远程仓库
git remote set-url
[shortname] [url]
$ git remote rm origin
$ git remote add origin https://gitee.com/jouypub/json.git
从远程仓库抓取数据
git fetch
[remote-name]
推送数据到远程仓库
git push origin master
查看远程仓库信息
git remote show origin
远程仓库删除和重命名
$ git remote rename pb paul
$ git remote
orgin
paul
删除远程仓库可以使用 git remote rm
$ git remote rm paul
$ git remote
orgin
打标签
显示已有标签
git tag
可以使用通配符检索
git tag -l 'v1.2.*'
新建标签
git使用的标签有两种:轻量级的和含附注的。
创建轻量级标签:
git tag v1.3.1
创建一个含附注的标签,用 -a
$ git tag -a v1.3.0 -m "这是版本1.3.0"
可以使用show命令查看相应标签的版本信息: git show v1.3.0
分享标签
默认情况下,git push 并不能把标签传送到服务器,要使用命令:git push origin [tagname]
$ git push origin v1.3.0
如果要把本地所有标签传送上去,可以使用 –tags
$ git push origin --tags
分支
分支的理解
假设此时我们的工作目录有三个文件,把它们暂存后提交。
第一步:暂存 git使用blob类型的对象存储了这些快照
第二步:提交
git add *
git commit -m "commit three files"
此时git仓库中有5个对象(三个文件快照内容的blob对象,一个记录着目录树内容及其各个文件对应blob对象索引的tree对象,一个指向tree对象的索引和其他提交信息数据的commit对象)
第三步:多做几次修改再提交 后一次提交的commit对象会指向前一次提交的commit对象
git中的分支实际上仅仅是一个指向commit对象的可变指针,git会使用master为分支的默认名字,每次提交后master(当前分支)都会自动向前移动。
第四步:创建一个新分支
$ git branch testing
那么git是如何知道你在哪个分支上工作呢?它保留着一个名为HEAD的特别指针。
第五步:切换分支
$ git checkout testing
这样HEAD就指向了testing分支。
分支合并
使用命令 git merge 来合并分支
Git分支和目录树
$ git checkout master
$ git merge hotfix
Fast-forward
合并的时候出现了"Fast-forward"提示,因为此时只需要简单的将指针右移,这种合并称为快进(Fast Forward)
再来看一种情况:
Git分支和目录树
$ git checkout master
$ git merge iss53
这种情况不可能简单的右移指针,会自动创建一个指向它的commit对象(如下图c6),如果有冲突需要合并冲突。
Git分支和目录树
分支管理
git branch
命令可以列出当前所有分支清单, 当前分支带 *
号
$ git branch
* master
work
查看各个分支最后一个提交对象的信息: git branch -v
删除本地分支 git branch -d <branch-name>
删除远程分支 git push <remote-name> --delete <branch-name>
$ git branch -d work
$ git push origin --delete work
工作流程
Git flow
该流程中项目存在两个长期分支。
主分支: master (存放对外发布的版本,任何时候在这个分支拿到的,都是稳定的分布版) 开发分支: develop (用于日常开发,存放最新的开发版)
其次,项目存在三种短期分支。
功能分支(feature branch) 补丁分支(hotfix branch) 预发分支(release branch)
一旦完成开发,它们就会被合并进develop或master,然后被删除。
关于Git的工作流其他请阅读 阮一峰 的博客,总结的很详细