git的介绍
git是世界上最先进的分布式版本控制系统,可以实现协作编辑,记录文件改动等功能,由linus公司于2005年开发,接着git迅速成为最流行的分布式版本控制系统,在2008年GitHub上线,git为GitHub提供免费git存储,无数开源项目开始迁移至GitHub,包括jQuery,php,ruby等。git属于分布式版本控制系统,它没有所谓的中央服务器,每个人的电脑都有完整的版本库。这样不会因为中央服务器宕机导致网络瘫痪。
创建版本库
版本库又名仓库,英文名repository,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
创建一个版本库十分简单,首先选择一个合适的位置,windows下最好选择英文目录,接着打开指定git bash,cd到指定目录,我的是D:\gitrepository
,接着通过git init
命令把这个目录变成git可以管理的仓库。系统会告诉你这是一个空的仓库,同时目录里面多了一个.git目录,这个目录是用来跟踪管理版本的,没事不要去修改,同时这个目录默认是隐藏的。
把文件添加到版本库
所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。
不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的。因为文本是有编码的,比如中文有常用的GBK编码,日文有Shift_JIS编码,如果没有历史遗留问题,强烈建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。
同时强烈建议Windows平台用户不要使用自带的记事本编辑任何文本文件,这样经常会引起各种报错。推荐一个文本编辑工具叫做nodepad++,功能强大且免费,同时需要把默认编码设置为UTF-8 without BOM。
接下来我们添加文件的功能。
首先我们在gitrepository文件夹下新建一个名为readme.txt的文件,内容如下:
Git is a version control system.
Git is free software.
接着执行git add readme.txt
命令,执行之后没没有任何反应,说明命令执行成功!
接下来,用命令git commit 告诉git,把文件提交到仓库。git commit -m"wrote a readme file"
,这样文件就成功提交了。-m之后是本次提交的声明,可以输入任何内容,这样可以从历史纪录中方便地找到改动的记录。另外,commit一次性地可以提交很多文件。
时光穿梭机
我们继续修改readme.txt中的内容,修改为
Git is a distributed version control system.
Git is free software.
然后运行git status
,查看结果:
这个命令告诉我们,readme.txt已经被修改了,但是还没有准备提交的修改。
通过git diff
命令可以查看具体的修改内容:
接着就是git add
和git commit -m
命令来提交提交以后的文件了。
版本回退
现在我们有两个版本的readme.txt了,使用git log
命令可以查看历史纪录:
使用可视化git工具,可以看到git会把版本变化记录串成一条时间线。接着我们要使用“时光穿梭机”功能,head表示当前版本,也就是最新的版本,上一个版本就是head^,或者head~1,以此类推。
我们使用git reset -- hard HEAD^
来回退到上一个版本。
这时第二个版本已经不存在了,可以通过前面的commit id来查找,接着执行git reset --hrad commit id
命令来恢复,前提是你没有关闭命令窗口。关闭之后也有办法,执行git reflog
用来记录你的每一次命令,就可以找到每次的commit id:
工作区和暂存区
工作区
指在电脑上可以看到的目录。
版本库
工作区中隐藏的.git目录,称为git的版本库。版本库中包含一个叫stage(或者index)的暂存区,还有git为我们创建的一第个分支master,以及指向master的一个名为head的指针。
把文件向git版本库中添加时,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
管理修改
git管理的是修改,而不是文件。需要注意的是,每次修改之后,如果不add到暂存区,是不会加入到commit中的。
撤销修改
使用git checkout --readme.txt
命令可以撤销修改。这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
git checkout – file命令中的–很重要,没有–,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。
- git add files 把当前文件放入暂存区域。
- git commit 给暂存区域生成快照并提交。
- git reset – files 用来撤销最后一次git add files,你也可以用git reset 撤销所有暂存区域文件。
- git checkout – files 把文件从暂存区域复制到工作目录,用来丢弃本地修改。
删除文件
命令git rm
可以用于删除一个文件,如果这个文件已经提交到版本库,那么你永远不会担心会误删,可以进行一键还原操作。执行git status命令可以告诉你那个文件被删除了。执行git rm
之后,再执行git commit
就可以从版本库中删除该文件了。
远程仓库
对于github这种远程仓库,本地的git仓库与GitHub之间的传输是通过ssh加密的,所以需要添加ssh key,然后绑定在自己的github仓库上。
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作。
首先,登陆github,创建新仓库,填入名称gitrepository,替他保持默认设置。
接着执行git remote add origin git@github.com:hhb1994/gitrepository
命令来关联,远程仓库的名字就是origin,下一步就是推送内容:git push -u origin master
把本地库的内容推送到远程,使用git push
命令,实际上是把master分支推送到远程。由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样:
从现在开始,只要本地做了提交,就可以通过命令git push origin master把本地的master分支的最新内容推送到github!
从远程仓库克隆
使用命令git clone来克隆一个本地库:
git clone git@github.com:hhb1994/hhb1994.github.io.git
分支管理
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。其他版本控制系统如SVN等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。
创建与管理分支
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge
删除分支:git branch -d