目录
什么是Git?
Git 是一个分布式版本控制系统。

在git中,每一个集群中的节点都存储了所有的数据。
git直接记录快照,而不是差异比较

Git的三种状态
已提交(commited):表示数据已经安全的保存在了本地数据库中。 已修改(modified):表示修改了文件,但是还没保存在数据库中。 已暂存(staged):表示对已修改文件的当前版本做了标记,是它包含在下次提交的快照中。
基本的Git工作流程如下:
- 在工作目录中修改文件
- 暂存文件,将文件的快照存入暂存区域
- 提交更新,找到暂存区域的文件,将快照永久性存储到Git仓库文件

Git常见配置
- 设置用户信息
git config --global user.name "yuu6"
git config --global user.email "yuhongchaou6@gmail.com"
- 查询所有的配置信息
git config --list
- 获取帮助
git help config
Git基础
获取git仓库有两种方式,一种是将现有的项目以及目录所有文件放到git中;第二种是从服务器克隆一个现有的Git仓库
- 从现有目录中初始化仓库
git init
- 克隆远程仓库
git clone URL

- 检查文件状态
git status
- 跟踪新文件
git add filename
git add 将工作目录中的文件添加到暂存区
- 查看已暂存和未暂存的修改
git diff
- 提交
git commit
每一次提交都是一次快照,以后可以回到这个状态,或者进行比较。
git commit -a
使用这个命令可以跳过暂存阶段,直接提交已经跟踪过的文件
- 移除文件
git rm
用于从跟踪文件中清除然后提交。
- 文件改名
git mv
用于对已经存在的文件更改名称
- 查看提交历史
git log
git log 可以制定特定的输出格式;可以指定当前最近一段时间的输出。
- 取消暂存文件
git reset HEAD filename
- 撤销对文件的修改
git checkout -- filename
- 查看远程仓库
git remote
- 添加远程仓库
git remote add <shortname> <url>
- 拉取远程仓库
git fetch [remote-name]
fetch 只是拉取仓库但是不合并
git pull [remote-name]
pull 拉取仓库并且合并
- 推送到远程仓库
git push [remote-name] [branch-name]
- 移除远程仓库
git remote rm [remote-name]
- 打标签
Git 使用的主要是两种标签:轻量标签和附注标签。
git tag -a v1 -m "version 1"
创建附注标签
git tag v1-lw
创建轻量级标签
Git分支
Git 仓库中有五个对象,三个blob对象(保存着文件快照),一个树对象(记录着目录结构和blob对象索引)以及一个提交对象(包含着指向前述树对象的指针和所有提交信息)。

- 分支创建
git branch branchname
创建分支实际就是在提交对象上创建一个指针。
HEAD 指针指向当前所在的分支。

git log --oneline --decorate
这个命令可以查看当前分支所指向的对象。
- 分支切换
git checkout branchname
使用checkout命令可以切换分支,深层次理解就是checkout命令可以移动HEAD指针,并且将当前工作目录恢复成master分支的内容。
- 分支合并
git merge branchname
分支合并有两种情况,一种只是简单的移动指针;另一种需要手动解决冲突,然后提交。


git status
使用git status 可以查看有哪些因包含合并冲突而处于未合并的状态的文件。
- 查看分支
git branch
- 远程分支
远程跟踪分支是远程分支状态的引用。它们是你不能移动的本地引用,当你做任何网络通信的操作时,他们会自动移动。远程跟踪分支像是你上次连接到远程仓库时,那些分支所处状态的书签。
git fetch remotedb
- 拉取
当git fetch 命令从服务器抓取本地没有的数据时,它并不会修改工作目录中的内容,它只会获取数据然后让你自己合并,然而还有一个git pull 在大多数情况下它的含义是git fetch 紧接着一个git merge 命令。
Git 合并
Git 合并主要有两种方法:merge 以及 rebase.

- merge
整合分支最简单的就是merge命令,它会把两个分支(c3 和 c4)的最新快照以及二者最近的共同祖先( c2 )进行三方合并,合并的结果时生产一个最新的快照(并提交)。

- rebase 提取在C4中引入的补丁和修改,然后在C3的基础上在应用一次,在Git中,这种操作就叫做变基。
git checkout experiment
git rebase master
--这一步就是将experiment的变化量在master上应用
git checkout master
git merge experiment