Git - 基础知识

版本控制

一种记录一个或若干文件内容变化,以便将来查阅待定版本修改情况的系统。(VCS)

发展

本地版本控制系统

RCS: 在硬盘上保存补丁集(补丁是指文件修订前后的变化),通过应用所有的补丁。可以重新计算出各个版本的文件内容。

缺点:不同系统上的开发者无法协同工作

集中化的版本控制系统(CVCS)

CVS、Subversion、Perforce: 有一个单一的集中管理的服务器,保存所有文件的修订版本。协同工作的人们通过客户端连到服务器。取出最新的文件或者提交更新。

缺点: 中央服务器的单点故障。有丢失所有历史更新记录的风险。

分布式版本控制系统(DVCS)

Git、Mercurial、Bazaar、Darcs: 客户端不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。

导论

Git 和 Svn 的主要差别在于对待数据的方式。

其他版本控制工具存储的是每个文件与初代版本的差异,而 Git 存储项目随时间改变的快照。

Git 更像是把数据看作是对小型文件系统的一组快照。每当提交更新时,它主要是对当时的全部文件制作一个快照并保存这个快照的索引。如果文件没有修改,Git 不再重新存储,而是只保留一个链接指向之前存储的文件。

绝大数操作只需要访问本地文件和资源

因为本地磁盘上有项目的完整历史,不需要外连远程服务器。

保证完整性

Git 数据库中保存的信息都是以文件内容的哈希值(SHA-1)来索引,而不是文件名。因此在传送过程中丢失信息或者损坏文件都会被发现。

三种状态

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

三个工作区域

  • Git 仓库目录:Git 用来保存项目的元数据和对象数据库的地方(克隆代码时就是拷贝这里的数据)
  • 工作目录:对项目的某个版本提取出来的内容(从仓库的压缩数据中提取出的文件,放在磁盘里以供使用或修改)
  • 暂存区域:一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。

配置

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

  • /etc/gitconfig 文件:系统上每一个用户及他们仓库的通用配置
// 读写配置
git config --system
  • ~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户
// 读写配置
git config --global
  • .git/config:只针对该仓库

配置的变量会逐级覆盖(覆盖上一级别)

// 用户信息(针对项目的话去掉--global)
git config --global user.name 'jss'
git config --global user.email jingshs@qq.com

// 文本编辑器
git config --global core.editor emacs

// 检查配置信息
git config --list

// 检查某一项配置
git config user.name

// 获取帮助
git help <verb>
git <verb> --help
man git-<verb>

基础

获取 Git 仓库

  • 在现有项目或目录下导入所有文件到 Git 中
// 初始化仓库,创建了一个.git的文件
git init

// 跟踪指定文件
git add *.c
git add LICENSE

// 提交
git commit -m '~'
  • 克隆现有的仓库
// 支持多种数据传输协议
git clone (https:)(git:)(ssh传输)

克隆的是仓库服务器上的所有数据,包括每一个文件的每个版本。

使用 Git 时文件的生命周期

检查当前文件状态

使用 git status 命令

nothing to commit, working directory clean
// 所有已跟踪文件在上次提交后都未被更改过

Untracked files:~
nothing added to commit but untracked files present
// 当前目录下的未跟踪的文件

Changes not staged for commit
// 已跟踪文件的内容发生了变化,但还没有放到暂存区

Changes to be committed
// 文件已暂存待提交

如果在暂存区的文件又被修改了,那么文件会存在两种状态(后两种),两种状态对应的是不同的版本。

状态简览

git status -s || git status --short

?? a.txt    // 未跟踪文件
A  b.html   // 新添加到暂存区的文件
M  c.css    // 文件被修改了并放入了暂存区
 M d.js     // 文件被修改了还没放入暂存区
MM e.jsx    // 文件被修改并提交到暂存区后又在工作区中被修改了

忽略文件

创建.gitignore文件列出忽略的文件模式,使无用的文件不会出现在未跟踪文件列表。

GitHub上的.gitignore文件列表 https://github.com/github/gitignore

详细的格式规范可以参考
https://www.cnblogs.com/kevingrace/p/5690241.html

查看修改

git diff

通过文件补丁的格式显示具体哪些行发生了变化

git diff --cached || git diff --staged(版本限制)

查看已暂存的将要添加到下次提交的内容

跳过使用暂存区

git commit -a

自动把所有跟踪过的文件暂存起来一并提交

文件的删除、重命名

git rm (删除命令 —— 暂时不理解)

git mv file_form file_to

// 重命名相当于下面三条命令
mv file_from file_to
git rm
git add

查看提交历史

git log

// 显示每次提交的内容差异
git log -p

// 显示最近两次提交
git log -p -2

// 每次提交的简略的统计信息
git log --stat

// 指定使用不同于默认格式的方式展示
git log --pretty=oneline/short/full/fuller
git log --pretty=format:"%h - %an, %ar : %s"

// 查看最近两周的提交
git log --since=2.weeks

关于git log的常见选项、限制输出的选项和 git log --pretty=format的常用选项详情见git的官方文档。

撤销操作

git commit --amend -m '~'

修改最后一次提交的描述信息

// 在最后一次提交追加某个文件并且不改变描述信息
git add <file>
git commit --amend --no-edit

git reset HEAD <file>

取消暂存某个文件

git checkout -- <file>

撤销对某个文件的修改

查看远程仓库

// 列出制定的每一个远程服务器的简写
git remote

// 显示需要读写远程仓库使用的Git保存的简写与其对应的URL
git remote -v

// 添加一个新的远程Git仓库,同时制定一个简写
git remote add <shortname> <url>

// 拉取远程仓库中所有分支的引用,只是拉取数据,不会自动合并或修改当前工作
git fetch [remote-name] (branch-name)

// 从最初克隆的服务器上抓取数据并自动尝试合并到当前分支
git pull [remote-name] (branch-name)

// 推送提交到远程仓库
git push [remote-name] (branch-name)

// 查看远程仓库详细信息
git remote show [remote-name]

// 重命名远程仓库
git remote rename name_from name_to

// 删除远程分支
git remote rm [remote-name]

origin 是 Git 给克隆的仓库服务器的默认名字

别名

// git co 等同于 git checkout
git config --global alias.co checkout( git checkout => git co )

// git last显示最后一次提交
git config --global alias.last 'log -1 HEAS'

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

推荐阅读更多精彩内容

  • Git 基础 第一章 下载以及使用 下载地址: https://github.com/ 1.1配置git ​ ...
    LinDaiDai_霖呆呆阅读 738评论 1 8
  • 本文包括git的简介、基本使用方法、部分原理这么好用的工具必须安利大家使用,真的是越使用越觉得其强大的功能。用过图...
    Q琴酒阅读 798评论 0 1
  • Git 一般只添加数据 你执行的Git操作,几乎只往Git数据库中添加数据。很难让Git执行任何不可逆操作,或者让...
    人生若只如初见_89ef阅读 230评论 0 0
  • 简介 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 与常用的版本控制工具 ...
    闽越布衣阅读 2,737评论 0 18
  • Linux下更改系统时区及时间 然后重新设置下时间即可。 我们也可以通过系统中的命令来修改: 比较人性化,可以根据...
    JasonShi6306421阅读 252评论 0 0