前面一篇文章简单介绍了Git,并前在Windows平台上搭建了Git环境,如今就正式的Git使用了。git
在开始Git的使用以前,须要先介绍一些概念,经过这些概念对Git有些基本的认识,这将会对咱们后面的操做有很大的帮助。函数
在Git中,每一个版本库都叫作一个仓库(repository),每一个仓库能够简单理解成一个目录,这个目录里面的全部文件都经过Git来实现版本管理,Git都能跟踪并记录在该目录中发生的全部更新。spa
如今咱们已经知道什么是repository(缩写repo)了,假如咱们如今创建一个仓库(repo),那么在创建仓库的这个目录中会有一个".git"的文件夹。这个文件夹很是重要,全部的版本信息、更新记录,以及Git进行仓库管理的相关信息全都保存在这个文件夹里面。因此,不要修改/删除其中的文件,以避免形成数据的丢失。命令行
进一步的讲解请参考下面一张图,大概展现出了咱们须要了解的基本知识(注意,".git"目录中还有不少别的东西,图中并无涉及,这里也不作解释了)。3d
根据上面的图片,下面给出了每一个部分的简要说明:版本控制
有了上面概念的了解,下面就开始在本地repo上进行Git的操做了。指针
经过"Git Bash"命令行窗口进入到想要创建版本仓库的目录,经过"git init"就能够轻松的创建一个仓库。rest
这时,咱们的仓库目录中会自动的产生一个".git"文件夹,这个就是咱们前面提到的Git管理信息的目录。code
如今咱们在仓库中新建一个"calc.py"的文件,文件内容以下。blog
def add(a, b): print a + b if __name__ == "__main__": add(2, 3)
经过"git status"能够查看WorkSpace的状态,看到输出显示"calc.py"没有被Git跟踪,而且提示咱们可使用"git add <file>..."把该文件添加到待提交区(暂存区)。
注意,这时的更新只是在WorkSpace中。
使用"git add calc.py"或者"git add .",而后继续查看WorkSpace的状态。这是发现文件已经被放到暂存区。
这时的更新已经从WorkSpace保存到了Stage中。
最后,咱们就能够经过"git commit -m"来提交更新了。-m后面跟的是对commit的描述(message)。
这时的更新已经又从Stage保存到了Local Repo中。
经过上面的操做,文件"calc.py"就成功的被添加到了仓库中。
假设如今须要对"calc.py"进行更新,修改文件后,查看WorkSpace的状态,会发现提示文件有更新,可是更新只是在WorkSpace中,没有存到暂存区中。
def add(a, b): print a + b def sub(a, b): print a - b if __name__ == "__main__": add(2, 3)
一样,经过add、commit的操做,咱们能够把文件的更新先存放到暂存区,而后从暂存区提交到repo中。
注意,只有被add到暂存区的更新才会被提交进入repo。好比下面的一系列操做,操做结束后只有"multi"函数的更新会被提交到repo中,"div"函数的更新还在WorkSpace中。这点应该也是比较容易理解的。
def multi(a, b): print a * b def div(a, b): if b != 0: print a / b
"git diff"是一个颇有用,并且会常常用到的命令。基于上面的例子,咱们经过"git diff"来查看WorkSpace和Stage的diff状况,当咱们把更新add到Stage中,diff就不会有任何输出了。
固然,咱们也能够把WorkSpace中的状态跟repo中的状态进行diff,命令以下,关于HEAD,将在后面解释。
git diff HEAD~n
根据前面对基本概念的了解,更新可能存在三个地方,WorkSpace中、Stage中和repo中。下面就分别介绍一下怎么撤销这些更新。
接着上面的例子,咱们想撤销WorkSpace中的"div"函数的更新,能够看到"git status"的输出中有提示,咱们可使用"git checkout -- <file>…"(注意必定不要漏掉--)来撤销WorkSpace中的更新。
注意,在使用这种方法撤销更新的时候必定要慎重,由于经过这种方式撤销后,更新将没有办法再被找回。
加入咱们在WorkSpace中从新添加了"div"函数的更新,而且使用了"git add"把这个更新提交到了暂存区。这时,"git status"的输出中提示咱们能够经过"git reset HEAD <file>..."把暂存区的更新移出到WorkSpace中。
若是想继续撤销WorkSpace中的更新,请参考上面一步。
介绍撤销repo中的更新以前,咱们先看一下"git log"这个命令,经过这个命令咱们能够查看commit的历史记录。能够看到咱们进行的三次提交。
其中"WilberTian"和"Wilber***com"就是咱们在前面一片文章中配置的用户名和邮箱。
假设咱们如今要撤销"add mulit function in calc.py"这个提交,有两种方式:使用HEAD指针和使用commit id。
在Git中,有一个HEAD指针指向当前分支中最新的提交,在上面的例子中HEAD就是对应1a72f49ae49c1716e52c12f2b93fdcef6aac0886(commit id)此次提交。
因此可使用下面的命令来撤销"add mulit function in calc.py"这个提交。注意,当前版本,咱们使用"HEAD^",那么再前一个版本可使用"HEAD^^",若是想回退到更早的提交,可使用"HEAD~n"。(也就是,HEAD^=HEAD~1,HEAD^^=HEAD~2)
git rest --hard HEAD^
等价于
git rest --hard 1a72f49ae49c1716e52c12f2b93fdcef6aac0886
再次查看,发现"add mulit function in calc.py"的commit已经被撤销了,查看"calc.py"文件,"multi函数"也已经被删除了。
那么问题就来了,我如今又想要恢复"add mulit function in calc.py"这个提交了,固然Git是支持这样的操做。
下面来看看"git reflog"这个命令。"git log"只是包括了当前分支中的commit记录,而"git reflog"中会记录这个仓库中全部分支的全部更新记录,包括已经撤销的更新。
有了这个,咱们就能够查找到"add mulit function in calc.py"提交,而后能够经过下面命令来恢复对"add mulit function in calc.py"的撤销操做。
git reset --hard HEAD@{1}
等价于
git reset --hard 1a72f49
再次查看,发现咱们的"add mulit function in calc.py"更新已经回来了。
前面在使用reset来撤销更新的时候,咱们都是使用的"--hard"选项,其实与之对应的还有一个"--soft"选项,区别以下:
这里就再也不对--soft进行演示了。
在Git中,若是咱们要删除一个文件,可使用下面的命令,"git rm"相比"rm"只是多了一步,把此次删除的更新发到Stage中。
rm <file>
git rm <file>
删除操做仍是很简单的,这里就很少作演示了。
经过这篇文章,了解了Git的一些基本概念。
而后介绍了Git中经常使用的命令来操做本地repo,内容比较多,可是都是基本的,只要本身动手操做一遍就清楚了。
到这里,下面命令流图中的命令都已经被介绍到了。相信经过这些命令,咱们已经能够对本身的本地repo进行Git的版本管理了。
最后,一样share出文章中的两个visio图。