# Git基本操作

# 安装使用Git

# 安装Git

Windows下安装

  1. Git 官网 (opens new window) 上下载 Git 客户端并安装到 C 盘
  2. 将 Git 目录下的 bin(如 C:\Program Files (x86)\Git\bin )添加到 PATH 环境变量

打开环境变量设置:

此电脑 > 属性 > 高级系统设置 > 环境变量

选择 PATH, 点击『编辑』,将 bin 的路径( C:\Program Files (x86)\Git\bin )添加到变量值后面

Linux下安装

在 Linux 上安装预编译好的 Git 二进制安装包,可以直接用系统提供的包管理工具。

在 Fedora 上用 yum 安装:

$ yum install git-core

在 Ubuntu 这类 Debian 体系的系统上,可以用 apt-get 安装:

$ apt-get install git

Mac下安装

新版 Mac OS 自带 Git,在终端输入:

$ git --version

可以查看当前 Git 版本。如果没有安装 Git ,可以参考以下方式:

  • 使用 homebrew 安装。运行下面命令安装 homebrew:
  $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • homebrew 安装好后,在终端输入$ brew install git 命令完成 Git 安装。

  • 通过 MacPorts 安装。先安装好 MacPortsh ,再运行用下面的命令安装 Git:

  $ sudo port install git-core +svn +doc +bash_completion +gitweb

注:为了便于阅读,命令前面都有【$】符号,实际在 Linux 和 Mac 终端中输入命令时并不需要键入此符号。

# 用户信息设置

安装完 Git 后应该及时设置你的用户名称与邮件地址,此后每次 Git 的提交都会使用这些信息。在终端输入一下命令即可设置你的用户信息。

$ git config --global user.name "你的名称"

$ git config --global user.email "你的邮箱"

账户及用户信息显示状态示例

例如你的 DevOps平台账户用户名叫【xiaojian】,【邮箱 – xiaojian@devOps.work 】。当你推送代码到 代码库 后,个人工作台审计显示如下图:

An image

头像和xiaojian是DevOps平台账户的用户头像和用户名,也是配置的提交代码时的用户名称信息。

注意:Git 配置的用户信息可以和DevOps平台账户名称一致,也可以不一致,建议填写为DevOps平台用户名和注册邮箱,以便更好的协作。

# Git快速入门

什么是Git存储库?简单的来说,一个Git仓库是项目的一个虚拟存储。它允许您保存代码的版本,您可以在需要时访问它们。若你理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余。 在开始学习 Git 的时候,请努力分清你对其它版本管理系统的已有认识,如 Subversion 和 Perforce 等;这么做能帮助你使用工具时避免发生混淆。 Git 在保存和对待各种信息的时候与其它版本控制系统有很大差异,尽管操作起来的命令形式非常相近,理解这些差异将有助于防止你使用中的困惑。

直接记录快照,而非差异比较

Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方法。 概念上来区分,其它大部分系统以文件变更列表的方式存储信息。 这类系统(CVS、Subversion、Perforce、Bazaar 等等)将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。

Git 不按照以上方式对待或保存数据。 反之,Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流。

几乎所有操作都是本地执行

在 Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。 如果你习惯于所有操作都有网络延时开销的集中式版本控制系统,Git 在这方面会让你感到速度之神赐给了 Git 超凡的能量。 因为你在本地磁盘上就有项目的完整历史,所以大部分操作看起来瞬间完成。

举个例子,要浏览项目的历史,Git 不需外连到服务器去获取历史,然后再显示出来——它只需直接从本地数据库中读取。 你能立即看到项目历史。 如果你想查看当前版本与一个月前的版本之间引入的修改,Git 会查找到一个月前的文件做一次本地的差异计算,而不是由远程服务器处理或从远程服务器拉回旧版本文件再来本地处理。

