Git使用教程
Git是什么?Linus为了管理Linux系统代码而开发的一个版本控制系统。
版本控制(Revision control)是一种软体工程技巧,以利于在开发过程中,确保不同人所编辑的同一档案都得到更新。
集中式和分布式版本控制系统有什么区别?
集中式版本控制系统,版本库是集中存放在中央服务器上的。
分布式版本控制系统,没有“中央服务器”,每个人的电脑上都是一个完整 的版本库。
Git安装
Git可以在Linux、Unix、Mac和Windows几大平台上正常运行。
在Windows上使用Git,可以从Git官网直接下载安装程序。安装完成后,在开始菜单里找到“Git”->“Git Bash”,跳出一个类似命令行窗口的东西,就说明Git安装成功!
但是,别急!还需要最后一步设置,在“Git Bash”命令行输入:
git config --global user.name "Your name"
git config --global user.email "email"
如果用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。
因为Git是一个分布式版本控制系统,所以,每个机器都必须有ID--你的名字和Email地址。
小结:
Git安装完成后,要进行配置:
git config --global user.name "Your name"
git config --global user.email "email"
创建版本库
什么是版本库?版本库又名仓库,英方名repository,可以理解为一个目录,这个目录里面的所有文件都可以被Git管理。每个方件的创建、修改、删除,Git都能跟踪。
那怎样创建一个版本库呢?
首先,选择一个合适的地方,创建一个目录:
mkdir gittest
第二步,切换到gittest,运行git init命令把这个目录变成可管理的仓库:
初始化后,在 gittest 目录下出现一个名为 .git 的目录,也就是仓库,所有 Git 需要的数据和资源都存放在这个目录中。
小结
创建本地版本库,需要两步:
- 创建目录
mkdir
- 初始化版本库
git init
基本操作
仓库创建成功后,我们就可以把项目放到里面进行管理。首先,切换到gittest目录(仓库)下,创建文件readme.txt,接下来将文件提交到仓库:
第一步,运行git add,把文件添加到仓库:
git add readme.txt
第二步,运行git commit,把文件提交到仓库:
git commit -m "create readme.txt"
我们使用 -m 选项以在命令行中提供提交注释。如果你没有设置 -m 选项,Git 会尝试为你打开一个编辑器以填写提交信息。
接下来,往readme.txt中加入内容并提交:
运行git status命令可以查看仓库当前的修改状态。
当我们对文件进行修改并提交到版本库,Git会对每一次提交保存一个节点,当我们误删文件之后可以从最近一个节点恢复文件。
但是,当我们对一个方件进行了成百上千次的编辑、修改之后,我们肯定已经不记得每一次都改了什么。不用担心,Git有办法-运行如下命令可以查看历史记录:
git log
可以看到,我们对文件进行过三次修改。
恩,看上去是不是有点乱?没关系,运行如下命令:
git log --pretty=oneline
是不是感觉全世界都清静了。
需要注意,我们所看到的类似ca43c95...的字符是commit id,那这有什么用呢?接着往下看。
下面,来点有趣的--版本穿越:
首先,Git必须知道当前是哪个版本。在Git中,用HEAD表示当前版本,下就是最后提交的版本。上一个版本是 HEAD^,上上个版本是 HEAD^^,以此类推。如版本太多?比如100可表示成 HEAD~100。
在Git中,运行git reset命令回退版本。下面,我们把文件回退到上一个版本:
git reset --hard HEAD^
现在,我们运行git log现在版本库的状态:
恩,我们可以看到add again那个版本已经不见了。当然,你还可以继续往前回退。但是,我突然发现我弄错了,想回到add again版本,肿么办?
现在,commit id派上用场了,我们只要往前找到对应版本的commit id就可以有后悔药可吃,运行命令:
git reset --hard catec95
下面是见证奇迹的时刻:
怎么样,又回来了!
这是为什么呢?Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git把HEAD指向了你要回退的版本。
现在,问题来了!如果我回退到上一个版本后,过了一天后悔了我去哪里找commit id呢?
Git提供了一个命令git reflog用来记录你的每一次操作:
这样是不是就找到commit id了。
小结
- 文件修改后,运行git add添加到仓库;
- 接着,运行git commit提交到版本库,命令可使用参数"-am";
- 运行git status可查看版本库当前状态,参数"-s"供简洁输出;git diff可查看版本库修改内容的详细信息。
- git log可查看修改记录,git log --pretty=online提供简洁输出;
- 运行git reset --hard HEAD^将版本库回退到上一版本状态。git reset --hard commit id可回退到对应的版本;
- git reflog用来查看你的每一次操作。
工作区与暂存区
工作区(Working Directory),就是你在电脑里能看到的目录,比如我的gittest文件夹就是一个工作区
暂存区,英文叫stage(index)。一般存放在“.git目录”(也就是版本库)下的index文件。
我们已经知道,把文件添加到版本库里,有两个步骤:
- 运行git add,实际就是把修改文件添加到暂存区;
- 运行git commit,就是把暂存区的内容提交到当前分支。
撤销修改
- 丢掉工作区的修改:
git checkout -- file
该命令可以把我在里添加的内容撤销掉。这里有两种情况:
一种是修改后没有添加到暂存区,撤销修改就回到和版本库一模一样的关态;
另一种是添加到暂存区后,又作了修改。撤销后加到添加到暂存区时的状态。
- 如果你修改后已经提交到了暂存区,则需要两步:
- 运行git reset HEAD file把暂存区的文件退回到工作区;
- 运行git checkout -- file撤销修改
小结
- 运行git checkout -- file撤销工作区的修改;
- git reset HEAD file把暂存区文件退到工作区。
删除文件
如果我们把readme.txt从工作区中删除,那工作区与版本库就不一致。运行git status查看:
现在,有两种选择:
- 如果确实想删除该文件,那么运行git rm将版本库中的文件删除,并git commit。
- 如果是误删除,运行git checkout -- readme.txt将文件从版本库中恢复到工作区。
小结
运行git rm可删除版本库的文件。
远程仓库
在这,我们需要应用到GitHub网站。这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。
首先,应注册GitHub账号。由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
ssh-keygen -t rsa -C "email"
你需要把邮件地址换成你自己的邮件地址,一直回车,使用默认值即可。
创建成功后,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Settings”,“SSH and GPG Keys”页面:
然后,点“New SSH Key” :
填上Title(可不填),在Key文本框里粘贴id_rsa.pub文件的内容点击"Add SSH Key":
添加远程仓库
首先,登陆GitHub,在右侧找到New repository点击。
进入后,在Repository name 填入仓库名,其它默认,点击Create repository .
现在,在GitHub上的这个gittest仓库还是空的,可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
我们根据GitHub的提示,把一个已有的本地仓库与之关联。在本地gittest仓库下运行
git remote add origin git@github.com:renfuli/gittest.git
注意把后面换成自己的地址。添加后,远程库的名字就是origin.
下一步,把本地库的所有内容推送到远程库上:
git push -u origin master
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
推送成功后,刷新GitHub页面,看到远程库的内容已经和本地一模一样:
小结
- 运行git remote add origin xx,将一个本地仓库与远程仓库关联;
- 运行git push orign maste把本地仓库推送到远程。
从远程克隆仓库
首先,登陆GitHub,创建一个新的仓库gitstudy
勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。创建完毕后,可以看到README.md文件:
下一步是用命令git clone克隆一个本地库:
Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。
分支
首先,我们创建dev分支,然后切换到dev分支:
git checkout -b dev
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
git branch dev
git checkout dev
然后,运行:
git branch
git branch命令会列出所有分支,当前分支前面会标一个*号。
我们在dev分支下创建index.html,然后提交:
现在,切回master分支,发现并没有index.html。因为那个提交是在dev分支上。
现在,我们把dev分支的工作成果合并到master分支上:
git merge命令用于合并指定分支到当前分支。合并后,可以看到index.html
最后,删除dev分支:
git branch -d dev
小结
- 创建分支,运行git branch dev;
- 切换分支,运行git checkout dev;运行git checkout -b dev是创建并切换;
- 运行git branch查看所有分支,标记*号的为当前分支;
- 命令git merge dev将指定分支合并到当前分支;
- 命令git branch -d xx用于删除分支。
本文根据自己的学习笔记整理。由于水平有限,还存在诸多不足,欢迎各位批评指正。谢谢!在学习期间,得到了饥人谷老师的指导,非常感谢!
参考
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
http://www.runoob.com/git/git-tutorial.html