Git.md 7.0 KB
Newer Older
C
CyC2018 已提交
1
<!-- GFM-TOC -->
C
CyC2018 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
* [集中式与分布式](#集中式与分布式)
* [中心服务器](#中心服务器)
* [工作流](#工作流)
* [分支实现](#分支实现)
* [冲突](#冲突)
* [Fast forward](#fast-forward)
* [分支管理策略](#分支管理策略)
* [储藏(Stashing)](#储藏stashing)
* [SSH 传输设置](#ssh-传输设置)
* [.gitignore 文件](#gitignore-文件)
* [Git 命令一览](#git-命令一览)
* [参考资料](#参考资料)
<!-- GFM-TOC -->


# 集中式与分布式

Git 属于分布式版本控制系统,而 SVN 属于集中式。
C
CyC2018 已提交
20

C
CyC2018 已提交
21 22
<div align="center"> <img src="pics/fac3dfd6-1656-4329-9a80-7f6c51ef30c5_200.png"/> </div><br>

C
CyC2018 已提交
23 24 25 26 27 28 29 30
集中式版本控制只有中心服务器拥有一份代码,而分布式版本控制每个人的电脑上就有一份完整的代码。

集中式版本控制有安全性问题,当中心服务器挂了所有人都没办法工作了。

集中式版本控制需要连网才能工作,如果网速过慢,那么提交一个文件的会慢的无法让人忍受。而分布式版本控制不需要连网就能工作。

分布式版本控制新建分支、合并分支操作速度非常快,而集中式版本控制新建一个分支相当于复制一份完整代码。

C
CyC2018 已提交
31
# 中心服务器
C
CyC2018 已提交
32

C
CyC2018 已提交
33
中心服务器用来交换每个用户的修改,没有中心服务器也能工作,但是中心服务器能够 24 小时保持开机状态,这样就能更方便的交换修改。
C
CyC2018 已提交
34

C
CyC2018 已提交
35
Github 就是一个中心服务器。
C
CyC2018 已提交
36

C
CyC2018 已提交
37
# 工作流
C
CyC2018 已提交
38

C
CyC2018 已提交
39
新建一个仓库之后,当前目录就成为了工作区,工作区下有一个隐藏目录 .git,它属于 Git 的版本库。
C
CyC2018 已提交
40

C
CyC2018 已提交
41
Git 的版本库有一个称为 Stage 的暂存区以及最后的 History 版本库,History 中存有所有分支,使用一个 HEAD 指针指向当前分支。
C
CyC2018 已提交
42

C
CyC2018 已提交
43
<div align="center"> <img src="pics/0f9b9d2a-c5cc-4a3f-b138-2c1035950f39_200.png"/> </div><br>
C
CyC2018 已提交
44

C
CyC2018 已提交
45 46 47 48
- git add files 把文件的修改添加到暂存区
- git commit 把暂存区的修改提交到当前分支,提交之后暂存区就被清空了
- git reset -- files 使用当前分支上的修改覆盖暂存区,用来撤销最后一次 git add files
- git checkout -- files 使用暂存区的修改覆盖工作目录,用来撤销本地修改
C
CyC2018 已提交
49

C
CyC2018 已提交
50
<div align="center"> <img src="pics/11a786f0-5e02-46a6-92f0-f302c9cf6ca3_200.png"/> </div><br>
C
CyC2018 已提交
51

C
CyC2018 已提交
52
可以跳过暂存区域直接从分支中取出修改,或者直接提交修改到分支中。
C
CyC2018 已提交
53

C
CyC2018 已提交
54 55
- git commit -a 直接把所有文件的修改添加到暂存区然后执行提交
- git checkout HEAD -- files 取出最后一次修改,可以用来进行回滚操作
C
CyC2018 已提交
56

C
CyC2018 已提交
57 58
<div align="center"> <img src="pics/b48b9a7a-f9f8-4cf9-90f1-5cddd685b782_200.png"/> </div><br>

C
CyC2018 已提交
59
# 分支实现
C
CyC2018 已提交
60

C
CyC2018 已提交
61
使用指针将每个提交连接成一条时间线,HEAD 指针指向当前分支指针。
C
CyC2018 已提交
62

C
CyC2018 已提交
63
<div align="center"> <img src="pics/84d496d7-54b0-4a9b-9499-ce232057e499_200.png"/> </div><br>
C
CyC2018 已提交
64

C
CyC2018 已提交
65
新建分支是新建一个指针指向时间线的最后一个节点,并让 HEAD 指针指向新分支表示新分支成为当前分支。
C
CyC2018 已提交
66

C
CyC2018 已提交
67
<div align="center"> <img src="pics/7c5bcdbf-e656-4b7c-be82-b247a3589ed5_200.png"/> </div><br>
C
CyC2018 已提交
68

C
CyC2018 已提交
69
每次提交只会让当前分支指针向前移动,而其它分支指针不会移动。
C
CyC2018 已提交
70

C
CyC2018 已提交
71
<div align="center"> <img src="pics/13783e94-b481-4aea-9fa2-9d1973abd47e_200.png"/> </div><br>
C
CyC2018 已提交
72 73 74

合并分支也只需要改变指针即可。

C
CyC2018 已提交
75
<div align="center"> <img src="pics/15699a17-5a69-4fbe-852e-9d2b7cf05e80_200.png"/> </div><br>
C
CyC2018 已提交
76

C
CyC2018 已提交
77
# 冲突
C
CyC2018 已提交
78 79 80

当两个分支都对同一个文件的同一行进行了修改,在分支合并时就会产生冲突。

C
CyC2018 已提交
81
<div align="center"> <img src="pics/7e82ce01-2afb-4c15-b720-b81049c875c2_200.png"/> </div><br>
C
CyC2018 已提交
82

C
CyC2018 已提交
83
Git 会使用 <<<<<<< ,======= >>>>>>> 标记出不同分支的内容,只需要把不同分支中冲突部分修改成一样就能解决冲突。
C
CyC2018 已提交
84 85

```
C
CyC2018 已提交
86 87
<<<<<<< HEAD
Creating a new branch is quick & simple.
C
CyC2018 已提交
88
=======
C
CyC2018 已提交
89 90
Creating a new branch is quick AND simple.
>>>>>>> feature1
C
CyC2018 已提交
91 92
```

C
CyC2018 已提交
93
# Fast forward
C
CyC2018 已提交
94

C
CyC2018 已提交
95
"快进式合并"(fast-farward merge),会直接将 master 分支指向合并的分支,这种模式下进行分支合并会丢失分支信息,也就不能在分支历史上看出分支信息。
C
CyC2018 已提交
96

C
CyC2018 已提交
97
可以在合并时加上 --no-ff 参数来禁用 Fast forward 模式,并且加上 -m 参数让合并时产生一个新的 commit。
C
CyC2018 已提交
98 99

```
C
CyC2018 已提交
100
$ git merge --no-ff -m "merge with no-ff" dev
C
CyC2018 已提交
101 102
```

C
CyC2018 已提交
103
<div align="center"> <img src="pics/fa1dc552-8501-439e-b85a-3d9eac704880_200.png"/> </div><br>
C
CyC2018 已提交
104

C
CyC2018 已提交
105
# 分支管理策略
C
CyC2018 已提交
106

C
CyC2018 已提交
107
master 分支应该是非常稳定的,只用来发布新版本;
C
CyC2018 已提交
108

C
CyC2018 已提交
109
日常开发在开发分支 dev 上进行。
C
CyC2018 已提交
110

C
CyC2018 已提交
111
<div align="center"> <img src="pics/245fd2fb-209c-4ad5-bc5e-eb5664966a0e.jpg"/> </div><br>
C
CyC2018 已提交
112

C
CyC2018 已提交
113
# 储藏(Stashing)
C
CyC2018 已提交
114 115 116

在一个分支上操作之后,如果还没有将修改提交到分支上,此时进行切换分支,那么另一个分支上也能看到新的修改。这是因为所有分支都共用一个工作区的缘故。

C
CyC2018 已提交
117
可以使用 git stash 将当前分支的修改储藏起来,此时当前工作区的所有修改都会被存到栈上,也就是说当前工作区是干净的,没有任何未提交的修改。此时就可以安全的切换到其它分支上了。
C
CyC2018 已提交
118 119

```
C
CyC2018 已提交
120 121 122
$ git stash
Saved working directory and index state \ "WIP on master: 049d078 added the index file"
HEAD is now at 049d078 added the index file (To restore them type "git stash apply")
C
CyC2018 已提交
123 124
```

C
CyC2018 已提交
125
该功能可以用于 bug 分支的实现。如果当前正在 dev 分支上进行开发,但是此时 master 上有个 bug 需要修复,但是 dev 分支上的开发还未完成,不想立即提交。在新建 bug 分支并切换到 bug 分支之前就需要使用 git stash 将 dev 分支的未提交修改储藏起来。
C
CyC2018 已提交
126

C
CyC2018 已提交
127
# SSH 传输设置
C
CyC2018 已提交
128

C
CyC2018 已提交
129
Git 仓库和 Github 中心仓库之间的传输是通过 SSH 加密。
C
CyC2018 已提交
130

C
CyC2018 已提交
131
如果工作区下没有 .ssh 目录,或者该目录下没有 id_rsa 和 id_rsa.pub 这两个文件,可以通过以下命令来创建 SSH Key:
C
CyC2018 已提交
132 133

```
C
CyC2018 已提交
134
$ ssh-keygen -t rsa -C "youremail@example.com"
C
CyC2018 已提交
135 136
```

C
CyC2018 已提交
137
然后把公钥 id_rsa.pub 的内容复制到 Github "Account settings" 的 SSH Keys 中。
C
CyC2018 已提交
138

C
CyC2018 已提交
139
# .gitignore 文件
C
CyC2018 已提交
140 141 142

忽略以下文件:

C
CyC2018 已提交
143 144 145
- 操作系统自动生成的文件,比如缩略图;
- 编译生成的中间文件,比如 Java 编译产生的 .class 文件;
- 自己的敏感信息,比如存放口令的配置文件。
C
CyC2018 已提交
146

C
CyC2018 已提交
147
不需要全部自己编写,可以到 [https://github.com/github/gitignore](https://github.com/github/gitignore) 中进行查询。
C
CyC2018 已提交
148

C
CyC2018 已提交
149
# Git 命令一览
C
CyC2018 已提交
150

C
CyC2018 已提交
151
<div align="center"> <img src="pics/7a29acce-f243-4914-9f00-f2988c528412.jpg"/> </div><br>
C
CyC2018 已提交
152 153 154

比较详细的地址:http://www.cheat-sheets.org/saved-copy/git-cheat-sheet.pdf

C
CyC2018 已提交
155
# 参考资料
C
CyC2018 已提交
156

C
CyC2018 已提交
157 158 159 160
- [Git - 简明指南](http://rogerdudler.github.io/git-guide/index.zh.html)
- [图解 Git](http://marklodato.github.io/visual-git-guide/index-zh-cn.html)
- [廖雪峰 : Git 教程](https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)
- [Learn Git Branching](https://learngitbranching.js.org/)
C
CyC2018 已提交
161 162 163 164




C
CyC2018 已提交
165
</br><div align="center"> <img src="https://cyc-1256109796.cos.ap-guangzhou.myqcloud.com/%E5%85%AC%E4%BC%97%E5%8F%B7%20%E6%B5%B7%E6%8A%A5.png" width="500px"> </div></br>