这也意味着你离线或者没有 VPN 时,几乎可以进行任何操作。 如你在飞机或火车上想做些工作,你能愉快地提交,直到有网络连接时再上传。 如你回家后 VPN 客户端不正常,你仍能工作。 使用其它系统,做到如此是不可能或很费力的。 比如,用 Perforce,你没有连接服务器时几乎不能做什么事;用 Subversion 和 CVS,你能修改文件,但不能向数据库提交修改(因为你的本地数据库离线了)。 这看起来不是大问题,但是你可能会惊喜地发现它带来的巨大的不同。

Git 保证完整性

Git 中所有数据在存储前都计算校验和,然后以校验和来引用。 这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。 这个功能建构在 Git 底层,是构成 Git 哲学不可或缺的部分。 若你在传送过程中丢失信息或损坏文件,Git 就能发现。

Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 这是一个由 40 个十六进制字符(0-9 和 a-f)组成字符串,基于 Git 中文件的内容或目录结构计算出来。 SHA-1 哈希看起来是这样:

25c9da7662252987aa493b52f8696cd6d3b00373

Git 中使用这种哈希值的情况很多,你将经常看到这种哈希值。 实际上,Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。Git一般只添加数据 你执行的 Git 操作,几乎只往 Git 数据库中增加数据。 很难让 Git 执行任何不可逆操作,或者让它以任何方式清除数据。 同别的 VCS 一样,未提交更新时有可能丢失或弄乱修改的内容;但是一旦你提交快照到 Git 中,就难以再丢失数据,特别是你定期的推送数据库到其它仓库。

这使得我们使用 Git 成为一个安心愉悦的过程,因为我们深知可以尽情做各种尝试,而没有把事情弄糟的危险。 更深度探讨 Git 如何保存数据及恢复丢失数据的话题,请参考撤消操作。

三种状态

如果你希望后面的学习更顺利,记住下面这些关于 Git 的概念。 Git 有三种状态,你的文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。 已提交表示数据已经安全的保存在本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

由此引入 Git 项目的三个工作区域的概念:Git 仓库、工作目录以及暂存区域。

Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。

工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。

暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作“索引”,不过一般说法还是叫暂存区域。

基本的 Git 工作流程如下:

  1. 在工作目录中修改文件。

  2. 暂存文件,将文件的快照放入暂存区域。

  3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。

如果 Git 目录中保存着的特定版本文件,就属于已提交状态。 如果作了修改并已放入暂存区域,就属于已暂存状态。 如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。 在Git 基础中,你会进一步了解这些状态的细节,并学会如何根据文件状态实施后续操作,以及怎样跳过暂存直接提交。

# 命令行

Git 有多种使用方式。 你可以使用原生的命令行模式,也可以使用 GUI 模式,这些 GUI 软件也能提供多种功能。 在本书中,我们将使用命令行模式。 这是因为首先,只有在命令行模式下你才能执行 Git 的 所有命令,而大多数的 GUI 软件只实现了 Git 所有功能的一个子集以降低操作难度。 如果你学会了在命令行下如何操作,那么你在操作 GUI 软件时应该也不会遇到什么困难,但是,反之则不成立。 此外,由于每个人的想法与侧重点不同,不同的人常常会安装不同的 GUI 软件,但 所有 人一定会有命令行工具。

假如你是 Mac 用户,我们希望你懂得如何使用终端(Terminal);假如你是 Windows 用户,我们希望你懂得如何使用命令窗口(Command Prompt)或 PowerShell。 如果你尚未掌握以上技能,我们建议你先停下来快速学习一下,本书中的讲述和举例将用到这些技能

# 安装Git

在你开始使用 Git 前,需要将它安装在你的计算机上。 即便已经安装,最好将它升级到最新的版本。 你可以通过软件包或者其它安装程序来安装,或者下载源码编译安装。 在 Windows 上安装

请查看安装使用Git

在 Linux 上安装

请查看安装使用Git

在 Mac 上安装

请查看安装使用Git

从源代码安装 有人觉得从源码安装 Git 更实用,因为你能得到最新的版本。 二进制安装程序倾向于有一些滞后,当然近几年 Git 已经成熟,这个差异不再显著。

