一、Git简介
Git是目前世界上最先进的分布式版权控制系统,它不同于CVS和SVN这种集中式的版权控制系统:集中式的版权控制系统必须通过互联网才能工作,每次使用都需要从中央服务器获取最新版本,使用完成后再上传到中央服务器(同样需要互联网);Git就不同了,它没有所谓的中央服务器的概念,每个人的电脑上都是一个完整的库。你只需要把你电脑上文件的修改推送给其他人,对方就可以看到你的修改了。
二、windows下Git的安装及配置
windows下安装Git,可以直接去Git的官方网站 https://git-scm.com/downloads,下载windows版本的Git,安装时一路默认选项即可。 安装完成后,在桌面或菜单栏里可以找到Git Bash命令行工具“Git Bash",会弹出一个类似于命令行的东西。
初次运行Git时的配置
因为Git是一个分布式版权控制系统,需要一个用户名和邮箱作为标识,用户名和邮箱是你注册的github的账号和邮箱。打开"Git Bash",输入命令
$ git config --gloabl user.name "Your name"
$ git config --gloabl user.email "Your email"
其中用了"--global"参数,表示该机器上所有的Git仓库都采用这个配置,也可以对指定的仓库使用不同的用户名和邮箱。
检查配置信息
可以通过下面的指令来查看你的配置
$ git config --list
三、创建版本库
初始化一个Git仓库
版本库也叫仓库,英文为repository,里面的文件可以通过Git来管理,并且可以跟踪文件的修改。
打开"Git Bash",进入本地的文件夹,然后执行指令
$ git init
初始化成功后,会发现文件夹里多出了一个 ".git"文件夹,不要随便动该文件夹里的东西,否则容易破坏该Git仓库。
将文件添加到版本库
Git可以跟踪文件的改动,但是不能跟踪二进制文件的改动,建议以文本文件编写文件,推荐Nodepad++这款免费且功能强大的文本文件的编辑软件,并且使用默认的UTF-8编码。现在我们在workspace或其子目录下建立一个"helloworld.txt"文本文件,文件内容为"hello world!!",把该文件放到Git仓库需要两部操作。
第一步,用命令 git add 来把文件添加到仓库。
$ git add helloworld.txt
该指令可以反复多次使用,以添加多个文件到仓库。如果要把该文件夹所有的文件添加到仓库,可以使用
$ git add .
如果什么都不显示的话,说明添加成功。
第二步,用命令 git commit,把文件提交到仓库。
$ git commit -m "提交文件到仓库"
git commit 的-m指令后面为本次提交的说明,最好是有意义的,这样就可以从历史记录里方便地找到改动记录。git commit 指令执行成功后会告诉你,一个文件被改动(新添加的helloworld.txt文件),插入了一行内容(helloworld.txt中有一行内容)。
修改文件
现在修改helloworld.txt的内容,添加一行"hello world!!!"。
利用 git status 命令可以让我们时刻掌握仓库的状态
上面指令告诉我们,helloworld.txt被修改过了,但是还没有准备提交的修改。下面提示 .classpath等文件(文件夹)为"untracked files",并且提示可以通过"git add <file>..."的命令将文件包含到待提交清单中。我们按照提示将.classpath文件添加到仓库,再通过 git status查看仓库的状态。
利用git status 但是不能查看修改的内容,我们可以通过git diff 来查看,
提交修改文件和提交新文件是一样的,第一步是 git add:
$ git add helloworld.txt
这时我们再通过 git status 查看一下仓库的状态
第二步还是通过 git commit 命令,
$ git commit -m "修改并添加新文件"
此时,再通过 git status查看仓库的状态
将workspace文件夹中的所有文件都提交到库中,通过git status查看库的状态。
四、Git的一些简单指令
版本回退
当你觉得文件修改到一定程度时,可以在Git中commit一下。当你把文件改乱了或者丢失时,可以从最近的一个commit恢复,而不是所有的成果都丢失。
可以通过 git log 命令查看每次提交到仓库中的文件的历史记录
可以看到提交到库的所有的版本,其中一大串十六进制数字为版本号(commit id)。
我们现在要把helloworld.txt回退到修改前的版本。在Git中,我们用HEAD表示当前版本,则上一个版本是HEAD^,上上个版本是HEAD^^(或者写成HEAD~2),由提交时的message可以知道helloworld.txt的上一个版本为HEAD^^(由此可以看出commit时 -m后面信息的作用)。
我们要把当前版本回退到上上个版本,可以使用git reset命令,
$ git reset --hard HEAD~2
查看此时helloworld.txt的内容是不是之前版本的,
$ cat helloworld.txt
在本地查看workspace文件夹中的内容,发现并没有.classpath等文件,并且helloworld.txt中的内容的确为上一个版本。
此时如果我们再通过git log 查看现在版本库的状态,会发现之前的状态已经没有了,只有当前状态(和该状态之前的状态)。如果想回复到未来的某个版本,方法是有的,只要你不关闭当前的命令行,可以找到回退前版本的commit id,没有必要输入完整的commit id,前几位即可,
查看本地workspace文件夹中的内容,发现与回退前的一致,并且helloworld.txt中的内容也是回退之前的内容。可以再由git log命令查看当前版本库的状态,也是与回退前的是一致的。
可是,如果你回退后关闭了命令行,网上找不到未来版本的commit id,别担心,也是有办法的。Git中有一个git reflog命令来查看命令历史,可以查出提交过的未来版本的commit id,再由git reset指令就可以回复到未来的版本。
管理修改
首先要明白,Git跟踪的是文件的修改,而不是文件本身。在这里先介绍一下工作区与暂存区,我们把文件提交到仓库,有git add 和 git commit两步操作,那么为什么要分这么两步,第一步我们可以将修改或者新建的文件由工作区提交到暂存区,第二步commit时,只是把暂存区里的所有文件提交到了仓库。如果在一个文件被add到了暂存区后再修改该文件,在没有重新执行git add的情况下直接执行commit命令,那么后来的修改是没有被提交到仓库中的。所以每次修改,如果不add到暂存区,那就不会加入到commit中。
撤销修改
这里分为三种情况:
第一种,修改了工作区的文件,还没有提交到暂存区,由git status命令中的提示,可以通过git checkout -- <file>来撤销修改。
第二种,将工作区修改的文件提交到了暂存区,想放弃修改,分为两步,第一步按照git status中的提示信息,通过git reset HEAD <file> 命令,可以回到第一种情况,第二步按照第一种情况操作。
第三种,已经把修改提交到版本库了(执行了git commit命令),这里就可以直接进行版本回退了。
删除文件
我们可以从文件管理器中直接删除文件,Git可以检测到,
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: README.txt
no changes added to commit (use "git add" and/or "git commit -a")
这时候我们有两个选择,一是确实删除这个文件,二是误删想要恢复文件。从版本库中删除该文件,我们通过git rm命令,然后再git commit.
$ git rm README.txt
$ git commit -m "remove README.txt"
另一种情况是我们在工作去误删了文件,但是此时版本库中还有呢,删除也是一种修改,我们根据上面一节提到过的第一种情况,可以通过git checkout -- <file>命令来恢复
$ git checkout -- README.txt
git checkout命令其实是将工作区中的文件替换为版本库中的文件,无论是修改或者是删除,都可以恢复。所以,如果一个文件被提交到了版本库,就不用担心误删,但是只能恢复到版本库中的最新版本,不会保留工作区中的修改。