Git 用于管理代码提交,是开发必不可少的环节,可以有效保证功能正向迭代,解决多人开发配合问题。
看不懂?
没关系,往下看 ↓↓↓
小白剧场:
老大让小王和小李共同完成一套软件开发,小王做功能 1,小李做功能 2。
- 在一个项目中小李不能等小王做完了,把项目文件给小李再做吧。可是一起做的话,怎么把两个人的代码放到一起呢?
- 小王开发过程中已经先写了些基本方法,小李开发的时候想用,怎么办呢,再写一个?
- 两个人都改了同一个文件,谁改了哪里呢,为什么改呢,那部分是最新的呢?
- 小组新来个成员小张,一同参与开发,把整个工程复制给他?
- 老大想让小张做功能 3,功能 3 开发完了,老大说,这个功能不要了,小张:…… (我好难啊)
Git 就用来解决类似这些问题的!
Git 概念
什么是 Git?
- Git 是一个分布式版本控制系统
什么是版本控制系统?
版本控制系统是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。版本控制系统不仅可以应用于软件源代码的文本文件,而且可以对任何类型的文件进行版本控制。
简短来说,就是帮助我们管理文件的,文件的创建、更新和删除都可以被记录,代替备份,再备份
集中式 & 分布式
-
为了让不同系统上的开发者能够协同工作,集中化的版本控制系统应运而生(CVCS)。这类系统都有一个单一的集中管理的服务器,保存所有文件的修订版本。而协同工作的人们都通过客户端连接到这台服务器,获取最新的文件或者提交更新。集中化的版本控制系统,最显而易见的缺点是中央服务器的单点故障问题。如果宕机,那么就会出现谁都无法提交更新的情况,那么也就无法协同工作;如果磁盘发生故障,而备份又不够即时,那么就有丢失数据的风险,最坏的情况是丢失整个项目的历史更改记录。典型的例子就是SVN。因此,分布式版本控制系统问世了。
-
在分布式版本控制系统(DVCS)中,客户端不仅仅是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。所以每一次提取的操作,都是对代码仓库的完整备份,因此也就不必担心协同工作用的服务器发生故障。经典的列子就是Git。
Git的安装
可以从 Git 官网直接下载安装程序
关于安装 Git,可以看这个链接 https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git
安装完成后,打开git bash 输入 git --verison
有版本信息即安装成功
Git的基本使用
个人信息设置
这是因为 Git 是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和 Email 地址(用来分辨编辑者)
在开始菜单中找到 git-->git bash
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
git config 命令中的 --global 参数, 表示你这台机器上所有的 Git 仓库都会使用这个配置
配置好之后可以使用 git config -l
查看配置
创建仓库(repository)
仓库(repository),可以理解成把想要管理的内容(或文件等)放在一个指定的目录下,那么这个目录里的内容就是要被管理的内容。就好比一个实体的仓库,需要记录着货物入库、出库信息及记录,这些记录将会由 Git 工具来生成。
那么先创建一个仓库
在目标目录中,打开 git 执行 git init
以创建空的 Git 仓库(repositories)
创建版本库会自动生成一个
.git
目录,该目录就是 Git 用来管理版本库的,这个目录默认是隐藏的。
查看状态
小白剧场:使用 Git 管理,文件状态变更会比较谨慎,还以实体仓库为例,有一批新增货物想入库,从打算入库到最后入库并生成记录是要经历几个过程的。
- 首先是所有可能入库的部分,比如,T恤、衬衫、牛仔裤
- 然后我决定先不要衬衫,先把T恤和牛仔裤入库,放在待入库清单中
- 最后,把清单的内容放进仓库管理,并且说明一下,这次我添加了T恤 xx 件,牛仔裤 xx 条等等
想知道修改的文件处于哪个状态,就使用 status 查看
先新建一个名为 test 的文本,使用 git status
查看当前文件状态
Untracked files 表示当前文件没有添加到 Git 中(没有被 Git 管理),下一步使用
git add
添加下文件
添加与提交
上面用实体仓库的例子说明了服装入库的过程,这也是Git 管理的工作流
Git 管理的工作流
在 Git 内部文件有三种状态:已修改,已暂存和已提交。
- 已修改:表示修改了某个文件,但还没有提交保存;
- 已暂存:表示把已修改的文件放在下次提交时要保存的清单中了;
- 已提交:表示该文件已经被安全的保存在本地仓库中了。
Git 在管理项目时,文件流转的三个工作区域是:
- 本地仓库(即工作目录 working dir,也就是项目的源文件)
- 暂存区(index), 临时保存改动
- Git 的工作目录(Head,指向最近一次一提交的结果)
因此,基本的 Git 工作流程如下:
- 在本地的工作目录修改某些文件;
- 然后对修改后的文件进行快照,保存到暂存区域;
- 最后提交更新,将保存在暂存区域中的文件快照永久转存到 Git 的工作目录中。
添加
小白剧场:小王在目录里添加了个 test 文件,此时这个文件在处于已修改状态,改动的文件就在工作区。如果要记录这次改动,需要把文件添加到暂存区(可以理解成待保存清单)
一般来说 windows 系统下,会用红色表示工作区文件,绿色表示暂存区文件
上面的过程,从 工作区-->暂存区 使用 add 命令
add 这个命令有主要有两种用法
-
git add <file>
表示把某个文件添加到待提交清单中(即暂存区),如:git add test.txt
-
git add .
用"." 表示当前所有文件都添加到暂存区
添加之后,我们可以再查看下状态
提交
小白剧场:小王要保存 添加 test 这个文件的记录, 已经通过 add 把文件提交到暂存区了,现在想为这次保存生成一次记录,以便后面可以查看等操作。提交就是生成一次记录。
上面的过程,从 暂存区--> git仓库 使用 commit 命令
使用git commit -m "代码提交信息"
提交修改 -m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录
commit 后,改动已经在本地仓库的Head中了(Head指的是当前的分支指向,后面介绍分支的时候会说明)
我们开始修改 test 文件,并保存
可以通过git diff
查看差异
按照前面的步骤,做二次提交
查看日志
使用git log
来查看提交的日志
远程仓库操作
以上都是在本地仓库的操作,如果是多人协作时,就需要远程仓库来完成了。
小白剧场:小王先建立了 test 文件,小李也要在 test 文件改内容,所以小王得把这个文件放在远程仓库里,等小李用的时候,从远程仓库里获取就行了。
远程仓库和本地仓库的概念一样,只不过内容放在服务器上存储
Q:本地仓库如何关联到远程仓库中
git remote add origin xxx
xxx 为远端 Git 仓库的地址
此处我在 GitHub上建立了一个项目(用作远程仓库)
Git 是版本控制系统,GitHub 是在线的基于 Git 的代码托管服务,可创建公开的(public)代码仓库,很多优秀的开源项目都在 GitHub 上
如果你也想用 GitHub 来做版本管理,注册账号建立个仓库,后续的操作 GitHub都有良好的引导
回到主题
这行下面两句就可以将本地关联到远程了(地址使用的是新建的 GitHub 仓库地址)
git remote add origin https://github.com/tingtingtina/gitStudy.git
git push -u origin master
远程提交
小白剧场:小王已经建立好远程仓库了,并和本地内容做了关联,但是此时远端还没有内容,如果这部分已经核实要共享给他人协作了,就需要把本地的内容推送到远端仓库中
关联之后可以,我们改一下 test 内容,建立第三次提交
完成第三次commit后,看到有个push 的提示,当前改动已经在本地仓库中了,如果要把提交提到远端仓库则需执行git push
即可(第一次需要输入GitHub账号和密码)
Q:我们如何远端仓库的内容复制到本地呢?
小王已经把最新的 test 放在 远程仓库中了(也可以直接理解成服务器),小李怎么用呢?首先小李需要也需要打通这个渠道,在报了家门,配置好 git 之后,需要先把这个项目“克隆”一下
在目标文件夹下打开git bash git clone xxx
xxx 为远端仓库地址,当进度完成100% 项目就 clone 完成了,会在目标目录中看到项目目录
我们进入到项目目录中,查看log,和远端的一致
远端拉取
小李 clone 项目之后,会有和小王 一样的内容,此时小王又更新了文件,并且push了到远端了,小李怎么同步呢?
前面介绍了如何提交,现在介绍下如何拉取(同步)内容
我们先通过 GitHub提交一次(模拟多人协作时,其他人提交了内容)
修改下内容
写下日志 commit change
(PS: 发现有些浏览器对 GitHub 支持不太一样,如果在 GitHub 直接提交的话,建议使用 Google 浏览器)
此时改项目有4次提交
使用
git pull
来拉取内容完成后,再看看文件,确实更新了
使用 git push 和 git pull 进行推送和拉取更新都是在当前分支上操作的,目标也是远端对应的分支,默认Head 是 master 分支,也就是
push 是把 本地master分支 推送到 远程master 分支
pull 是从 远程master分支 拉取到 本地master 分支
对于分支的操作,我们下期再了解。
回顾总结
再来回顾下常见的 git 命令
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
git config -l
注:clone 和 init 都是仓库初始化的方式, 不同的是 init 是先建立本地仓库,如果有需要可以公开,比如发到GitHub上托管,多人协作等。而 clone 是已经有远程仓库了,克隆复制一份到本地
git clone xxx
从远端git仓库克隆一份到本地
git init
创建本地仓库
git add <file>
添加文件到缓存区(可以理解成提交想要提交的文件)
git add .
将工作区所有改动文件都提交到缓存区
git commit -m xxx
将缓存区的内容提交到本地仓库,xxx为提交日志
git push
本地仓库内容提交到远端
git pull
从远端获取更新到本地
git stash
查看当前文件状态(哪些在缓存区,哪些在工作区)
git log
查看日志信息
git remote add origin xxx // 本地仓库添加到远端
git push -u origin master
git diff
查看差别(了解即可),可以使用git diff commitid
查看与某次提交的改动(commitid, 提交的哈希值,通过git log 可知),如下面(一般输入前几位就够了)
本篇内容就到这里了,后面会继续了解 Git 的使用
系列文章传送门
Git 入门系列(一)- Git 概念/安装/基本操作/远程推送更新
Git 入门系列(二)- 修改管理 / 撤销操作 / 命令及区间关系
Git 入门系列(三)- 分支(上)创建与切换 / 合并 / 查看 / 删除
Git 入门系列(四)- 分支(下)合并解决冲突 / 远程分支
Git 入门系列(五)- stash 贮藏
Git 入门系列(六)- 标签 tag
Git 入门系列(七)- 可视化 Git 管理工具
Git 入门系列(八) - FAQ
欢迎关注个人公众号,【程序媛春哥的手记】