git基本操作

学习 git 已经有一段时间了,对 git 的基本指令也算是有一定的了解了,这里把比较常用的一些git指令列出来,方便查阅.

Git

Git 是一个开源的分布式版本控制系统,Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持, 通过 git 我们可以敏捷高效的对我们的项目进行管理。

Git 和 svn 的主要区别如下:

Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。

Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。

Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。

Git 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。

Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。

Git 的工作流

在学习 Git 的指令之前,有必要先了解一下 Git 的工作流,这样可以让我们更好的记住其指令,比单纯的死记硬背效果好很多,而且还可以让我们知道在什么情况下使用什么指令。

要理解这个工作流程图先理解下面几个概念:

工作区(workspace):就是存在你自己电脑上的目录。

暂存区(index):英文叫stage, 或index。一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。

版本库(repository):工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库,版本库包含了暂存区和分支目录树。

他们三个的关系可以下图片来描述:

在网上看到过一个特别形象的 Git 工作流称和操作流程图,如下:

这个图体现了远程仓库(连接了一个远程的git服务器,用于托管代码,常用的托管代码的平台由Github–全球最大没有之一,国内效仿有了码云)于上面三者的关系,包括需要用到的一些指令。

Git 命令

了解了 Git 的工作流之后,我们可以将 Git 命令分为几个种类,以便于我们对其进行记忆:

工作区与暂存区的交互。

暂存区与本地仓库(分支)上的交互。

本地仓库与远程仓库的交互。

git管理配置的命令。

配置命令

在第一次使用 Git 时候需要使用的命令

  • 配置用户名:git config --global user.name "your name";

  • 配置用户邮箱:git config --global user.email "youremail@github.com";

查询配置

  • 列出当前配置:git config --list;

  • 列出repository配置:git config --local --list;

  • 列出全局配置:git config --global --list;

  • 列出系统配置:git config --system --list;

其他配置

  • 配置解决冲突时使用哪种差异分析工具,比如要使用vimdiff:git config --global merge.tool vimdiff;

  • 配置git命令输出为彩色的:git config --global color.ui auto;

  • 配置git使用的文本编辑器:git config --global core.editor vi;

工作区相关命令

新建仓库

  • 将工作区中的项目文件使用git进行管理,即创建一个新的本地仓库:git init

  • 从远程git仓库复制项目:git clone <url>,如:git clone git://github.com/wasd/example.git;克隆项目时如果想定义新的项目名,可以在clone命令后指定新的项目名:git clone git://github.com/wasd/example.git mygit

提交

  • 提交工作区所有文件到暂存区:git add.

  • 提交工作区中指定文件到暂存区:git add <file1> <file2> ...;

  • 提交工作区中某个文件夹中所有文件到暂存区:git add [dir];

撤销

  • 删除工作区文件,并且也从暂存区删除对应文件的记录:git rm <file1> <file2>;

  • 从暂存区中删除文件,但是工作区依然还有该文件:git rm --cached <file>;

  • 取消暂存区已经暂存的文件:git reset HEAD <file> ...;

  • 撤销上一次对文件的操作:git checkout --<file>。要确定上一次对文件的修改不再需要,如果想保留上一次的修改以备以后继续工作,可以使用stashing和分支来处理;

  • 隐藏当前变更,以便能够切换分支:git stash

  • 查看当前所有的储藏:git stash list

  • 应用最新的储藏:git stash apply,如果想应用更早的储藏:git stash apply stash@{2};重新应用被暂存的变更,需要加上--index参数:git stash apply --index;

  • 使用apply命令只是应用储藏,而内容仍然还在栈上,需要移除指定的储藏:git stash drop stash{0};如果使用pop命令不仅可以重新应用储藏,还可以立刻从堆栈中清除:git stash pop;

  • 在某些情况下,你可能想应用储藏的修改,在进行了一些其他的修改后,又要取消之前所应用储藏的修改。Git没有提供类似于 stash unapply 的命令,但是可以通过取消该储藏的补丁达到同样的效果:git stash show -p stash@{0} | git apply -R;同样的,如果你沒有指定具体的某个储藏,Git 会选择最近的储藏:git stash show -p | git apply -R

更新文件

  • 重命名文件,并将已改名文件提交到暂存区:git mv [file-original] [file-renamed];

查新信息

  • 查询当前工作区所有文件的状态:git status;

  • 比较工作区中当前文件和暂存区之间的差异,也就是修改之后还没有暂存的内容:git diff;指定文件在工作区和暂存区上差异比较:git diff <file-name>;