码迷,mamicode.com
首页 > 其他好文 > 详细

Git简明教程

时间:2015-06-16 09:17:32      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:   工作区   教程   git   

1. Git的诞生

Linus在1991年创建了开源的Linux,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!因为集中式的版本控制系统不但速度慢,而且必须联网才能使用;付费的,和Linux的开源精神不符。
BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。开发Samba的Andrew试图破解BitKeeper的协议,被BitMover公司发现了(对BitKeeper逆向工程很不满)。
于是乎,Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!2008年,GitHub网站上线了,它为开源项目免费提供Git存储。Git 基于 DAG 结构 (Directed Acyclic Graph),是最快的SCM (软件配置管理)系统。

2. 集中式vs分布式

集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送(push)给中央服务器。集中式版本控制系统最大的毛病就是必须联网才能工作,Git提交不也不需要联网,最后push到远程服务器才需要。
CVS作为最早的开源而且免费的集中式版本控制系统,直到现在还有不少人在用。由于CVS自身设计的问题,会造成提交文件不完整,版本库莫名其妙损坏的情况。同样是开源而且免费的SVN修正了CVS的一些稳定性问题,是目前用得最多的集中式版本库控制系统。
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库。和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

3. 安装Git

Mac: 通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/
Windows:msysgit是Windows版的Git,从http://git-scm.com/下载,然后按默认选项安装即可。安装完成后,在开始菜单里找到“Git”->“Git Bash”,输入

$ git config --global user.name "Your Name"
$ git config --global user.email email@example.com

git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

4. 创建版本库repository

选择一个合适的地方,创建一个空目录(不要包括中文,以纯文本方式编写文件,UTF-8编码)

$ mkdir learngit
$ cd learngit
$ pwd
$ git init

通过git init命令把这个目录变成Git可以管理的仓库,目录下会多一个.git目录,用来跟踪管理版本库的。

5. 添加文件到Git库

5.1 在repository中添加readme.txt文件,内容:

Git is a version control system.
Git is free software.

5.2 第一步

使用命令git add ,注意,可反复多次使用,添加多个文件;

$ git add readme.txt

执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。

5.3第二步

用命令git commit告诉Git,把文件提交到仓库:

$ git commit -m "wrote a readme file"

-m后面输入的是本次提交的说明
commit可以一次提交很多文件,所以可以多次add不同的文件

5.4 git status

git status命令可以让我们时刻掌握仓库当前的状态。具体修改了什么内容,需要用git diff这个命令看看,看完修改之后,提交文件到Git库:

$ git add readme.txt
$ git status
$ git commit -m "add distributed"
$ git status

要随时掌握工作区的状态,使用git status命令。
如果git status告诉你有文件被修改过,用git diff可以查看修改内容。

6. 版本回退

使用git log命令查看版本库中的历史记录,显示从最近到最远的提交日志。加上–pretty=oneline参数:概略信息

$ git log --pretty=oneline

ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
一大串类似3628164…882e1e0的是commit id(十六进制的版本号).
使用Git Gui图示提交的历史记录。

6.1 版本的表示

在Git中,用HEAD表示当前版本,也就是最新的提交3628164…882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

使用git reset命令回退版本:

$ git reset --hard HEAD^

回到上一个版本。
使用git log 已经看不到最新的那个版本,回不去了,方法:通过commit id,可以指定回到未来的某个版本:

$ git reset --hard 3628164

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL,改为指向add distributed然后顺便把工作区的文件更新了。

当你用$ git reset –hard HEAD^回退到add distributed版本时,再想恢复到append GPL,就必须找到append GPL的commit id。Git提供了一个命令git reflog用来记录你的每一次命令。

6.2总结

HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset –hard commit_id。穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

7.工作区与暂存区

工作区:电脑里能看到的目录。版本库(Repository):工作区里的隐藏目录(.git)。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

把文件往Git版本库里添加的时候,是分两步执行的:第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;第二步是用git commit提交更改,实际上就是一次性把暂存区的所有内容提交到当前分支。

例如,在respository中修改readme.txt,添加readme.md文件。执行两次git add之后,为:文件从工作区备份到了暂存区中,还没有到版本库中。然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

add很多文件,但是有那么一个不想add的:先把大量文件一次性add进来:
git add *.py,例如添加了1.py、2.py、3.py、4.py。要排除掉其中一个文件,用:git reset HEAD 1.py这时再用git status看,1.py变成了untracked,剩下的就可以提交了。

7.1 撤销修改

git checkout – file可以丢弃工作区的修改:

$ git checkout -- readme.txt

把readme.txt文件在工作区的修改全部撤销,这里有两种情况:一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。总之,就是让这个文件回到最近一次git commit或git add时的状态。git checkout – file命令中的–很重要,没有–,就变成了“创建一个新分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。

若把修改后的readme git add到暂存区了,还没有commit。用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区。

7.2 小结:

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

8. 删除文件

先添加一个新文件test.txt到Git并且提交:

$ git add test.txt
$ git commit -m "add test.txt"

直接在文件管理器中把没用的文件删了,或者用rm命令删了:

$ rm test.txt

Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了。现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:

$ git rm test.txt
$ git commit -m "remove test.txt"

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

$ git checkout -- test.txt

git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

9. 远程仓库

第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

$ ssh-keygen -t rsa -C youremail@example.com

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,所以也无需设置密码。如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面。然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。

10. 与远程库关联

在GitHub中添加new repo,命名。空的仓库可以克隆出新的仓库,也可以把一个已有的本地仓库与之关联,

10.1 把本地仓库的内容推送到GitHub仓库

在本地的learngit仓库下运行命令:

or create a new repository on the command l
echo # test >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/yllziv/test.git
git push -u origin master

…or push an existing repository from the command line
git remote add origin https://github.com/yllziv/test.git
git push -u origin master

第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令: $ git push origin master

  1. 从远程库克隆
$ git clone  git@github.com:yllziv/test.git
Or
$ git clone  https://github.com/yllziv/test.git

使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。但通过ssh支持的原生git协议速度最快。

参考:Git教程- 廖雪峰的官方网

Git简明教程

标签:   工作区   教程   git   

原文地址:http://blog.csdn.net/u013819585/article/details/46513823

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!