好好学习一下Git, 之前都是可视化界面操作的学了才知道,还是指令方便啊。
官方文档 写得非常好,受益匪浅.. 就是书太厚啊啊
还在整理,边试边记在整理 慢慢来 ..
Git的基本工作流
Git仓库 用来保存项目的元数据和对象数据库的地方。
工作目录 本地的工作目录。
暂存区域一个“索引”文件,保存了下次讲提交的文件列表信息。
基本的 Git 工作流程如下:
1. 在工作目录中修改文件。
2. 暂存文件,将文件的快照放入暂存区域。
3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
文件的四种状态:
1. untracked 未追踪
2. unmodified 未修改
3. modified 已修改
4. staged 已暂存
Git配置
初始化 $ git init
用户信息姓名 $ git config --global user.name "Aloe"
用户信息邮箱 $ git config --global user.email llh@betahouse.us
检查配置信息 $ git config --list
和 git config <key>
获取帮助
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
仓库基础操作
$ git add <file>
1.将未追踪文件添加为追踪文件并至暂存区域
2.将已修改文件添加至暂存区域
3.合并时把有冲突的文件标记为已解决状态
提交至仓库
$ git commit -m 'initial project version'
跳过暂存区域提交至仓库
$ git commit -a
克隆已有仓库
$ git clone [url]
克隆已有仓库,并更改本地仓库名
$ git clone [url] [repositiry-name]
检查状态
$ git status
检查状态 紧凑格式
$ git status -s|--short
$ git status -s
M README 右M修改过的文件未暂存
MM Rakefile 暂存区域后又有修改并未刷新暂存区
A lib/git.rb A暂存区域文件(staged)
M lib/simplegit.rb 左M修改了并以暂存
?? LICENSE.txt ??未追踪文件
忽略文件
$ cat .gitignore
*.[oa]
*~
(glob 模式) (要外链)
查看修改
未暂存 $ git diff
,即当前工作目录下该文件与暂存区域中快照的比较
已暂存$git diff --staged|cached
git diff 使用插件
$ git difftool --tool-help 查看你支持哪些插件
$ git difftool --tool=vimdiff
移除文件
可以glob匹配模式
彻底移除 $ git rm <file>
强制彻底移除 $ git rm -f <file>
, 若有修改并已换存
移除追踪,保留文件 $ git rm --cached <file>
移动文件
$ git mv file_from file_to
标签
列出标签 $ git tag
$ git tag -l 'v1.8.5*'
创建附注标签 $ git tag -a v1.4 -m 'my version 1.4'
查看 $ git show v1.4
创建轻量标签 $ git tag v1.4-lw
查看 $ git show v1.4-lw
对过去的提交打标签 $ git tag -a v1.2 9cgeb02
需要提交当此的校验和
共享标签 (git push不会推标签到远程服务器)
$ git push [remote-name] [tag-name] 单个标签
$ git push [remote-name] --tags 全部标签
检出标签 ?
查看历史
$ git log // 上新下旧
-p
每次提交内容的差异。-p -2
仅显示最近两次。
--stat
简略的统计信息。
--shortstat
只显示 –stat 中最后的行数修改添加移除统计。
--name-only
仅在提交信息后显示已修改的文件清单。
--name-status
显示新增、修改、删除的文件清单。
--abbrev-commit
仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
--relative-date
使用较短的相对时间显示(比如,“2 weeks ago”)。
--graph
显示 ASCII 图形表示的分支合并历史。
--pretty
使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。
-(n)
仅显示最近的 n 条提交
--since
,--after
仅显示指定时间之后的提交。$ git log --since=2.weeks
--until
, --before
仅显示指定时间之前的提交。
--author
仅显示指定作者相关的提交。
--committer
仅显示指定提交者相关的提交。
--grep
显示提交说明中含指定关键字的提交,同时满足两个必须用--all -match
-S
仅显示添加或移除了某个关键字的提交
撤销操作
重置上一次提交commit $ git commit --amend
取消暂存文件 $ git reset HEAD <file>
撤销对文件的修改 $ git checkout -- <file>
分支
低效版本控制系统分支通常需要完全创建一个源代码目录的备份;
Git的分支本质上仅仅是指向提交对象的可变指针HEAD,默认分支master。
提交对象(Commit Object)指向暂存内容规定快找,包涵作者的姓名邮箱、提交时输入的信息、指向它父对象的指针。
首次提交对象及其树结构
提交对象及其父对象 ‘ Snapshot快照 ’
分支创建 $ git branch <branch-name>
创建了一个可移动的新指针在当前提交对象上
分支切换 $ git checkout <branch-name>
即改变 HEAD指针的指向
分支创建并切换到新分支 $ git checkout -b <branch-name>
合并到master分支 (合并有merge
指令和rebase
指令)
$ git checkout master
$ git merge hotfix
merge指令合并分支会找最优的共同祖先做简单的三方合并.
合并后可能不止一个父提交.
查看冲突文件(未合并状态) $ git status
可视化合并工具 $ git mergetool
删除分支 $ git branch -d <branch-name>
强制删除分支 $ git branch -D <branch-name>
查看分支列表 $ git branch
*未Head所指
查看各个分支当前所指向的对象 $ git log --decorate
查看各个分支的最后一次提交 $ git branch -v
查看已合并到当前分支的分支 $ git branch --merged
查看未合并到当前分支的分支 $ git branch --no-merged
查看历史提交、各个分支的指向以及项目分支分叉的情况 $ git log --online --decorate --grapg --all
远程仓库
远程仓库默认名:origin
查看已配置的远程仓库 $ git remote
查看已配置的远程仓库的简写和url $ git remote -v
添加远程仓库 $ git remote add <shortname> <url>
shortname仓库的简写
从远程仓库中抓取与拉取
$ git fetch [remote-name] 会抓取上一次抓取后新推送的所有工作*
$ git clone
$ git pull
推送到远程仓库 $ git push [remote-name] [branch-name]
查看远程仓库 $ git remote show [remote-name]
远程仓库重命名 $ git remote rename [old-name] [new-name]
远程仓库的移除 $ git remote rm [remote-name]
远程分支
()
Git的校验机制
Git 用以计算校验和的机制叫做 SHA-1 散列,由40个十六进制字符串组成。
[具体校验原理]
版本控制系统
本地化版本控制系统 RCS
集中化版本控制系统 CVS、Subversion、Perforce
分布式版本控制系统 Git、Mercurial、Bazaar、Darcs
涉及点:
1. 版本控制系统对待数据的方法: 分布式直接纪录快照、集中化纪录差异
2. 克隆操作:分布式是对代码仓库的完整备份、集中化提取最新版本文件快照