如果你想从源码安装 Git,需要安装 Git 依赖的库:curl、zlib、openssl、expat,还有libiconv。 如果你的系统上有 yum (如 Fedora)或者 apt-get(如基于 Debian 的系统),可以使用以下命令之一来安装最小化的依赖包来编译和安装 Git 的二进制版:

  $ sudo yum install curl-devel expat-devel gettext-devel \ openssl-devel zlib-devel $ sudo apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \ libz-dev libssl-dev

为了能够添加更多格式的文档(如 doc, html, info),你需要安装以下的依赖包:

  $ sudo yum install asciidoc xmlto docbook2x $ sudo apt-get install asciidoc xmlto docbook2x

当你安装好所有的必要依赖,你可以继续从几个地方来取得最新发布版本的 tar 包。 你可以从 Kernel.org 网站获取,网址为 https://www.kernel.org/pub/software/scm/git,或从 GitHub 网站上的镜像来获得,网址为 https://github.com/git/git/releases。 通常在 GitHub 上的是最新版本,但 kernel.org 上包含有文件下载签名,如果你想验证下载正确性的话会用到。

接着,编译并安装:

  $ tar -zxf git-2.0.0.tar.gz $ cd git-2.0.0 $ make configure $ ./configure --prefix=/usr $ make all doc info $ sudo make install install-doc install-html install-info

完成后,你可以使用 Git 来获取 Git 的升级:

  $ git clone git://git.kernel.org/pub/scm/git/git.git

# 初次运行 Git 前的配置

既然已经在系统上安装了 Git,你会想要做几件事来定制你的 Git 环境。 每台计算机上只需要配置一次,程序升级时会保留配置信息。 你可以在任何时候再次通过运行命令来修改它们。

Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:

  1. /etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 --system选项的 git config 时,它会从此文件读写配置变量。

  2. ~/.gitconfig~/.config/git/config 文件:只针对当前用户。 可以传递 --global选项让 Git 读写此文件。

  3. 当前使用仓库的 Git 目录中的 config 文件(就是 .git/config):针对该仓库。

每一个级别覆盖上一级别的配置,所以 .git/config的配置变量会覆盖 /etc/gitconfig中的配置变量。

在 Windows 系统中,Git 会查找 $HOME 目录下(一般情况下是 C:\Users$USER)的 .gitconfig文件。 Git 同样也会寻找 /etc/gitconfig文件,但只限于 MSys 的根目录下,即安装 Git 时所选的目标位置。

用户信息

当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改:

 $ git config --global user.name "John"
 $ git config --global user.email john@example.com

再次强调,如果使用了 --global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用那些信息。 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 --global 选项的命令来配置。

很多 GUI 工具都会在第一次运行时帮助你配置这些信息。

文本编辑器

既然用户信息已经设置完毕,你可以配置默认文本编辑器了,当 Git 需要你输入信息时会调用它。 如果未配置,Git 会使用操作系统默认的文本编辑器,通常是 Vim。 如果你想使用不同的文本编辑器,例如 Emacs,可以这样做:

$ git config --global core.editor emacs
注意⚠️ Vim 和 Emacs 是像 Linux 与 Mac 等基于 Unix 的系统上开发者经常使用的流行的文本编辑器。 如果你对这些编辑器都不是很了解或者你使用的是 Windows 系统,那么可能需要搜索如何在 Git 中配置你最常用的编辑器。 如果你不设置编辑器并且不知道 Vim 或 Emacs 是什么,当它们运行起来后你可能会被弄糊涂、不知所措。

检查配置信息

如果想要检查你的配置,可以使用 git config --list 命令来列出所有 Git 当时能找到的配置。

$ git config --list user.name=John  user.email=john@example.com

你可能会看到重复的变量名,因为 Git 会从不同的文件中读取同一个配置(例如:/etc/gitconfig~/.gitconfig)。 这种情况下,Git 会使用它找到的每一个变量的最后一个配置。

