Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
654 commits
Select commit Hold shift + click to select a range
2ef10c8
Merge branch 'master' of https://github.com/Snailclimb/Java_Guide
Snailclimb Feb 21, 2019
29b9857
Merge pull request #155 from jerryldh/patch-1
Snailclimb Feb 21, 2019
3748061
Merge pull request #153 from Flyonsnow/master
Snailclimb Feb 21, 2019
4f43d28
Merge pull request #151 from fanofxiaofeng/patch-4
Snailclimb Feb 21, 2019
10c72c1
Merge pull request #149 from maokegithub/patch-4
Snailclimb Feb 21, 2019
7bef9e4
ADD:待办事件
Snailclimb Feb 21, 2019
3d1cfcf
Update Java基础知识.md
Snailclimb Feb 21, 2019
3d4edde
Update Java基础知识.md
Snailclimb Feb 21, 2019
c2d24e8
UPDATE:待办事件
Snailclimb Feb 21, 2019
455041d
Add:BIO,NIO,AIO 总结
Snailclimb Feb 21, 2019
bdf8aa5
Update BIO,NIO,AIO summary.md
Snailclimb Feb 21, 2019
41a4fdf
Merge branch 'master' of https://github.com/Snailclimb/Java_Guide
Snailclimb Feb 21, 2019
4433a4b
Update BATJ都爱问的多线程面试题.md
MckayRen Feb 21, 2019
46429c7
HTTPS中的TLS
LiWenGu Feb 21, 2019
d40d121
Update BIO,NIO,AIO summary.md
Snailclimb Feb 22, 2019
44acccc
Update BIO,NIO,AIO summary.md
Snailclimb Feb 22, 2019
40f1838
servlet 自动刷新
Feb 23, 2019
aca7d24
在grow()中,对hugeCapacity()方法的解释错误
Feb 23, 2019
bfb0475
Revert "在grow()中,对hugeCapacity()方法的解释错误"
Feb 23, 2019
e62ee07
修改扩容(grow)部分,对于hugeCapacity()方法的解释
Feb 23, 2019
ebef8b3
Merge pull request #159 from fantasygg/wk-branch
Snailclimb Feb 23, 2019
cd7ca3f
Merge pull request #157 from LiWenGu/master
Snailclimb Feb 23, 2019
d6ca057
Merge pull request #156 from MckayRen/master
Snailclimb Feb 23, 2019
49148a3
Add:HTTPS中的TLS
Snailclimb Feb 23, 2019
f0d2b98
Merge pull request #160 from fantasygg/Arraylist
Snailclimb Feb 23, 2019
c36aea9
Update README.md
Snailclimb Feb 26, 2019
96e4063
Fix:错别字
Snailclimb Feb 26, 2019
15e7eb7
Update J2EE基础知识.md
Snailclimb Feb 26, 2019
0e9ed08
Fix:描述错误
Snailclimb Feb 26, 2019
d85f369
Update:get和post区别?
Snailclimb Feb 26, 2019
10fbec0
Update HashMap.md
Snailclimb Feb 26, 2019
08eb3c0
Update Java基础知识.md
Snailclimb Feb 26, 2019
70f7e64
Update:我的微信
Snailclimb Feb 27, 2019
10686c9
Add:Java并发编程专栏限时优惠
Snailclimb Feb 27, 2019
6d7f37f
Update README.md
Snailclimb Feb 27, 2019
534c942
Update README.md
Snailclimb Feb 27, 2019
3c51ae2
更新错别字
SpaceOneT Feb 27, 2019
26b2043
fix AQS.md->CyclicBarrier 的使用示例demo程序示例错误
Feb 27, 2019
073c538
Update README.md
Snailclimb Feb 27, 2019
c3623c2
Update 并发容器总结.md
rongxuning Feb 27, 2019
62828f0
Update 并发容器总结.md
rongxuning Feb 27, 2019
f9e193c
Update Java基础知识.md
Snailclimb Feb 28, 2019
db1c987
Update README.md
Snailclimb Mar 1, 2019
072d8d2
Update 这几道Java集合框架面试题几乎必问.md
lixd Mar 1, 2019
81d2f39
Update Java集合框架常见面试题总结.md
lixd Mar 1, 2019
b65a3d0
Update ArrayList.md
lixd Mar 1, 2019
41177d8
Merge pull request #181 from illusorycloud/patch-6
Snailclimb Mar 2, 2019
f2fac30
Merge pull request #180 from illusorycloud/patch-5
Snailclimb Mar 2, 2019
e5925b5
Merge pull request #179 from illusorycloud/patch-4
Snailclimb Mar 2, 2019
6197be8
最长公共前缀题目,增加异常输入检查
keepal7 Mar 2, 2019
4aec317
Add contributors
Snailclimb Mar 3, 2019
1b794b5
Fix link error
Snailclimb Mar 3, 2019
95bbee0
Add Contributor
Snailclimb Mar 3, 2019
037a280
Update format
Snailclimb Mar 3, 2019
6cb32db
Update README.md
Snailclimb Mar 3, 2019
2f91aed
Update README.md
Snailclimb Mar 3, 2019
bcc5a8c
Update README.md
Snailclimb Mar 3, 2019
a1ac5a7
Delete static.md
Snailclimb Mar 3, 2019
d456643
Update final、static、this、super.md
Snailclimb Mar 3, 2019
31e27d3
Add 目录
Snailclimb Mar 3, 2019
c79942f
Update README.md
Snailclimb Mar 3, 2019
d6ede9d
Update README.md
Snailclimb Mar 3, 2019
fb69c8c
Update README.md
Snailclimb Mar 3, 2019
8553b0b
Update README.md
Snailclimb Mar 3, 2019
be1f00a
Delete 美团-基础篇.md
Snailclimb Mar 3, 2019
539028b
Delete 美团-终结篇.md
Snailclimb Mar 3, 2019
db9e98f
Delete 美团-进阶篇.md
Snailclimb Mar 3, 2019
3a99798
Create 美团面试常见问题总结.md
Snailclimb Mar 3, 2019
7deb559
Update README.md
Snailclimb Mar 3, 2019
ad57405
Update 备战春招/秋招->备战面试
Snailclimb Mar 3, 2019
9c7ab2d
Fix 标题格式错误导致目录链接失效
Snailclimb Mar 3, 2019
9cfb647
Fix 目录问题
Snailclimb Mar 3, 2019
bf96c8a
Update README.md
Snailclimb Mar 3, 2019
3c17922
Update README.md
Snailclimb Mar 3, 2019
f56c73b
修复格式问题
Silverados Mar 3, 2019
89b0adb
更正拼写错误
rustin-bot Mar 4, 2019
c769307
fix typo
Camork Mar 4, 2019
06c726d
FIX: 修复错误描述
Mar 4, 2019
1f94967
Update README.md
Snailclimb Mar 4, 2019
539e685
Update README.md
Snailclimb Mar 4, 2019
4540f90
Update README.md
Snailclimb Mar 5, 2019
aa8387b
Update README.md
Snailclimb Mar 5, 2019
57b4d85
Delete 2018 summary.md
Snailclimb Mar 5, 2019
5d72b7a
Delete 2018 秋招.md
Snailclimb Mar 5, 2019
512a319
Delete 选择技术方向都要考虑哪些因素.md
Snailclimb Mar 5, 2019
9faef98
Delete 个人阅读书籍清单.md
Snailclimb Mar 5, 2019
a06e6d5
Create 2018 summary.md
Snailclimb Mar 5, 2019
46521dd
Create 2018 秋招.md
Snailclimb Mar 5, 2019
4f9034a
Create 2018-12.md
Snailclimb Mar 5, 2019
df20c96
Create 2019-1.md
Snailclimb Mar 5, 2019
53f9754
Create 2019-2.md
Snailclimb Mar 5, 2019
e63d58f
Create JavaGithubTrending.md
Snailclimb Mar 5, 2019
cf17868
Create 个人阅读书籍清单.md
Snailclimb Mar 5, 2019
9666998
Create 选择技术方向都要考虑哪些因素.md
Snailclimb Mar 5, 2019
1eb8772
Update README.md
Snailclimb Mar 5, 2019
cb8d1ab
Create JavaProgrammerNeedKnow.md
Snailclimb Mar 5, 2019
01dceb1
Delete java programmer need know.md
Snailclimb Mar 5, 2019
efe8d47
Update README.md
Snailclimb Mar 5, 2019
a37eec4
Update README.md
Snailclimb Mar 5, 2019
8f1c6a1
Update JavaGithubTrending.md
Snailclimb Mar 5, 2019
6530fa5
Merge pull request #188 from SilentTTxo/master
Snailclimb Mar 5, 2019
a889878
Merge pull request #187 from Camork/patch-1
Snailclimb Mar 5, 2019
0f34178
Merge pull request #186 from show-rosarugosa/master
Snailclimb Mar 5, 2019
98188bb
Merge pull request #185 from Silverados/patch-6
Snailclimb Mar 5, 2019
371ad60
Merge pull request #183 from keepal7/master
Snailclimb Mar 5, 2019
693208b
Merge pull request #177 from IceDarron/master
Snailclimb Mar 5, 2019
bd68fe6
Merge pull request #176 from GongFuBoy/master
Snailclimb Mar 5, 2019
bfec1e5
Merge pull request #174 from mxsm/patch-1
Snailclimb Mar 5, 2019
9f1fcc2
Update LinkedList.md
Snailclimb Mar 5, 2019
ddbb405
Update Java基础知识->异常处理
Snailclimb Mar 5, 2019
940982e
Add 设计模式->目录
Snailclimb Mar 5, 2019
27c9cc2
Update 设计模式改版与内容完善
Snailclimb Mar 5, 2019
17c6db9
Merge branch 'master' of https://github.com/Snailclimb/Java_Guide
Snailclimb Mar 5, 2019
ac8281c
Update README.md
Snailclimb Mar 5, 2019
f96aaa0
Update README.md
Snailclimb Mar 5, 2019
24b1842
Update Atomic.md
Snailclimb Mar 5, 2019
0df0d81
Fix 错别字
Snailclimb Mar 5, 2019
55f795e
Update Java基础知识->异常处理
Snailclimb Mar 5, 2019
eef1a51
fix topic类型通配符号说明错误
forsweet Mar 6, 2019
ff4e445
Update Java内存区域图片
Snailclimb Mar 6, 2019
d3bb1ff
Update Java内存区域图片
Snailclimb Mar 6, 2019
09ef847
Add QQ群
Snailclimb Mar 6, 2019
8e6c799
Update:QQ群
Snailclimb Mar 6, 2019
7368e2f
Update 线程有哪些状态?
Snailclimb Mar 7, 2019
893f4a5
Update README.md
Snailclimb Mar 7, 2019
47a005c
Update README.md
Snailclimb Mar 8, 2019
0701ac2
Create 第一周(2018-8-7).md
Snailclimb Mar 8, 2019
ea129c1
Create 第二周(2018-8-13).md
Snailclimb Mar 8, 2019
bc4cec7
Create 第四周(2018-8-30).md
Snailclimb Mar 8, 2019
5a62e90
Delete 第一周(2018-8-7).md
Snailclimb Mar 8, 2019
04f1119
Delete 第二周(2018-8-13).md
Snailclimb Mar 8, 2019
11dea93
Delete 第四周(2018-8-30).md
Snailclimb Mar 8, 2019
6315858
Merge branch 'master' of https://github.com/Snailclimb/Java_Guide
Snailclimb Mar 8, 2019
a79c561
Update change file name
Snailclimb Mar 8, 2019
d62a018
Update change file name
Snailclimb Mar 8, 2019
75ee47e
Update link
Snailclimb Mar 8, 2019
564a90c
Update Modify file name and directory address
Snailclimb Mar 8, 2019
40752e1
Update README.md
Snailclimb Mar 8, 2019
f678acc
Merge branch 'master' of https://github.com/Snailclimb/Java_Guide
Snailclimb Mar 8, 2019
a51182b
Update directory error
Snailclimb Mar 8, 2019
8923dd0
Update directory
Snailclimb Mar 8, 2019
852bf52
Create 5面阿里,终获offer.md
Snailclimb Mar 8, 2019
5814035
Update 5面阿里,终获offer.md
Snailclimb Mar 8, 2019
519ff15
Add BATJ真实面经:5面阿里,终获offer
Snailclimb Mar 8, 2019
aec4e80
Update 5面阿里,终获offer.md
Snailclimb Mar 8, 2019
9dc44e6
Update README.md
Snailclimb Mar 9, 2019
5561a8d
Merge pull request #193 from forsweet/patch-1
Snailclimb Mar 9, 2019
f2d155e
Merge pull request #1 from Snailclimb/master
haiqiangJ Mar 10, 2019
f1d9128
fix grow()方法描述不够严谨
haiqiangJ Mar 10, 2019
89f31e1
Update file name
Snailclimb Mar 10, 2019
4fa3766
Update link
Snailclimb Mar 10, 2019
d49e98a
Fix link error
Snailclimb Mar 10, 2019
64bd23e
Update README.md
Snailclimb Mar 10, 2019
8273f93
Merge branch 'master' of https://github.com/Snailclimb/Java_Guide
Snailclimb Mar 10, 2019
67f4458
Update link error
Snailclimb Mar 10, 2019
5053edc
0.0.1 Snapshot
haiqiangJ Mar 10, 2019
2b20463
Create Lambda表达式.md
haiqiangJ Mar 10, 2019
d1c564b
Update README.md
haiqiangJ Mar 10, 2019
cfbc8c4
Create JDK8接口规范.md
haiqiangJ Mar 10, 2019
2fa0457
Update Lambda表达式.md
haiqiangJ Mar 10, 2019
e929c8b
Update Lambda表达式.md
haiqiangJ Mar 10, 2019
3614719
Update Lambda表达式.md
haiqiangJ Mar 10, 2019
38e568c
Update Lambda表达式.md
haiqiangJ Mar 10, 2019
a771278
Create 方法引用.md
haiqiangJ Mar 10, 2019
8213bea
Create 如果面试官问你“你有什么问题问我吗?”时,你该如何回答.md
Snailclimb Mar 11, 2019
0db3c44
Merge branch 'master' of https://github.com/Snailclimb/Java_Guide
Snailclimb Mar 11, 2019
ab1e546
Add 如果面试官问你“你有什么问题问我吗?”时,你该如何回答
Snailclimb Mar 11, 2019
311b0bd
Update JDK8接口规范.md
haiqiangJ Mar 11, 2019
2d59232
Update ArrayList-Grow.md
haiqiangJ Mar 11, 2019
b68c5ee
Merge pull request #3 from Snailclimb/master
haiqiangJ Mar 11, 2019
c336e45
Update
haiqiangJ Mar 11, 2019
7025761
Update Lambda表达式.md
haiqiangJ Mar 11, 2019
72050e6
Rename JDK8接口规范.md to JDK8接口规范-静态、默认方法.md
haiqiangJ Mar 11, 2019
98a085c
JDK8 Lambda表达式
haiqiangJ Mar 11, 2019
bcb8ba3
Delete 方法引用.md
haiqiangJ Mar 11, 2019
89e2be2
Update Redis.md
pengchen211 Mar 11, 2019
a42ef71
Merge pull request #202 from Goose9527/master
Snailclimb Mar 12, 2019
9e07a4c
删除多余:
xtyangzheng Mar 12, 2019
29cf2d2
错别字修改
fanofxiaofeng Mar 12, 2019
056b37e
添加// 注释
xtyangzheng Mar 12, 2019
3731f4d
Create Java8Tutorial.md
Snailclimb Mar 12, 2019
51a958d
Update ToDoList
Snailclimb Mar 12, 2019
3147125
Update category
Snailclimb Mar 12, 2019
f432ca6
Update Java8Tutorial.md
Snailclimb Mar 12, 2019
2f846de
Add Java8新特性总结
Snailclimb Mar 12, 2019
16987cf
Add category
Snailclimb Mar 12, 2019
5e796c1
Update Java8Tutorial.md
Snailclimb Mar 12, 2019
2d8be9a
看起来像是拼写错误
fanofxiaofeng Mar 12, 2019
e6d6276
Merge pull request #206 from fanofxiaofeng/patch-5
Snailclimb Mar 12, 2019
5ff3b52
Merge pull request #205 from yangZ5/master
Snailclimb Mar 12, 2019
6eff5db
Merge pull request #204 from fanofxiaofeng/patch-4
Snailclimb Mar 12, 2019
80611bd
Merge pull request #201 from pengchen211/patch-1
Snailclimb Mar 12, 2019
5fd6855
Add a contributor
Snailclimb Mar 12, 2019
46901e5
Update README.md
haiqiangJ Mar 12, 2019
dfa0772
Create 改进的类型推断.md
haiqiangJ Mar 12, 2019
954966a
Create 通过反射获得方法的参数信息.md
haiqiangJ Mar 12, 2019
27b4a0e
Add SpecialSponsors
Snailclimb Mar 13, 2019
cba052b
Update text location
Snailclimb Mar 13, 2019
7d04164
Update logo
Snailclimb Mar 13, 2019
84237c1
Merge pull request #208 from Goose9527/master
Snailclimb Mar 13, 2019
4276462
Update error link
Snailclimb Mar 14, 2019
dfe3358
Update 计算机网络.md
lixd Mar 15, 2019
a224baf
Fix link-error
Snailclimb Mar 15, 2019
ab26995
Update Java虚拟机(jvm).md
Snailclimb Mar 15, 2019
434962e
Merge pull request #213 from illusorycloud/patch-7
Snailclimb Mar 15, 2019
849345f
Add RabbitMQ 和 Erlang 的版本关系
Snailclimb Mar 15, 2019
38d5c50
Fix link-error
Snailclimb Mar 16, 2019
35f7339
Add 从零开始学架构
Snailclimb Mar 16, 2019
bcb14bb
Update 从零开始学架构
Snailclimb Mar 16, 2019
1f96983
Create 一千行MySQL命令.md
Snailclimb Mar 18, 2019
109db3a
Update 一千行MySQL命令.md
Snailclimb Mar 18, 2019
daf9c5f
Add一千行MySQL命令
Snailclimb Mar 18, 2019
48f982a
Add 目录
Snailclimb Mar 18, 2019
a0e23e0
貌似单词有点错误
fanofxiaofeng Mar 18, 2019
cfd5ab8
似乎是标点打错了
fanofxiaofeng Mar 18, 2019
2553b47
Add 深入拆解Java虚拟机
Snailclimb Mar 18, 2019
f08f1e5
Update 深入拆解虚拟机
Snailclimb Mar 18, 2019
81b7848
Update README.md
Snailclimb Mar 18, 2019
e145611
Update ArrayList-Grow.md
xinyun7 Mar 19, 2019
2f5d45b
Update ArrayList-Grow.md
xinyun7 Mar 19, 2019
d76938c
Update Shell.md
lixd Mar 19, 2019
8a8fcb9
Update 方法区+堆
Snailclimb Mar 19, 2019
657e749
Update 堆的介绍
Snailclimb Mar 19, 2019
8d492ea
Update 常量池
Snailclimb Mar 19, 2019
8102a85
Add link
Snailclimb Mar 19, 2019
b1c17e1
Add qq群
Snailclimb Mar 19, 2019
9ea8095
Fix QQ群
Snailclimb Mar 19, 2019
10a7bef
Merge pull request #220 from illusorycloud/patch-8
Snailclimb Mar 19, 2019
06701ae
Merge pull request #218 from JerrySeven/master
Snailclimb Mar 19, 2019
5d47fb4
Delete 深入拆解Java虚拟机
Snailclimb Mar 19, 2019
4529a8f
Update 一千行MySQL命令.md
lixd Mar 20, 2019
8af956a
Merge pull request #222 from illusorycloud/patch-9
Snailclimb Mar 20, 2019
2946858
Merge pull request #216 from fanofxiaofeng/patch-6
Snailclimb Mar 20, 2019
740135d
Update synchronized.md
JoeMinty Mar 21, 2019
1d65112
Create GitIntroduce.md
Snailclimb Mar 21, 2019
ce29090
Add 开发常用工具-Git
Snailclimb Mar 21, 2019
e330aed
Fix 错别字
Snailclimb Mar 21, 2019
bf5e0fc
Update README.md
Snailclimb Mar 21, 2019
848d328
Add Collections类和Arrays类常见方法
Snailclimb Mar 22, 2019
e56245b
Add Collections工具类和Arrays工具类常见方法
Snailclimb Mar 22, 2019
f748cfd
Add 目录
Snailclimb Mar 22, 2019
19a0f08
Update Arrays,CollectionsCommonMethods.md
Snailclimb Mar 22, 2019
58e7c22
Update 将所有文章的路径改为相对路径
Snailclimb Mar 22, 2019
f1ece61
Add 码云地址
Snailclimb Mar 22, 2019
e800241
Update 码云地址
Snailclimb Mar 22, 2019
43f52bf
Add 微信群
Snailclimb Mar 22, 2019
9128fad
Add PDF-Java面试突击
Snailclimb Mar 22, 2019
22cfe97
Update 码云地址
Snailclimb Mar 22, 2019
45ca9b2
Merge pull request #224 from JoeMinty/patch-1
Snailclimb Mar 22, 2019
37b4092
Fix 微信群链接错误
Snailclimb Mar 22, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
258 changes: 258 additions & 0 deletions DevelopCommonTools/GitIntroduce.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,258 @@
<!-- TOC -->

