Git是什么?
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
Git有什么特点?简单来说就是:高端大气上档次!
那什么是版本控制系统?
如果你用Microsoft Word写过长篇大论,那你一定有这样的经历:
想删除一个段落,又怕将来想恢复找不回来怎么办?有办法,先把当前文件“另存为……”一个新的Word文件,再接着改,改到一定程度,再“另存为……”一个新文件,这样一直改下去,最后你的Word文档变成了这样:
过了一周,你想找回被删除的文字,但是已经记不清删除前保存在哪个文件里了,只好一个一个文件去找,真麻烦。
看着一堆乱七八糟的文件,想保留最新的一个,然后把其他的删掉,又怕哪天会用上,还不敢删,真郁闷。
更要命的是,有些部分需要你的财务同事帮助填写,于是你把文件Copy到U盘里给她(也可能通过Email发送一份给她),然后,你继续修改Word文件。一天后,同事再把Word文件传给你,此时,你必须想想,发给她之后到你收到她的文件期间,你作了哪些改动,得把你的改动和她的部分合并,真困难。
于是你想,如果有一个软件,不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以,岂不是很方便?
这个软件用起来就应该像这个样子,能记录每次文件的改动:
版本文件名用户说明日期
这样,你就结束了手动管理多个“版本”的史前时代,进入到版本控制的20世纪。
建立本地仓库
在需要建立仓库的目录下(前提是安装了git)使用git,通过git init 命令把这个目录变成Git可以管理的仓库
把文件放入git仓库
把一个文件放到Git仓库只需要两步:
1.用命令git add告诉Git,把文件添加到仓库:
$ git add readme.txt
2.用命令git commit告诉Git,把文件提交到仓库:
$ git commit -m "wrote a readme file"
-m "说明" 是本地提交内容的备注说明。
查看仓库状态
当我们修改文件时,运行git status查看结果;比如当我们修改readme.txt文件内容后运行git status:
$ git status
On branch master
Changes not staged for commit:
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。可以看到有哪个文件被修改过,此时是否添加入库,此时是否提交。
虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt,所以,需要用git diff这个命令看看:
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Gitisa version control system.
+Gitisa distributed version control system.
Gitisfree software.
版本回退
每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit(commit一次就是一个版本)。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。
Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交1094adb...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令
git reset --hard commit_id
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
回退后如果想回到以前版本怎么办?只要你的命令行窗口还没关掉,找到之前的id(1094a.....),于是就可以指定回到未来的某个版本。
$ git reset--hard 1094a
HEADisnowat83b0afe append GPL
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。
撤销修改
git checkout -- file可以丢弃工作区的修改:
$ git checkout -- readme.txt
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令。
建立连接远程仓库
把远程仓库和本地仓库连接:
git remote add origin git@github.com:自己的账户名/项目名称.git
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
下一步,就可以把本地库的所有内容推送到远程库上:
$ git push -u origin master
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
创建合并删除分支
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
我们创建dev分支,然后切换到dev分支:
$ git checkout -b dev
Switchedto a new branch'dev'
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switchedto branch'dev'
然后,用git branch命令查看当前分支:
$ git branch
* dev
master
现在,我们把dev分支的工作成果合并到master分支上:
$ git checkout master(切换到master分支)
$ git merge dev(把dev合并到master分支)
git merge命令用于合并指定分支到当前分支
合并完成后,就可以放心地删除dev分支了:
$ git branch -d dev
Deletedbranch dev (was b17d20e).