你可以通过输入 git config: 来检查 Git 的某一项配置

$ git config user.name John

# 获取帮助

若你使用 Git 时需要获取帮助,有三种方法可以找到 Git 命令的使用手册:

$ git help
$ git  --help
$ man git-

# 总结

你应该已经对 Git 是什么、Git 与你可能正在使用的集中式版本控制系统有何区别等问题有了基本的了解。 现在,在你的个人系统中应该也有了一份能够工作的 Git 版本。 是时候开始学习有关 Git 的基础知识了。

# Git分支管理

# Git 分支介绍

分支一方面类似科幻电影里面经常出现的平行宇宙,每个分支的代码版本都是独立演进的,分支之间的代码版本完全不会干扰另外一个代码版本的开发。但是,与平行宇宙不同的一点是,分支之间还能合并。

Git 的分支相比 SVN 要轻量很多,这是因为 Git 分支并不是复制一个新仓库,而是为一个分支存储一个指针,这个指针将指向某个提交对象。没错,这就和数据结构中常见的指针链表一样。所以 Git 的分支只是指针,并没有将仓库进行复制,每次提交都会让当前的分支向后移动,指向最后一次提交的对象。当你在切换分支时,Git 也只是改变指向当前所在分支的特殊指针 HEAD,所以可以快速地在各个分支之间进行切换。

分支的功能

分支在实际中可以方便的隔离开发。 假设你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

# 本地分支管理

创建分支

在本地终端运行 git branch【分支名称】 新建一个分支,如新建一个名为【dev—test】的分支命令如下:

$ git branch dev-test

切换分支

创建完分之后使用git branch命令查看分支:

$ git branch

可以看到【 master 】分支上有一个【*】,说明当前是处在【 master 】分支上,也就是说创建完分支后需要我们手动切换到【dev-test】,使用git checkout 【分支名称】命令:

$ git checkout dev-test

再使用git branch命令查看,会发现已经切换到 【dev-test】分支:

$ git branch

创建和切换分支两条命令可以合起来,使用git checkout -b 【分支名称】命令可以创建一个分支并切换到此分支上。

分支与标签

$ git branch                   #显示所有本地分支
$ git checkout     #切换到指定分支和标签
$ git branch       #创建新分支
$ git branch -d        #删除本地分支
$ git tag                      #列出所有本地标签
$ git tag             #基于最新提交创建标签
$ git tag -d          #删除标签

合并与衍合

$ git merge         #合并指定分支到当前分支
$ git rebase        #衍合指定分支到当前分支

远程操作

$ git remote -v                   #查看远程版本库信息
$ git remote show         #查看指定远程版本库信息
$ git remote add     #添加远程版本库
$ git fetch               #从远程库获取代码
$ git pull        #下载代码及快速合并
$ git push        #上传代码及快速合并
$ git push  :  #删除远程分支或标签
$ git push --tags                       #上传所有标签

更多内容请查看 Git文档 (opens new window)

# 在线分支管理

详情参考 【使用说明】中的 分支

# 在线合并分支

DevOps平台建议您以评审的方式合并分支,详情参考 【使用说明】中的 评审

# Git仓库管理

# 仓库和项目的关系

DevOps平台提供了Git代码托管和项目管理聚合式服务,一个项目对应一个代码库,直接新建代码库即可。项目地址即是Git仓库的地址。 项目地址分类 项目地址分为HTTPS和SSH两种方式,点击右上角clone按钮对应有两种方式的代码库地址。

An image

获取项目地址 进入项目,点击代码库——>文件,点击右上角clone按钮,选择一个对应地址,点击复制代码库地址

An image

或者在代码库首页仓库URl,选择认证方式点击复制代码库地址

An image

# 本地仓库

创建本地仓库 切换路径到目标目录,执行:$ git init命令行中会出现以下提示

  Initialized empty Git repository in X:/XXX/.git/