- [版本控制](#版本控制)
- [什么是版本控制](#什么是版本控制)
- [为什么要版本控制](#为什么要版本控制)
- [本地版本控制系统](#本地版本控制系统)
- [集中化的版本控制系统](#集中化的版本控制系统)
- [分布式版本控制系统](#分布式版本控制系统)
- [认识 Git](#认识-git)
- [Git 简史](#git-简史)
- [Git 与其他版本管理系统的主要区别](#git-与其他版本管理系统的主要区别)
- [Git 的三种状态](#git-的三种状态)
- [Git 使用快速入门](#git-使用快速入门)
- [获取 Git 仓库](#获取-git-仓库)
- [记录每次更新到仓库](#记录每次更新到仓库)
- [推送改动到远程仓库](#推送改动到远程仓库)
- [远程仓库的移除与重命名](#远程仓库的移除与重命名)
- [查看提交历史](#查看提交历史)
- [撤销操作](#撤销操作)
- [分支](#分支)
- [推荐阅读](#推荐阅读)

<!-- /TOC -->

## 版本控制

### 什么是版本控制

版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 除了项目源代码,你可以对任何类型的文件进行版本控制。

### 为什么要版本控制

有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。

### 本地版本控制系统

许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。 这么做唯一的好处就是简单,但是特别容易犯错。 有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。

为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异。

![本地版本控制系统](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3/本地版本控制系统.png)

### 集中化的版本控制系统

接下来人们又遇到一个问题,如何让在不同系统上的开发者协同工作? 于是,集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生。

集中化的版本控制系统都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。

![集中化的版本控制系统](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3/集中化的版本控制系统.png)

这么做虽然解决了本地版本控制系统无法让在不同系统上的开发者协同工作的诟病,但也还是存在下面的问题:

- **单点故障:** 中央服务器宕机,则其他人无法使用;如果中心数据库磁盘损坏有没有进行备份,你将丢失所有数据。本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。
- **必须联网才能工作:** 受网络状况、带宽影响。

### 分布式版本控制系统

于是分布式版本控制系统(Distributed Version Control System,简称 DVCS)面世了。 Git 就是一个典型的分布式版本控制系统。

这类系统,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。

![分布式版本控制系统](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3/分布式版本控制系统.png)

分布式版本控制系统可以不用联网就可以工作,因为每个人的电脑上都是完整的版本库,当你修改了某个文件后,你只需要将自己的修改推送给别人就可以了。但是,在实际使用分布式版本控制系统的时候,很少会直接进行推送修改,而是使用一台充当“中央服务器”的东西。这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

分布式版本控制系统的优势不单是不必联网这么简单,后面我们还会看到 Git 极其强大的分支管理等功能。

## 认识 Git

### Git 简史

Linux 内核项目组当时使用分布式版本控制系统 BitKeeper 来管理和维护代码。但是,后来开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统,而且对新的版本控制系统做了很多改进。

### Git 与其他版本管理系统的主要区别

Git 在保存和对待各种信息的时候与其它版本控制系统有很大差异,尽管操作起来的命令形式非常相近,理解这些差异将有助于防止你使用中的困惑。

下面我们主要说一个关于 Git 其他版本管理系统的主要差别:**对待数据的方式**。

**Git采用的是直接记录快照的方式,而非差异比较。我后面会详细介绍这两种方式的差别。**

大部分版本控制系统(CVS、Subversion、Perforce、Bazaar 等等)都是以文件变更列表的方式存储信息,这类系统**将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。**

具体原理如下图所示,理解起来其实很简单,每个我们对提交更新一个文件之后,系统记录都会记录这个文件做了哪些更新,以增量符号Δ(Delta)表示。

<div align="center">
<img src="https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3deltas.png" width="500px"/>
</br>
</div>

**我们怎样才能得到一个文件的最终版本呢?**

很简单,高中数学的基本知识,我们只需要将这些原文件和这些增加进行相加就行了。

**这种方式有什么问题呢?**

比如我们的增量特别特别多的话,如果我们要得到最终的文件是不是会耗费时间和性能。

Git 不按照以上方式对待或保存数据。 反之,Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 **快照流**。

<div align="center">
<img src="https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3snapshots.png" width="500px"/>
</br>
</div>


### Git 的三种状态

Git 有三种状态,你的文件可能处于其中之一:

1. **已提交(committed)**:数据已经安全的保存在本地数据库中。
2. **已修改(modified)**:已修改表示修改了文件,但还没保存到数据库中。
3. **已暂存(staged)**:表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

由此引入 Git 项目的三个工作区域的概念:**Git 仓库(.git directoty) **、**工作目录(Working Directory)** 以及 **暂存区域(Staging Area)** 。

<div align="center">
<img src="https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3areas.png" width="500px"/>
</div>

**基本的 Git 工作流程如下:**

1. 在工作目录中修改文件。
2. 暂存文件,将文件的快照放入暂存区域。
3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。

## Git 使用快速入门

### 获取 Git 仓库

有两种取得 Git 项目仓库的方法。

1. 在现有目录中初始化仓库: 进入项目目录运行 `git init` 命令,该命令将创建一个名为 `.git` 的子目录。
2. 从一个服务器克隆一个现有的 Git 仓库: `git clone [url]` 自定义本地仓库的名字: `git clone [url]` directoryname

### 记录每次更新到仓库

1. **检测当前文件状态** : `git status`
2. **提出更改(把它们添加到暂存区**):`git add filename ` (针对特定文件)、`git add *`(所有文件)、`git add *.txt`(支持通配符,所有 .txt 文件)
3. **忽略文件**:`.gitignore` 文件
4. **提交更新:** `git commit -m "代码提交信息"` (每次准备提交前,先用 `git status` 看下,是不是都已暂存起来了, 然后再运行提交命令 `git commit`)
5. **跳过使用暂存区域更新的方式** : `git commit -a -m "代码提交信息"`。 `git commit` 加上 `-a` 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 `git add` 步骤。
6. **移除文件** :`git rm filename` (从暂存区域移除,然后提交。)
7. **对文件重命名** :`git mv README.md README`(这个命令相当于`mv README.md README`、`git rm README.md`、`git add README` 这三条命令的集合)

### 推送改动到远程仓库

- 如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:·`git remote add origin <server>` ,比如我们要让本地的一个仓库和 Github 上创建的一个仓库关联可以这样`git remote add origin https://github.com/Snailclimb/test.git`
- 将这些改动提交到远端仓库:`git push origin master` (可以把 *master* 换成你想要推送的任何分支)

如此你就能够将你的改动推送到所添加的服务器上去了。

### 远程仓库的移除与重命名

- 将 test 重命名位 test1:`git remote rename test test1`
- 移除远程仓库 test1:`git remote rm test1`

### 查看提交历史

在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的工具是 `git log` 命令。`git log` 会按提交时间列出所有的更新,最近的更新排在最上面。

**可以添加一些参数来查看自己希望看到的内容:**

只看某个人的提交记录:

```shell
git log --author=bob
```

### 撤销操作

有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 `--amend` 选项的提交命令尝试重新提交:

```console
git commit --amend
```

取消暂存的文件

```console
git reset filename
```

撤消对文件的修改:

```
git checkout -- filename
```

假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:

```
git fetch origin
git reset --hard origin/master
```



### 分支

分支是用来将特性开发绝缘开来的。在你创建仓库的时候,*master* 是“默认的”分支。在其他分支上进行开发,完成后再将它们合并到主分支上。

我们通常在开发新功能、修复一个紧急 bug 等等时候会选择创建分支。单分支开发好还是多分支开发好,还是要看具体场景来说。

创建一个名字叫做 test 的分支

```console
git branch test
```

切换当前分支到 test(当你切换分支的时候,Git 会重置你的工作目录,使其看起来像回到了你在那个分支上最后一次提交的样子。 Git 会自动添加、删除、修改文件以确保此时你的工作目录和这个分支最后一次提交时的样子一模一样)

```console
git checkout test
```

<div align="center">
<img src="https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3切换分支.png" width="500px"/>
</div>

你也可以直接这样创建分支并切换过去(上面两条命令的合写)

```console
git checkout -b feature_x
```

切换到主分支

```
git checkout master
```

合并分支(可能会有冲突)

```java
git merge test
```

把新建的分支删掉

```
git branch -d feature_x
```

将分支推送到远端仓库(推送成功后其他人可见):

```
git push origin
```



## 推荐阅读

- [Git - 简明指南](http://rogerdudler.github.io/git-guide/index.zh.html)
- [图解Git](http://marklodato.github.io/visual-git-guide/index-zh-cn.html)
- [猴子都能懂得Git入门](https://backlog.com/git-tutorial/cn/intro/intro1_1.html)
- https://git-scm.com/book/en/v2
Loading