Git 入门系列(一)- Git 概念/安装/基本操作/远程推送更新

Git 用于管理代码提交,是开发必不可少的环节,可以有效保证功能正向迭代,解决多人开发配合问题。

看不懂?

没关系,往下看 ↓↓↓

小白剧场:
老大让小王和小李共同完成一套软件开发,小王做功能 1,小李做功能 2。

  • 在一个项目中小李不能等小王做完了,把项目文件给小李再做吧。可是一起做的话,怎么把两个人的代码放到一起呢?
  • 小王开发过程中已经先写了些基本方法,小李开发的时候想用,怎么办呢,再写一个?
  • 两个人都改了同一个文件,谁改了哪里呢,为什么改呢,那部分是最新的呢?
  • 小组新来个成员小张,一同参与开发,把整个工程复制给他?
  • 老大想让小张做功能 3,功能 3 开发完了,老大说,这个功能不要了,小张:…… (我好难啊)

Git 就用来解决类似这些问题的!

Git 概念

什么是 Git?

  • Git 是一个分布式版本控制系统

什么是版本控制系统?

版本控制系统是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。版本控制系统不仅可以应用于软件源代码的文本文件,而且可以对任何类型的文件进行版本控制。

简短来说,就是帮助我们管理文件的,文件的创建、更新和删除都可以被记录,代替备份,再备份

集中式 & 分布式

  • 为了让不同系统上的开发者能够协同工作,集中化的版本控制系统应运而生(CVCS)。这类系统都有一个单一的集中管理的服务器,保存所有文件的修订版本。而协同工作的人们都通过客户端连接到这台服务器,获取最新的文件或者提交更新。集中化的版本控制系统,最显而易见的缺点是中央服务器的单点故障问题。如果宕机,那么就会出现谁都无法提交更新的情况,那么也就无法协同工作;如果磁盘发生故障,而备份又不够即时,那么就有丢失数据的风险,最坏的情况是丢失整个项目的历史更改记录。典型的例子就是SVN。因此,分布式版本控制系统问世了。


    image
  • 在分布式版本控制系统(DVCS)中,客户端不仅仅是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。所以每一次提取的操作,都是对代码仓库的完整备份,因此也就不必担心协同工作用的服务器发生故障。经典的列子就是Git。


    image

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 在管理项目时,文件流转的三个工作区域是:

  1. 本地仓库(即工作目录 working dir,也就是项目的源文件)
  2. 暂存区(index), 临时保存改动
  3. Git 的工作目录(Head,指向最近一次一提交的结果)

因此,基本的 Git 工作流程如下:

  1. 在本地的工作目录修改某些文件;
  2. 然后对修改后的文件进行快照,保存到暂存区域;
  3. 最后提交更新,将保存在暂存区域中的文件快照永久转存到 Git 的工作目录中。

添加

小白剧场:小王在目录里添加了个 test 文件,此时这个文件在处于已修改状态,改动的文件就在工作区。如果要记录这次改动,需要把文件添加到暂存区(可以理解成待保存清单)
一般来说 windows 系统下,会用红色表示工作区文件,绿色表示暂存区文件

上面的过程,从 工作区-->暂存区 使用 add 命令
add 这个命令有主要有两种用法

  1. git add <file> 表示把某个文件添加到待提交清单中(即暂存区),如:git add test.txt
  2. 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

欢迎关注个人公众号,【程序媛春哥的手记】

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348

推荐阅读更多精彩内容

  • 但我并不想在阿细面前炫耀,毕竟她处境艰难,我继续分析她的情况: “我觉得对于你来说,第一条其实没什么太大的问题,既...
    Hushcookies阅读 308评论 0 0
  • 剪蹬大缸有感 剪纸\文 蓝玫 你 原来藏在哪 曾苦苦追寻 撕毁了一张又一张日历 总也找寻不到你的足迹 今天 拿起剪...
    蓝玫馨香阅读 174评论 0 2
  • 有个人一天碰到上帝...... 上帝,大发善心打算给那人一个愿望 上帝问: “你有什么愿望吗?” 那个人想了想.....
    绿鼻子的一生阅读 153评论 2 4
  • 文|快乐天成 清晨当黎明的太阳从东方升起,万物从沉睡中苏醒,预示着美好一天开始了一个崭新的日子正向你走来,拥抱吧!...
    快乐天成阅读 224评论 1 6