表示 Git 仓库创建成功,当前目录中会出现一个 .git 文件夹,所有 Git 需要的数据和资源都存放在这个目录中。 克隆远程仓库到本地 可以直接通过 git clone 命令来直接复制远程仓库到本地目录:

  git clone https://{平台访问地址}/git/企业域名/目录名称/仓库名称

运行该命令之后,当前目录下会出现一个刚克隆下来的仓库名的文件夹,其中包含一个 .git 文件夹,用于保存下载下来的所有版本记录,然后从中取出最新版本的文件拷贝。如果希望在克隆的时候,自己定义新建文件夹的名称,可以在上面的命令末尾指定

  git clone https://{平台访问地址}/git/企业域名/目录名称/仓库名称  新文件名称

注意: 上述 clone 使用的是 HTTPS 的方式,代码库 支持 SSH,HTTPS 2种方式获取代码库

# 远程仓库

添加远程仓库 代码库支持以下 HTTPS和SSH 两种协议对 Git 仓库进行访问,建议使用 SSH 协议,查看 账户 SSH 配置

  1. 创建远程项目

  2. 获取项目地址

  3. 给远程仓库一个别名,使用

      git remote add  remote-name url
    

    命令,以 HTTPS 地址为例运行:

      $ git remote add origin https://{平台访问地址}/git/gtt/qa/test
    

    【remote-name】是给远程仓库起的别名,默认是【origin】,用户可以根据自己的需求自定义。例如一个gtt企业下有一个qa/test代码库。添加其为远程仓库,并取别名为【gtt】,后续可以用字符串【gtt】指代对应的远程仓库。接下来用 git remote add命令来查看当前添加的远程仓库:$ git remote -v得到以下结果:

      origin	https://{平台访问地址}/git/gtt/qa/test (fetch)
      origin	https://{平台访问地址}/git/gtt/qa/test (push)
    

从远程仓库获取数据 可以用下面的命令从远程仓库抓取数据到本地:

$ git fetch 【remote-name】

推送数据到远程仓库 使用 git push 【remote-name】【branch-name】可以将本地仓库中的数据推送到远程仓库,如:$ git push origin master会将本地的仓库数据推送到远程仓库的【master】分支。 重命名远程仓库 可以用 git remote rename 命令修改某个远程仓库在本地的简称,比如想把 origin 改成 origin,可以这么运行:

$ git remote rename origin origin

解除远程仓库关联 比如要解除和远程仓库【origin】的关联,运行:

$ git remote rm origin

注意,此命令是解除了本地仓库和远程仓库的关联,并不是删除了远程仓库的数据。

更多 Git 命令请查看 Git 常用命令速查表。

# 清空仓库

进入代码库——>设置——>运维操作,点击删除代码库,输入代码库名称,点击删除。

An image

# 推送文件到远程仓库

# 管理本地仓库文件

简单的描述,在 Git 中文件有三种状态:已修改(modified)、已暂存(staged)、已提交(committed);用 Git 管理文件也可以简单的理解为三个步骤:修改文件、跟踪文件、提交文件

以下采取示例的方式简述用 Git 管理本地仓库文件。

修改文件

修改文件即是对文件的添加、编辑、删除等等,和普通修改文件的方法一致。

选择合适的地方创建一个新目录【learn-git】,新建【readme.md】 和【learn-git.txt】 文件,在文中写入【I am Chinese technology】这句话并保存。

跟踪文件(git add)

创建文件和修改文件后需要把文件添加到仓库,即对文件进行跟踪。一次性把一个文件或多个文件添加到仓库都可以,用到的命令都是 git add

添加一个文件时直接在终端输入 git add后面空一格输入完整的文件名(包含后缀,如.txt):

$ git add readme.md

添加多个文件也类似,git add后面空格输入完整的文件名,文件名之间用空格分隔:

$ git add readme.md learn_git.txt

添加当前仓库里的所有文件时直接在终端输入$ git add . ,注意此处末尾的.不要遗漏。

