|
| 1 | +> 1. **介绍**:**GitGuide** 致力于打造最易懂的 Git 版本控制入门教程,`让天下没有难学的 Git 版本控制` |
| 2 | +> 2. **转载须知** :以下所有文章与视频教程皆为我的原创,转载请联系我们,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益,让我们一起维护一个良好的技术创作环境! |
| 3 | +> 3. **Star/Fork 支持**:开源不易,如果开源项目帮助你打开 Git 学习大门,希望你能 **Star** 支持我们,你的支持就是我们持续更新的动力。 |
| 4 | +
|
| 5 | +<p align="center"> |
| 6 | + <a href="https://mp.weixin.qq.com/s/PpeblHk6Ml4w8iNrrw8UAA"><img src="https://img.shields.io/badge/%E5%9C%A8%E7%BA%BF%E9%98%85%E8%AF%BB-read-brightgreen" alt="在线阅读"></a> |
| 7 | + <a href="#公众号"><img src="https://img.shields.io/badge/%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%8F%B7-%E4%BB%A3%E7%A0%81%E6%83%85%E7%BC%98-orange" alt="公众号"></a> |
| 8 | + <a href="#公众号"><img src="https://img.shields.io/badge/PDF-Git%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6-yellowgreen" alt="PDF"></a> |
| 9 | + <a href="#联系我"><img src="https://img.shields.io/badge/%E8%81%94%E7%B3%BB%E6%88%91%E4%BB%AC-weChat-orange" alt="联系我"></a> |
| 10 | +</p> |
| 11 | + |
| 12 | + |
| 13 | + |
| 14 | +## 给我一个 Star! ⭐ |
| 15 | + |
| 16 | +如果您喜欢或者打算使用这个项目来学习或者来开始你的 `Git 版本控制`学习之路,给我一个 `Star`,谢谢! |
| 17 | + |
| 18 | + |
| 19 | + |
| 20 | +## 版本控制的起源 |
| 21 | + |
| 22 | +- 现在的软件项目通常是由一个研发小组共同分析、设计、编码、维护以及测试的 |
| 23 | +- 针对团队开发需要解决以下问题: |
| 24 | + + 备份多个版本,费空间,费时间 |
| 25 | + + 难于恢复至以前正确版本 |
| 26 | + + 难以解决代码冲突困难 |
| 27 | + + 难于追溯问题代码的修改人和修改时间 |
| 28 | + + 无法进行权限控制 |
| 29 | + + 项目版本发布困难 |
| 30 | +- 源代码管理工具就是为了解决上述问题应运而生的 |
| 31 | +--- |
| 32 | +## 版本控制(Revision Control) |
| 33 | + |
| 34 | + + 是维护工程蓝图的标准做法,能追踪工程蓝图从诞生一直到定案的过程。是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统 |
| 35 | + + 如果是团队开发,使用版本控制是强制性的! |
| 36 | + + 如果是单人开发,也强烈建议现在就开始使用版本控制! |
| 37 | +- 使用版本控制可以: |
| 38 | + + 不会对现有工作造成任何损害 |
| 39 | + + 不会增加工作量 |
| 40 | + + 添加新的功能拓展时,会变得更加容易 |
| 41 | +--- |
| 42 | +## 常见版本控制工具 |
| 43 | + |
| 44 | + + CVS 开启版本控制之门 |
| 45 | + + CVS 1990年诞生,远古时代的主流源代码管理工具 |
| 46 | + + SVN 集中式版本控制之王者 |
| 47 | + + SVN:又称subversion,是CVS的接班人,是一款`集中式`源代码管理工具。曾经是绝大多数开源软件的代码管理工具(google code),前几年在国内软件企业使用最为普遍 |
| 48 | + + GIT 分布式版本控制之伟大作品 |
| 49 | + + GIT:一款`分布式`源代码管理工具,目前国内企业几乎都已经完成了从SVN到GIT的转换 |
| 50 | +--- |
| 51 | +- 集中式源代码管理 |
| 52 | + |
| 53 | + |
| 54 | +- 分布式源代码管理 |
| 55 | + |
| 56 | + |
| 57 | +- 分布式和集中式的最大区别在于: |
| 58 | + + 在集中式下, 开发者只能将代码提交到服务器, 在分布式下, 开发者可以本地提交 |
| 59 | + + 在集中式下, 只有远程服务器上有代码数据库, 在分布式下, 每个开发者机器上都有一个代码数据库 |
| 60 | + |
| 61 | +- SVN(集中式) |
| 62 | + |
| 63 | + |
| 64 | +- GIT(分布式) |
| 65 | +  |
| 66 | + |
| 67 | +## Git和 SVN 的简单对比 |
| 68 | + |
| 69 | +- 速度 |
| 70 | + + 在很多情况下,git的速度远远比SVN快 |
| 71 | +- 结构 |
| 72 | + + SVN是集中式管理,git是分布式管理 |
| 73 | +- 其他 |
| 74 | + + SVN使用分支比较笨拙,git可以轻松拥有无限个分支 |
| 75 | + + SVN必须联网才能正常工作,git支持本地版本控制工作 |
| 76 | + + 旧版本的SVN会在每一个目录置放一个.svn,git只会在根目录拥有一个.git |
| 77 | +--- |
| 78 | +## GIT简介 |
| 79 | + |
| 80 | +- GIT是一款自由和开源的`分布式`版本控制系统,用于`敏捷高效`地处理任何或小或大的项目 |
| 81 | +- 在世界上所有的分布式版本控制工具中,git是最快、最简单、最流行的 |
| 82 | +- 是Linux之父李纳斯的第二个伟大作品 |
| 83 | + + 2005年由于BitKeeper软件公司对Linux社区停止了免费使用权。 |
| 84 | + + Linus为了辅助Linux内核的开发(管理源代码),迫不得己自己开发了一个分布式版本控制工具,从而Git诞生了 |
| 85 | + |
| 86 | +--- |
| 87 | +## GIT工作原理 |
| 88 | + |
| 89 | +- 如果想学好GIT必须先了解GIT的工作原理 |
| 90 | +- **工作区(Working Directory):** 仓库文件夹里面, 除了`.git目录`以外的内容 |
| 91 | +- **版本库(Repository):**.git目录, 用于存储记录版本信息 |
| 92 | + - 版本库中的**暂缓区(staga):** |
| 93 | + - 版本库中的**分支(master):** git自动创建的第一个分支 |
| 94 | + - 版本库中的**HEAD指针:**用于指向当前分支 |
| 95 | + |
| 96 | +--- |
| 97 | +- git add和git commit命名作用 |
| 98 | + + git add: 把文件修改添加到暂缓区 |
| 99 | + +  |
| 100 | + + git commit: 把暂缓区的所有内容提交到当前HEAD指针指向的分支 |
| 101 | + +  |
| 102 | + |
| 103 | +> GIT自学网站推荐: https://backlog.com/git-tutorial/cn/ |
| 104 | +--- |
| 105 | +## GIT使用环境 |
| 106 | + |
| 107 | +- 多人开发时需要一个`共享版本库`, 单人开发初始化一个`本地库`即可 |
| 108 | +- 共享版本库的形式: |
| 109 | + + 本地共享库: 文件夹/U盘/硬盘 |
| 110 | + + 远程共享库: 自己搭建git服务器/托管到第三方平台(github/oschina等) |
| 111 | +- 无论是单人开发还是多人开发, 客户端都可以使用命令行或者图形化界面使用git |
| 112 | +--- |
| 113 | +## GIT命令-个人开发 |
| 114 | + |
| 115 | +- `git help` :git指令帮助手册 |
| 116 | + |
| 117 | + + 查看其他指令的做法:git help 其他指令 |
| 118 | +- `git init` : 仓库初始化(个人仓库) |
| 119 | + + 仓库文件目录 |
| 120 | + ``` |
| 121 | + HEAD: 指向当前分支的一个提交 |
| 122 | + description: 项目的描述信息 |
| 123 | + config: 项目的配置信息 |
| 124 | + info/: 里面有一个exclude文件,指定本项目要忽略的文件 |
| 125 | + objects/: Git对象库(commit/tree/blob/tag) |
| 126 | + refs/: 标识每个分支指向哪个提交 |
| 127 | + hooks/: 默认的hook脚本 |
| 128 | + ``` |
| 129 | +- GIT设置配置信息 |
| 130 | + + 配置用户名:`git config user.name "用户名"`(用于跟踪修改记录) |
| 131 | + + 配置邮箱:`git config user.email "邮箱"`(用于多人开发间的沟通) |
| 132 | + + `git config -l` : 查看配置信息 |
| 133 | + + `git config -e` : 编辑配置信息 |
| 134 | + |
| 135 | +- `git status` :查文件的状态 |
| 136 | + + 查看某个文件的状态:`git status 文件名` |
| 137 | + + 查看当前路径所有文件的状态:`git status` |
| 138 | + |
| 139 | +- `git add` :将工作区的文件保存到暂缓区 |
| 140 | + + 保存某个文件到暂缓区:`git add 文件名` |
| 141 | + + 保存当前路径的所有文件到暂缓区:`git add .`(注意,最后是一个点 . ) |
| 142 | + |
| 143 | +- `git commit`:将暂缓区的文件提交到当前分支 |
| 144 | + + 提交某个文件到分支:`git commit -m ”注释” 文件名` |
| 145 | + + 保存当前路径的所有文件到分支:`git commit -m ”注释” ` |
| 146 | + |
| 147 | +- `git log` :查看文件的修改日志 |
| 148 | + + 查看某个文件的修改日志:`git log 文件名` |
| 149 | + + 查看当前路径所有文件的修改日志:`git log` |
| 150 | + + 用一行的方式查看简单的日志信息:`git log ––pretty=oneline` |
| 151 | + + 查看最近的N次修改:`git log –N`(N是一个整数) |
| 152 | + |
| 153 | +- `git diff` :查看文件最新改动的地方 |
| 154 | + + 查看某个文件的最新改动的地方:`git diff 文件名` |
| 155 | + + 查看当前路径所有文件最新改动的地方:`git diff` |
| 156 | + |
| 157 | +- `git reflog` :查看分支引用记录(能够查看所有的版本号) |
| 158 | + |
| 159 | +- `git rm`:删除文件(删完之后要进行commit操作,才能同步到版本库) |
| 160 | + |
| 161 | +- `git reset `:版本回退(建议加上––hard参数,git支持无限次后悔) |
| 162 | + + 回退到上一个版本:`git reset ––hard HEAD^` |
| 163 | + + 回退到上上一个版本:`git reset ––hard HEAD^^` |
| 164 | + + 回退到上N个版本:`git reset ––hard HEAD~N(N是一个整数)` |
| 165 | + + 回退到任意一个版本:`git reset ––hard 版本号(版本号用7位即可)` |
| 166 | + |
| 167 | +- Git忽略提交规则 - .gitignore配置 |
| 168 | + + 别看了, 你想要的都在这[企业开发专用链接](https://github.com/github/gitignore) |
| 169 | +```c |
| 170 | +# 表示此为注释,将被Git忽略 |
| 171 | +*.a 表示忽略所有 .a 结尾的文件 |
| 172 | +!lib.a 表示但lib.a除外 |
| 173 | +/TODO 表示仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO |
| 174 | +build/ 表示忽略 build/目录下的所有文件,过滤整个build文件夹; |
| 175 | +doc/*.txt 表示会忽略doc/notes.txt但不包括 doc/server/arch.txt |
| 176 | + |
| 177 | +bin/: 表示忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件 |
| 178 | +/bin: 表示忽略根目录下的bin文件 |
| 179 | +/*.c: 表示忽略cat.c,不忽略 build/cat.c |
| 180 | +debug/*.obj: 表示忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj |
| 181 | +**/foo: 表示忽略/foo,a/foo,a/b/foo等 |
| 182 | +a/**/b: 表示忽略a/b, a/x/b,a/x/y/b等 |
| 183 | +!/bin/run.sh 表示不忽略bin目录下的run.sh文件 |
| 184 | +*.log: 表示忽略所有 .log 文件 |
| 185 | +config.php: 表示忽略当前路径的 config.php 文件 |
| 186 | + |
| 187 | +/mtk/ 表示过滤整个文件夹 |
| 188 | +*.zip 表示过滤所有.zip文件 |
| 189 | +/mtk/do.c 表示过滤某个具体文件 |
| 190 | + |
| 191 | +被过滤掉的文件就不会出现在git仓库中(gitlab或github)了,当然本地库中还有,只是push的时候不会上传。 |
| 192 | + |
| 193 | +需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中,如下: |
| 194 | +!*.zip |
| 195 | +!/mtk/one.txt |
| 196 | + |
| 197 | +唯一的区别就是规则开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。为什么要有两种规则呢? |
| 198 | +想象一个场景:假如我们只需要管理/mtk/目录中的one.txt文件,这个目录中的其他文件都不需要管理,那么.gitignore规则应写为:: |
| 199 | +/mtk/* |
| 200 | +!/mtk/one.txt |
| 201 | + |
| 202 | +假设我们只有过滤规则,而没有添加规则,那么我们就需要把/mtk/目录下除了one.txt以外的所有文件都写出来! |
| 203 | +注意上面的/mtk/*不能写为/mtk/,否则父目录被前面的规则排除掉了,one.txt文件虽然加了!过滤规则,也不会生效! |
| 204 | + |
| 205 | +---------------------------------------------------------------------------------- |
| 206 | +还有一些规则如下: |
| 207 | +fd1/* |
| 208 | +说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略; |
| 209 | + |
| 210 | +/fd1/* |
| 211 | +说明:忽略根目录下的 /fd1/ 目录的全部内容; |
| 212 | + |
| 213 | +/* |
| 214 | +!.gitignore |
| 215 | +!/fw/ |
| 216 | +/fw/* |
| 217 | +!/fw/bin/ |
| 218 | +!/fw/sf/ |
| 219 | +说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录;注意要先对bin/的父目录使用!规则,使其不被排除。 |
| 220 | +``` |
| 221 | +--- |
| 222 | +## GIT命令-团队开发 |
| 223 | +
|
| 224 | +- `git init --bare` : 仓库初始化(共享仓库) |
| 225 | + + 注意: 不要直接在共享仓库中编写代码 |
| 226 | +- `git clone`:下载远程仓库到本地 |
| 227 | + + 下载远程仓库到当前路径:git clone 仓库的URL |
| 228 | + + 下载远程仓库到特定路径:git clone 仓库的URL 存放仓库的路径 |
| 229 | +- `git pull`:下载远程仓库的最新信息到本地仓库 |
| 230 | +- `git push`:将本地的仓库信息推送到远程仓库 |
| 231 | + + 提交时如果远程仓库有其它人提交的最新代码, 必须先pull, 再提交 |
| 232 | +- 冲突解决: |
| 233 | + + 当多个人同时修改了同一个文件时, 后提交的需要先从服务器pull代码到问题, 手动解决完冲突之后再push到远程服务器 |
| 234 | +```c |
| 235 | +<<<<<<< HEAD |
| 236 | + 你本地的新增的代码 |
| 237 | +======= |
| 238 | + 服务器上和你冲突的代码 |
| 239 | +>>>>>>> e9609de28b65bf97539f94c6458cdebdf2711c9f |
| 240 | +``` |
| 241 | +--- |
| 242 | +## GIT经典协同模型 |
| 243 | +
|
| 244 | +- 中心仓库:包含master和develop两个分支 |
| 245 | +- 分支分类 |
| 246 | + + 主要分支:master和develop分支 |
| 247 | + + 支持性分支:特性分支,发布分支,热补丁分支 |
| 248 | +- 对于商业级项目,真正开发过程中都是基于develop分支进行的,develop分支是开发主线! |
| 249 | +- master分支中,只存放相对稳定的分支,例如:0.1版本, 0.2版本 |
| 250 | +- 在实际产品开发中,需要“规划版本”,例如:将100个功能规划到5个不同的版本上 |
| 251 | +- 发现bug,要基于“上一个最稳定的版本”进行修复,这是热补丁分支存在的意义! |
| 252 | +- 理解清楚版本管理分支的特性,是迭代式开发的重要基础! |
| 253 | + |
| 254 | +
|
| 255 | +
|
| 256 | +- `git branch` : 查看所有分支 |
| 257 | +- `git branch 分支名称` : 创建分支 |
| 258 | + + 新创建的分支中的内容和master分支中的内容一样 |
| 259 | +- `git checkout 分支名称` : 切换到指定分支 |
| 260 | +- `git merge 分支名称` : 合并分支 |
| 261 | + + 将当前所在分支和指定名称分支进行合并 |
| 262 | +- `git branch -d 分支名称` : 删除指定分支 |
| 263 | + + 不能在当前分支中删除自己 |
| 264 | +
|
| 265 | +--- |
| 266 | +## 使用GIT我们应该 |
| 267 | +
|
| 268 | +- 经常更新:降低冲突的可能性 |
| 269 | +- 提交前需在本机测试通过:降低将问题代码传到版本库 |
| 270 | +- 提交时一定写备注:方便其他员工查看和自己以后回顾 |
| 271 | +- 对于不需要提交的文件不要提交到版本库 |
| 272 | +
|
| 273 | +>提示: |
| 274 | +>- 每次提交之前先更新 |
| 275 | +>- 每天下班前提交当天编译通过的代码 |
| 276 | +>- 每天上班第一件事情更新前一天的代码 |
| 277 | +
|
| 278 | +--- |
| 279 | +## GITHUB使用 |
| 280 | +
|
| 281 | +- 1.注册GitHub账号 |
| 282 | + +  |
| 283 | +- 2.登录GitHub |
| 284 | + +  |
| 285 | +- 3.点击你的仓库 |
| 286 | + +  |
| 287 | +- 4.创建一个新的仓库 |
| 288 | + +  |
| 289 | +- 5.新建的仓库可以下载, 但是提交需要账号密码 |
| 290 | +- 6.配置SSH Key |
| 291 | + + 6.1打开git 命令行工具 |
| 292 | + + 输入指令``` ssh-keygen -t rsa -b 4096 -C "[email protected]"``` |
| 293 | + +  |
| 294 | + + 6.2复制刚才生成的公钥 |
| 295 | + +  |
| 296 | + +  |
| 297 | + + 6.3将生成好的SSH Key 添加到GitHub |
| 298 | + +  |
| 299 | + +  |
| 300 | + +  |
| 301 | + + 6.4测试是否配置成功 ```ssh -T [email protected]``` |
| 302 | + + 如果后面出现 : Hi ****! You've successfully authenticated, but GitHub does not provide shell access.证明成功 |
| 303 | +- 7.利用SSH Key操作GitHub |
| 304 | + +  |
| 305 | +
|
| 306 | +--- |
| 307 | +## oschina使用 |
| 308 | +
|
| 309 | +- 和 GitHub 方法相同 |
| 310 | +
|
| 311 | +## 编程常见问题汇总 |
| 312 | +
|
| 313 | +1. [如何学习编程?](https://mp.weixin.qq.com/s/sb9n8dFe96XR6pRxEpZx0Q) |
| 314 | +2. [如何选择一门编程语言?](https://mp.weixin.qq.com/s/8JeSy0fUYKVa2PrGRk8t-Q) |
| 315 | +3. [如何做好离职交接工作?](https://mp.weixin.qq.com/s/HprdWcnNyWonwuaI74vOTw) |
| 316 | +4. [学习编程的算法网站有哪些?](https://mp.weixin.qq.com/s/BM_osU-LX_JqELpahA59bQ) |
| 317 | +5. 持续更新 ing |
| 318 | +
|
| 319 | +--- |
| 320 | +
|
| 321 | +## 其他 |
| 322 | +
|
| 323 | +### 联系我(编程学习路线) |
| 324 | +
|
| 325 | + |
| 326 | +
|
| 327 | +整理了一份各个技术的学习路线,需要的小伙伴加我微信:“**leader_fengy** ”备注“ **学习路线**” 即可! |
| 328 | +
|
| 329 | + |
| 330 | +
|
| 331 | +### 公众号 |
| 332 | +
|
| 333 | +如果大家想要实时关注我们更新的文章以及分享的干货的话,可以关注我们的微信公众号“**代码情缘**”。 |
| 334 | +
|
| 335 | +**《C语言保姆级教程》:**《**Go语言保姆级教程**》《**Git版本控制**》PDF 版本在[微信公众号](#公众号)后台回复 **"书籍"** 即可免费领取! |
| 336 | +
|
| 337 | + |
0 commit comments