Git分享
#1 神马是Git
Git是一种分布式版本控制系统(Distributed Version Control System,DMCS).在这类系统中,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这样,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
我们可以指定远端代码仓库进行交互。比如Github、Gitlab。
#2 Basic
几个特点:
-
直接记录快照,而非差异比较
Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流。
-
近乎所有操作都在本地执行
-
保证完整性
Git 中所有数据在存储前都计算校验和,然后以校验和来引用。 Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。
!!! 三种状态
Git 有三种状态,你的文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。 已提交表示数据已经安全的保存在本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
由此引入 Git 项目的三个工作区域的概念:Git 仓库、工作目录以及暂存区域。
基本的Git工作流程如下:
- 在工作目录中修改文件
- 暂存文件,将文件的快照放入暂存区域
- 提交更新,找到暂存区域的文件,将快照永久性的存储到Git仓库
Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作“索引”,不过一般说法还是叫暂存区域。
如果 Git 目录中保存着的特定版本文件,就属于已提交状态。 如果作了修改并已放入暂存区域,就属于已暂存状态。 如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。
#3 通过命令行使用Git
配置
//配置用户信息
$ git config --global user.name "Gui"
$ git config --global user.email gengguitong@xiaomi.com
//检查配置
$ git config --list
获取Git仓库(repository)
-
现有目录初始化
$ git init
-
克隆已有的仓库
$ git clone http://git.n.xiaomi.com/liyunfan/webapp.git //支持多种数据传输协议
检查当前文件状态
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
文件的状态变化:
跟踪新文件
$ git add README
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
暂存已修改文件
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
要暂存这次更新,需要运行 git add
命令。 这是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 将这个命令理解为“添加内容到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。
$ git add CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: CONTRIBUTING.md
此时更新已等待提交到仓库。
如果此时我们又修改了该文件,需要再次使git add
命令将更新暂存。否则,提交的将是上一个修改后的版本。
查看已暂存和未暂存的修改
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
如果修改了README和CONTRIBUTING.md文件,并且只暂存了README文件。
查看尚未暂存的文件做了哪些修改:
$ git diff
//已修改的文件同暂存区中的文件比较
查看已暂存的文件做了哪些修改:
$ git diff --staged
//暂存区的文件同仓库中的文件比较
提交更新
$ git commit -m 'update'
跳过使用暂存区域
$ git commit -a
Git会把所已经跟踪的文件暂存起来并提交。跳过了git add步骤。
移除文件
$ git rm //取消跟踪,并删除工作目录中的文件
$ git rm --cached //取消跟踪,保留工作目录中的文件
移动文件
$ git mv file_from file_to
#4 回到过去
查看提交历史
$ git log
-p
:显示每次提交的内容差异,也可以加上-2
显示近两次的提交。
--stat
:显示每次提交的简略的统计信息。
--pretty
: 自定义显示内容及格式。—> 参考链接
撤销操作
-
重新提交
$ git commit --amend
-
取消暂存的文件
$ git reset HEAD <file>
-
撤销对文件的修改
$ git checkout -- <file>
-
版本回滚
$ git reset –hard head^ $ git redet –hard
#5 远程仓库
远程仓库就是托管在因特网或其它网络中你的项目的版本库。
查看远程仓库
$ git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)
查看更多信息:
$ git remote show origin
* remote origin
Fetch URL: https://github.com/schacon/ticgit
Push URL: https://github.com/schacon/ticgit
HEAD branch: master
Remote branches:
master tracked
dev-branch tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
添加/移除/重命名远程仓库
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)
pb https://github.com/paulboone/ticgit (fetch)
pb https://github.com/paulboone/ticgit (push)
$ git fetch pb
//...
$ git remote rename pb paul
$ git remote rm paul
从远程仓库中抓取与拉取
$ git fetch [remote-name]
//访问远程仓库,拉取所有你没有的数据,并不会自动合并
$ git pull
//自动抓取然后合并
推送到远程仓库
$ git push [remote-name] [branch-name]
当有其它人先于你提交时,必须先将他们的版本拉取下来合并后才能推送。
#6 Github Flow
- Create a branch
- Add commits
- Open a Pull Request
- Discuss and review your code
- Deploy
- Merge
#7 Git分支
敬请期待…
2016.09.04