提交文件(git commit)git commit命令把文件提交到仓库,一次性会提交所有你已经添加的文件:

$ git commit -m "wrote a readme and a learn_git file"

提交命令为git commit-m后面引号中的内容是你的提交说明,下面几行是终端的返回结果。每次提交文件时都写个提交说明,以便清楚地了解做了什么修改。

$符号是使用终端时自动输入的,用户并不需要输入此符号。

查看文件状态(git status) 如何知道一个文件处于哪种状态?使用git statu命令查看文件状态。

当前仓库里任何文件都没有被跟踪时返回结果如下:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'
nothing to commit, working directory clean

当文件已跟踪但没有提交到仓库时返回结果如下:

$ git status
On branch master
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

    modified:   learn_git.txt
    modified:   readme.md
no changes added to commit (use "git add" and/or "git commit -a")

当文件已跟踪且已经提交到仓库时返回结果如下:

$ git status
On branch master
nothing to commit, working tree clean

使用 Git 管理文件时,每次结束工作前请依次执行git addgit commit命令将文件提交到仓库。

随着用户深入使用 Git,会了解到更多 Git 知识,点击查看 Git 文件状态介绍 和 Git 常用命令速查表。

# 推送文件到远程仓库

  1. 添加远程仓库查看 添加远程仓库帮助。

  2. 推送代码到远程仓库

    在终端运行命令

     git push
    

    将文件推送到远程仓库:

     $ git push origin master
     Counting objects: 8, done.
     Delta compression using up to 4 threads.
     Compressing objects: 100% (4/4), done.
     Writing objects: 100% (8/8), 626 bytes | 626.00 KiB/s, done.
     Total 8 (delta 0), reused 0 (delta 0)
     To https://{平台访问地址}/git/企业域名/目录名称/仓库名称
     * [new branch]      master -> master
    

git push是推送命令,实际上是把本地的master分支推送到了远程仓库,相当于在远程有了一个代码仓库的备份。

使用 Git 管理文件时,每次结束工作前请依次执行git addgit commitgit push命令将文件推送到代码库远程仓库。

# Git 文件状态介绍

  • 已修改(modified) ———— 表示修改了文件,但还没保存到数据库中
  • 已暂存(staged) ———— 表示对一个已修改文件的当前版本做了追踪,使之包含在下次提交的快照中
  • 已提交(committed) ———— 表示数据已经安全的保存在本地数据库中

初次克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,且状态为未修改。 在编辑过某些文件之后,Git 将这些文件标为已修改。我们逐步把这些修改过的文件放到暂存区域,直到最后一次性提交所有这些暂存起来的文件,如此重复。使用 Git 时的文件状态变化周期如图所示。

# Git 常用命令速查表

创建版本库

$ git clone                   #克隆远程版本库
$ git init                         #初始化本地版本库

修改和提交

$ git status                       #查看状态
$ git diff                         #查看变更内容
$ git add .                        #跟踪所有改动过的文件
$ git add                    #跟踪指定的文件
$ git mv                 #文件改名
$ git rm                     #删除文件
$ git rm --cached            #停止跟踪文件但不删除
$ git commit -m "commit messages"  #提交所有更新过的文件
$ git commit --amend               #修改最后一次改动

查看提交历史

$ git log                    #查看提交历史
$ git log -p           #查看指定文件的提交历史
$ git blame            #以列表方式查看指定文件的提交历史

撤销

$ git reset --hard HEAD      #撤销工作目录中所有未提交文件的修改内容
$ git checkout HEAD    #撤销指定的未提交文件的修改内容
$ git revert         #撤销指定的提交
$ git log --before="1 days"  #退回到之前1天的版本

分支与标签

$ git branch                   #显示所有本地分支
$ git checkout     #切换到指定分支和标签
$ git branch       #创建新分支
$ git branch -d        #删除本地分支
$ git tag                      #列出所有本地标签
$ git tag             #基于最新提交创建标签
$ git tag -d          #删除标签

