Git 学习笔记
Feb 23, 2016一.Git 的产生
作者:林纳斯·托瓦兹 (Linus Torvalds),Linux 的伟大的副产物
Linus 在 1991 年创建了开源的 Linux 之后靠着开发者共同维护。
2002 以前 ,contributors 把源代码文件通过 diff 的方式发给 Linus,Linus 和 维护者 手工方式
merge。
维护者受不了了,Linus 选择了 BitKeeper,并且很喜欢 BitKeeper.
理查德・斯托尔曼(Richard Stallman)自由软件倡导者,精神领袖,GNU计划创造者
并且有人开始对 BitKeeper 逆向,破解,BitKeeper 收回了 Linus 的免费使用权。
Linus 不得不要写一个自己的版本控制系统:
- 1.速度优势,有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)
- 2.对非线性开发模式的强力支持(允许上千个并行开发的分支)
- 3.完全分布式
- 4.简单易用的设计,bullshit
Linus 不到两周时间, C 写了一个分布式版本控制系统,1300 行左右,之后靠 contributors 去壮大。
身世评价:
亲爹:Linus
干爹:世界各地 contributors
外表:Source Tree, TortoiseGit 等等等
内涵:这里
二. 集中式 与 分布式
集中化的版本控制系统:SVN
单一的集中管理的服务器,保存所有文件的修订版本,协同者通过客户端连到这台服务器,查看提交记录或者进行提交。checkout 的只是某个版本的代码,没有任何版本信息记录。
分布式版本控制系统:Git
客户端并不只提取最新版本的文件快照,而是把代码仓库 完整地镜像
克隆(clone) 提取(fetch) 到本地
- 1.分布式,去中心化
- 2.本地提交
- 断网提交
- 小步提交,颗粒化,跟踪代码时,更加细腻
- 不用 sever,也可以进行版本控制
- 断网提交
- 3.高速度,所以 commit,checkout 变得飞快
三. Git 结构模型
为什么要理解 Git 结构模型?
- 我 tmd 在哪?
- 我 tmd 的代码呢?
- 屏幕上的提示信息到底是 tmd 让我干嘛?
两区两库:
- Workspace:工作区,就是你在电脑里能看到的目录
- Index / Stage:暂存区,在暂存区的东西,才能 commit 到 Repository
- Repository:本地仓库
- Remote:远程仓库
六指令:
- add:增加
- commit:提交
- push:推送
- fetch:拉取
- checkout:检出
- pull:fetch + merge
四. Git 命令讲解
1.init clone
|
|
2.配置 Git
|
|
3.add, stage
从工作区
选取一些代码快照,加入到暂存区
,即将要commit
的内容
|
|
- 提问:为什么会有
暂存区
这个概念? - 快照?
4.暂存 stash
|
|
高级用法
|
|
|
|
5.commit
将暂存区
的代码快照提交
到本地仓库
|
|
高级用法
|
|
注意:这样会更改历史
6.remote
远端,即远程服务器
|
|
7.push
将本地的分支信息推向远端
|
|
|
|
8.pull
pull = fetch + merge
pull –rebase = fetch + rebase
merge 优先尝试 fast-forward 模式
|
|
9.fetch
将远程仓库新的提交的拉取到本地仓库
|
|
10.合并 merge 演合 rebase
把一个分支中的修改整合到另一个分支的办法有两种:merge
和 rebase
a.合并 merge
把指定分支 branchX 合并到当前分支,如果不进行 fast-forward 模式,就会产生新的提交点。
若有冲突发生时,新的提交点为解决冲突记录。
|
|
合并前
合并后
fast-forward 模式
b.演合 rebase
将当前分支和 branchX 产生分歧的 commit 点,重新在 branchX 演一遍。
|
|
演合之前
演合之后
注意:尽量不要对已经推送到远程仓库的分支进行演合,否则再次推送时会产生冲突。永远不要改变历史。
神奇的演合:
|
|
c.merge 和 rebase 的取舍
rebase: 保证了提交点的干净有序。
merge: 更加详细了记录了开发路线。
10.后悔药 reset revert reflog
1.reset
类似 SVN 的revert,将当前分支提交重置回某个提交点。
|
|
注意:不要对已经在远程服务器的 commit 进行 reset
2.revert
对某一次提交做一次反向操作,并且提交创建一个新提交
|
|
3.reflog
列出 HEAD 经历过的记录,神器~
|
|
五. Git 开发模型–GitFlow
1.branch
Git 分支不同于 SVN,不是对文件拷贝的副本,而是快照,使用起来非常轻量级。这使得开发中对分支的 new,merge,delete 变得非常廉价,更好的支持并发型开发。开分支,就是新建一个指针而已。
分支的查看
|
|
分支的新建
|
|
分支的切换 checkout 功能
|
|
2.GitFlow
六. 辅助利器
1.Zsh
2.GitDiff
七. 扩展
1.git config
2.git rebase -i
修改历史的一个方法,提供了重写 commit,合并 commit,更改 commit 顺序等功能。之后有时间补上这一部分。
3.cherry-pick
将一个提交点重新应用到当前分支,此时是一个新的提交号
|
|
注意:永远不要 cherry-pick 已推送到远端的 commit,否则再次推送时会产生冲突。
这句话是我错误的认知,删去。cherry-pick 的提交点再次合并回去之后,不会引起冲突。
4..gitignore
这个可以参考这个开源项目
5.alias
alias 我用的不多,因为不想太依赖这个东西,用的最频繁的就下面一个:
|
|