在git中能够为任意其余对象添加tag,包括commit,tree,blob,甚至包括tag自身。git中都是用sha-1标识git对象,这是一个40个字符长度的字符串,不方便记忆,那么可为git对象添加一个tag便于标识不一样对象。 git
# git tag tag-name sha-1 $ git tag v1.0 bdc390c2
这样便为bdc390c2的对象添加了一个tag,若是不指定sha-1,会为最近的一个commit对象添加tag 正则表达式
使用git tag命令便能查看全部tag shell
$ git tag
固然能够筛选 vim
$ git tag -l 'v1.*'
$ git tag -d <tag-name>
重命名tag有两种方式: 服务器
$ git tag -f <new-tag> <old-tag> $ git tag -d <old-tag>
建议多使用分支来维护项目,便于保证主干的稳定性。 工具
git中建立分支的方法很是简单: 测试
#git branch <branch-name> $ git branch dev
这样便从当前分支建立了一个名为dev的分支,可让此分支做为开发分支。使用checkout <branch-name>能够很方便地在分支间进行切换: spa
$ git checkout master $ git checkout dev
还能够直接使用checkout -b命令来建立分支后并切换到新的分支 指针
$ git checkout -b dev
$ git branch -rm <old-branch> <new-branch>
推送本地分支到远程服务器 日志
$ git push <remote> <branch-name>[:<remote-branch-name>]
远程分支名若是省略,则使用本地分支名做为远程分支名
$ git push <remote> <branch-name>
# 删除分支 $ git branch -d <branch-name> # 强制删除分支 $ git branch -D <branch-name>
删除远程分支
$ git push <remote> :<remote-branch-name>
这个命令是否是能够从推送本地分支到远程分支的命令中获得一点灵感?是的,省略本地分支名后,远程分支即被删除!
使用git branch命令可查看当前git版本库中全部分支:
$ git branch
查看分支
当前分支会在分支前加以星号(*)标注。
git branch -v命令将附加显示最后一次提交相关信息的分支信息
$ git branch -v # 查看已合并的分支 $ git branch --merge # 查看未合并的分支 $ git branch --no-merged
当一个分支完成预期的工做,经过测试后,即可合并到主干,做为稳定版本进行后续开发,合并分支的命令很是简单:merge branch-name
$ git merge dev
若是顺利,dev分支将自动地合并到当前分支。固然不少时候会产生冲突,这个时候就须要手动坚定冲突后再进行合并。
在git中如遇冲突,会显示冲突提示,合并会中断
conflict
此时你可使用git mergetool命令调用merge工具进行手动合并
$ git mergetool
mergetool在配置项进行配置,如下是使用vimdiff的merge操做界面
mergetool vimdiff
手动解决完冲突后,还须要进行一次提交,便完成了整个手动合并过程。
rebase亦是将分支的修改进行“合并”。但在具体行为上略有不一样,使用merge进行合并,更新部分依然会视做是从分支而来;而rebase则 是直接将更新合并到新分支,至关因而在合并分支的直接修改。若是咱们的更新是很是小,不足以做为一个分支进行合并,而且不想污染版本日志,那么即可以使用 rebase来合并更新。
在一个git版本仓库中,有时候不少文件/目录并不须要使用git进行版本维护,那么就能够将这些文件/目录加入.gitignore文件中, 在.gitignore文件中可定义要排除在git版本管理以外的文件/目录,git默认会读取项目目录下的.gitignore文件。
.gitignore使用标准的shell glob模式匹配,shell glob你能够简单地理解为一种特特殊化的正则表达式,其实要比正则表达式简单许多,语法以下:
#.gitignore example .txt .gitignore !readme.txt exclude/*.txt
该.gitignore中定义的屏蔽规则为:
屏蔽全部的txt文件,可是readme.txt例外;屏蔽全部的.gitignore文件;屏蔽exclude目录下的全部txt文件(包括readme.txt)。
另外,还能够在配置项中经过core.excludesfile来指定ignore文件。
$ git config core.excludesfile '_myignore'
git配置文件根据做用域的不一样分为三种:
git配置项都经过git config命令写入,传入不一样参数写入不一样的配置文件
$ git config --system/--global/
具体的配置项设置参考帮助文档,$ git config –help
删除配置使用unset命令
$ git config --global --unset alias.mycommand
git中包含4类对象:
git提交便产生一个commit对象,commit对象中包含一个tree对象,tree对象中又会包含其余的tree对象或是blob对 象,blob对象是最小的组成单元,即独立的文件。每一个对象都对应一个惟一的SHA-1值,只有当文件或目录有修改时这个值才会从新计算发生改变。
究竟git是如何工做的?打开.git目录即可一目了然。
HEAD文件中是形如如下代码的内容:
ref: refs/heads/dev
它指向refs/heads/dev,而dev文件中代码指向当前分支最近的commit对象
objects目录中保存有全部git对象,这些对象取sha-1值的前两个字母为一个目录,剩下的38个字符做为文件名保存,在上一节“git中 对象”中能查看到的全部git对象都保存在这个目录中,可使用git cat-file <sha-1>来获取对象内容。
$ git cat-file -p 63a46849
不妨多使用cat-file命名多看看各类对象的内容,有助于理解git对象的结构。
refs目录中保存了git中使用的全部引用或指针,由于不可能任什么时候候都是用sha-1值来指代对象,git对象也能够有“缩略名”。一般refs目录会包含如下目录:
逐一地查看这些文件内容,你就什么都明白了。使用 git update-ref 命令能够直接新建一个引用。
$ git update-ref refs/heads/test-branch c56dce $ git update-ref refs/tags/test-tag c56dce
执行上述命令,这样你的git版本库中就多了一个test-branch分支和一个名为test-tag的tag。
其余的好比git还有些底层的命令,我在文中所列举的,包括以前基础篇的都是一些高级命令。可使用这些底层命名直接对git库进行一些操做,有关git底层命名的详细内容,能够到网上去找找。