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 [email protected]

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

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

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

// 获取帮助
git help 
git  --help
man git-

基础

获取 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 
git commit --amend --no-edit

git reset HEAD

取消暂存某个文件

git checkout --

撤销对某个文件的修改

查看远程仓库

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

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

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

// 拉取远程仓库中所有分支的引用,只是拉取数据,不会自动合并或修改当前工作
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'

你可能感兴趣的:(Git - 基础知识)