合并与衍合

$ git merge         #合并指定分支到当前分支
$ git rebase        #衍合指定分支到当前分支

远程操作

$ git remote -v                   #查看远程版本库信息
$ git remote show         #查看指定远程版本库信息
$ git remote add     #添加远程版本库
$ git fetch               #从远程库获取代码
$ git pull        #下载代码及快速合并
$ git push        #上传代码及快速合并
$ git push  :  #删除远程分支或标签
$ git push --tags                       #上传所有标签

更多内容请查看 Git文档 (opens new window)

# Git LFS大文件支持

代码库 支持 Git LFS(Git Large File Storage)扩展,编码过程中大文件提交请使用 Git LFS。

使用 Git LFS 提交的大文件不占用 Git 仓库存储空间,理论上可以提交的单个文件大小无上限。

本代码托管平台内,Git LFS 跟踪的文件详情会显示一个提示,以指示文件是存储为 LFS 指针文件。 LFS

首先 开启代码库的【大文件存储】开关。

LFS

安装 Git LFS

注意:安装 Git LFS 需要 Git 的版本不低于 1.8.5。

Windows

  1. 下载安装 windows installer (opens new window)
  2. 运行 windows installer
  3. 在命令行执行
 git lfs install

Linux

 1. curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
 2. sudo apt-get install git-lfs
 3. git lfs install

Mac

  1. 安装 Homebrew
  /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
 brew install git-lfs
  git lfs install

# 使用 Git LFS

追踪文件

没有特别说明的情况下,Git LFS 不会处理大文件问题,使用一下命令进行大文件追踪。

git lfs track

追踪单个文件

例如追踪一个名为【img.png】的文件,使用命令

git lfs track "img.png"

追踪同一后缀的所有文件

如果要追踪所有后缀为【png】的文件,使用命令

git lfs track "*.png"

运行此命令后,不但会追踪已存在的所有后缀为【png】的文件,也包括以后创建的【png】文件。

查看正在追踪的文件模式(patterns)

运行命令

git lfs track

提交大文件 提交代码时需要将【.gitattributes 】文件也提交到仓库,提交完成后,执行以下命令可以查看 LFS 跟踪的文件列表。

git lfs ls-files

将代码 push 到远程仓库后,LFS 跟踪的文件会以【Git LFS】的形式显示:

$ git push origin master
Git LFS: (2 of 2 files)12.58 MB / 12.58 MB
Counting objects: 2, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 548 bytes | 0 bytes/s, done.
Total 5 (delta 1), reused 0 (delta 0)
To https://{平台访问地址}/git/企业域名/目录名称/仓库名称
67fcf6a..47b2002  master -> master

克隆包含 Git LFS 文件的远程仓库 使用 git lfs clone 命令 clone 包含【Git LFS】文件的远程仓库到本地。

$ git lfs clone https://{平台访问地址}/git/企业域名/目录名称/仓库名称
Cloning into '仓库名'
remote: Counting objects: 16,done.
remote: Compressing objects: 100% (12/12),done.
remote: Total 16 (delta 3), reused 9 (delta 1)
Receiving objects: 100% (16/16),done.
Resolving deltas: 100% (3/3),done.
Checking connectively...done.
Git LFS: (4 of 4 files) 0 B / 100 B

了解更多 Git LFS 的使用,可执行命令查看帮助。

git lfs help

删除LFS对象

使用 git filter-repo 从本地仓库中删除对象。
删除您从 .gitattributes 文件中删除的对象的相关 LFS 行并提交这些更改。

代码托管平台上的LFS对象
平台内的lfs文件点击查看时,其实是 Git LFS 指针而不是实际对象。例如,LFS 指针如下所示:

version https://git-lfs.github.com/spec/v1
oid sha256:3ea5dd307f195f449f0e08234183b82e92c3d5f4cff11c2a6bb014f9e0de12aa
size 177735