学新通技术网

【Git 入门系列】Git 概念的安装、基本操作、远程推送更新

juejin 7 1
【Git 入门系列】Git 概念的安装、基本操作、远程推送更新

 

前言

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

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

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

Git 概念

什么是 Git?

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

什么是版本控制系统?

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

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

集中式 & 分布式

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

image.png

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

image.png

Git的安装

可以从 Git 官网直接下载安装程序 关于安装 Git,可以看这个链接 git-scm.com/book/zh/v2/…

安装完成后,打开git bash 输入 git --verison 有版本信息即安装成功

image.png

Git的基本使用

个人信息设置

这是因为 Git 是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和 Email 地址(用来分辨编辑者)

在开始菜单中找到 gitgit 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)

image.png 创建版本库会自动生成一个.git目录,该目录就是 Git 用来管理版本库的,这个目录默认是隐藏的。

查看状态

小白剧场:使用 Git 管理,文件状态变更会比较谨慎,还以实体仓库为例,有一批新增货物想入库,从打算入库到最后入库并生成记录是要经历几个过程的。

  • 首先是所有可能入库的部分,比如,T恤、衬衫、牛仔裤
  • 然后我决定先不要衬衫,先把T恤和牛仔裤入库,放在待入库清单中
  • 最后,把清单的内容放进仓库管理,并且说明一下,这次我添加了T恤 xx 件,牛仔裤 xx 条等等

想知道修改的文件处于哪个状态,就使用 status 查看

先新建一个名为 test 的文本,使用 git status 查看当前文件状态

image.png

Untracked files 表示当前文件没有添加到 Git 中(没有被 Git 管理),下一步使用git add 添加下文件

添加与提交

上面用实体仓库的例子说明了服装入库的过程,这也是Git 管理的工作流

Git 管理的工作流

image.png

在 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 . 用"." 表示当前所有文件都添加到暂存区 添加之后,我们可以再查看下状态

image.png

提交

小白剧场:小王要保存 添加 test 这个文件的记录, 已经通过 add 把文件提交到暂存区了,现在想为这次保存生成一次记录,以便后面可以查看等操作。提交就是生成一次记录

上面的过程,从 暂存区 git仓库 使用 commit 命令

使用git commit -m "代码提交信息" 提交修改 -m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录

image.png

commit 后,改动已经在本地仓库的Head中了(Head指的是当前的分支指向,后面介绍分支的时候会说明)

我们开始修改 test 文件,并保存

image.png

可以通过git diff查看差异

image.png

按照前面的步骤,做二次提交

image.png

查看日志

使用git log 来查看提交的日志

image.png

远程仓库操作

以上都是在本地仓库的操作,如果是多人协作时,就需要远程仓库来完成了。

小白剧场:小王先建立了 test 文件,小李也要在 test 文件改内容,所以小王得把这个文件放在远程仓库里,等小李用的时候,从远程仓库里获取就行了。 远程仓库和本地仓库的概念一样,只不过内容放在服务器上存储

Q:本地仓库如何关联到远程仓库中

git remote add origin xxx xxx 为远端 Git 仓库的地址 此处我在 GitHub上建立了一个项目(用作远程仓库)

Git 是版本控制系统,GitHub 是在线的基于 Git 的代码托管服务,可创建公开的(public)代码仓库,很多优秀的开源项目都在 GitHub 上

image.png 如果你也想用 GitHub 来做版本管理,注册账号建立个仓库,后续的操作 GitHub都有良好的引导

image.png 回到主题

这行下面两句就可以将本地关联到远程了(地址使用的是新建的 GitHub 仓库地址)

git remote add origin https://github.com/tingtingtina/gitStudy.git
git push -u origin master

image.png

远程提交

小白剧场:小王已经建立好远程仓库了,并和本地内容做了关联,但是此时远端还没有内容,如果这部分已经核实要共享给他人协作了,就需要把本地的内容推送到远端仓库中

关联之后可以,我们改一下 test 内容,建立第三次提交

image.png

完成第三次commit后,看到有个push 的提示,当前改动已经在本地仓库中了,如果要把提交提到远端仓库则需执行git push 即可(第一次需要输入GitHub账号和密码)

image.png

Q:我们如何远端仓库的内容复制到本地呢?

小王已经把最新的 test 放在 远程仓库中了(也可以直接理解成服务器),小李怎么用呢?首先小李需要也需要打通这个渠道,在报了家门,配置好 git 之后,需要先把这个项目“克隆”一下

在目标文件夹下打开git bash git clone xxx xxx 为远端仓库地址,当进度完成100% 项目就 clone 完成了,会在目标目录中看到项目目录

image.png

我们进入到项目目录中,查看log,和远端的一致

image.png

image.png

远端拉取

小李 clone 项目之后,会有和小王 一样的内容,此时小王又更新了文件,并且push了到远端了,小李怎么同步呢?

前面介绍了如何提交,现在介绍下如何拉取(同步)内容 我们先通过 GitHub提交一次(模拟多人协作时,其他人提交了内容) 修改下内容

image.png

image.png

写下日志 commit change (PS: 发现有些浏览器对 GitHub 支持不太一样,如果在 GitHub 直接提交的话,建议使用 Google 浏览器)

此时该项目有4次提交

image.png

使用git pull来拉取内容

image.png

完成后,再看看文件,确实更新了

image.png

使用 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 可知),如下面(一般输入前几位就够了)

image.png

本篇内容就到这里了,后面会继续了解 Git 的使用

本文出至:学新通技术网

标签: