思维之海

——在云端,寻找我的星匙。

Git学习手册

Git学习手册。(基于Linux环境)

References

Git文档

Git指南

Linux下使用SSH密钥连接Github

SVN 教程 SVN,一种开源的版本管理工具(可以直接安装TortoiseSVN客户端)

Git安装

1
sudo apt-get install git

More: https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git

Git原理

Git只关心文件数据的整体是否发生变化

快照(Snapshot):数据存储的某一时刻的状态记录;备份则是数据存储的某一个时刻的副本。

快照与备份有什么区别?快照是备份的其中一种么?还是两种不同的概念 …

快照就是对被修改部分的增量存储。Git 对待数据更像是一个 快照流

版本控制

版本控制系统(VCS):一种记录一个或若干文件内容变化以及快速检阅修订情况的系统。

一个VCS能够有效管理一个多人参与、修改频繁的代码库。

本地版本控制系统:大多都是采用某种简单的数据库来记录文件的历次更新差异。

最流行的一种叫做rcs。工作原理:保存并管理文件补丁(patch)。文件补丁记录相邻版本的差异,通过文件补丁能够从源文件计算出相应的版本。

集中化的版本控制系统(CVCS):单一服务器,个体对服务器进行访问。在服务器的版本库中保存所有文件的修订版本。比较脆弱。

分布式版本控制系统(DVCS):多服务器多人写作,每个个体都保存完整的版本库

在这类系统中,像 Git,Mercurial,Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来

gitLinux开源系统维护时开发出来的。

Git校验

Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。

Git 中所有数据在存储前都计算校验和,然后以校验和来引用。

Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。

Git状态

Git 文件状态

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

Git 工作区域

  • Git 仓库:用来保存项目的元数据和对象数据库的地方。(克隆操作的执行位置)
  • 工作目录:对项目的某个版本独立提取出来的内容。
  • 暂存区域:一个(索引)文件,保存了下次将提交的文件列表信息,一般存储在 Git 仓库中。

Git 工作流程

  1. 在工作目录中修改文件。
  2. 暂存文件,将文件的快照放入暂存区域。(这个一般会自动检测)
  3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。(然后push更新到服务器)

Git 工作平台:Terminal终端(cmd

Git配置

1.6 起步 - 初次运行 Git 前的配置

用户配置:($代表从命令行输入)

1
2
$ git config [--global] user.name "John Doe"
$ git config [--global] user.email johndoe@example.com

编辑器:(可选,默认vim

1
$ git config --global core.editor emacs

查看配置信息:git config --list

通过输入 git config <key>: 来检查 Git 的某一项配置

1
2
$ git config user.name
John Doe

Git帮助

1
2
3
$ git help <verb>
$ git <verb> --help
$ man git-<verb>

例:(获得 config 命令的手册)

1
git help config

仓库获取

有两种取得 Git 项目仓库的方法。

  • 第一种是在现有项目或目录下导入所有文件到 Git 中;
  • 第二种是从一个服务器克隆一个现有的 Git 仓库。

导入

先进入目录,终端输入:(该命令将创建一个名为 .git 的子目录并初始化)

1
$ git init

如果目录内存在文件内容:(通过 git add 命令来实现对指定文件的跟踪,然后执行 git commit 提交)

1
2
3
$ git add *.c
$ git add LICENSE
$ git commit -m 'initial project version'

克隆

克隆仓库的命令格式是 git clone [url]

1
$ git clone https://github.com/libgit2/libgit2 [Rename]

Git 支持多种数据传输协议
上面的例子使用的是 https:// 协议,不过你也可以使用 git:// 协议或者使用 SSH 传输协议。
比如user@server:path/to/repo.git

文件更新

2.2 Git 基础 - 记录每次更新到仓库

git status:查看哪些文件处于什么状态。

使用 git status -s 命令或 git status --short 命令,你将得到一种更为紧凑的格式输出。

git add:跟踪文件,添加内容到下一次提交中。(如果staged文件又被改动,需要重新add)

跟踪就是先把文件变为tracked状态,从而进一步查看是否是modifiedstaged状态。

git add 命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。(git add .

只要在 Changes to be committed 这行下面的,就说明是已暂存(staged)状态。

.gitignore: 忽略文件$ cat .gitignore

一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。

需要正则表达式基础。

git diff:显示文件具体的修改内容。(查看尚未暂存的文件更新了哪些部分)

如果已经add了,则啥也看不到。

若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --cached 命令。

git checkout -- .:返回项目初始状态。(删去所有未保存的更改)

https://stackoverflow.com/questions/29007821/git-checkout-all-the-files

本地快照管理

Git 工具 - 储藏与清理

Git Stash 用法· GitHub

记一次误删 git stash 文件恢复操作

How to reverse apply a stash?

git stash save SnapshotName:保存本地快照。(同时本地的更改被移除!!!)

git stash list:列出保存的本地快照

git stash apply [SnapshotIndex]:应用快照到项目。(修改)

git stash show -p [SnapshotIndex] | git apply -R回退应用的快照。

git checkout Some.java:取消单个文件的更改(注意先save!)

git stash drop [SnapshotIndex]在栈上移除快照。(慎用,用tab键快速搞一下)

如果项目真的不小心就drop掉了。。如果在IDE界面打开了,则可以Ctrl+Z一下。

git stash pop [SnapshotIndex]:恢复并删除快照。

分支管理

查看分支

1
git branch

创建分支

1
git branch (branchname)

切换分支

1
git checkout (branchname)

创建分支并切换到分支:

1
git checkout -b (branchname)

删除分支

1
git branch -d (branchname)

合并分支

将指定分支合并到当前分支中去。

1
git merge (branchname)