2018-03-12

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 需要的数据和资源都存放在这个目录中。

小结
创建本地版本库,需要两步:

  1. 创建目录

mkdir

  1. 初始化版本库

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了。

小结

  1. 文件修改后,运行git add添加到仓库;
  2. 接着,运行git commit提交到版本库,命令可使用参数"-am";
  3. 运行git status可查看版本库当前状态,参数"-s"供简洁输出;git diff可查看版本库修改内容的详细信息。
  4. git log可查看修改记录,git log --pretty=online提供简洁输出;
  5. 运行git reset --hard HEAD^将版本库回退到上一版本状态。git reset --hard commit id可回退到对应的版本;
  6. git reflog用来查看你的每一次操作。

工作区与暂存区

工作区(Working Directory),就是你在电脑里能看到的目录,比如我的gittest文件夹就是一个工作区

暂存区,英文叫stage(index)。一般存放在“.git目录”(也就是版本库)下的index文件。

我们已经知道,把文件添加到版本库里,有两个步骤:

  1. 运行git add,实际就是把修改文件添加到暂存区;
  2. 运行git commit,就是把暂存区的内容提交到当前分支。

撤销修改

  • 丢掉工作区的修改:

git checkout -- file

该命令可以把我在里添加的内容撤销掉。这里有两种情况:
一种是修改后没有添加到暂存区,撤销修改就回到和版本库一模一样的关态;
另一种是添加到暂存区后,又作了修改。撤销后加到添加到暂存区时的状态。

  • 如果你修改后已经提交到了暂存区,则需要两步:
  1. 运行git reset HEAD file把暂存区的文件退回到工作区;
  2. 运行git checkout -- file撤销修改

小结

  1. 运行git checkout -- file撤销工作区的修改;
  2. 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页面,看到远程库的内容已经和本地一模一样:

小结

  1. 运行git remote add origin xx,将一个本地仓库与远程仓库关联;
  2. 运行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

小结

  1. 创建分支,运行git branch dev;
  2. 切换分支,运行git checkout dev;运行git checkout -b dev是创建并切换;
  3. 运行git branch查看所有分支,标记*号的为当前分支;
  4. 命令git merge dev将指定分支合并到当前分支;
  5. 命令git branch -d xx用于删除分支。

本文根据自己的学习笔记整理。由于水平有限,还存在诸多不足,欢迎各位批评指正。谢谢!在学习期间,得到了饥人谷老师的指导,非常感谢!


参考
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
http://www.runoob.com/git/git-tutorial.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容

  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,645评论 9 163
  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,860评论 5 147
  • 1.git的安装 1.1 在Windows上安装Git msysgit是Windows版的Git,从https:/...
    落魂灬阅读 12,654评论 4 54
  • 我是黄泉村生人,家中只余我与家姐二人。家中族老掌权,那年我十三,姐十六,去桃花村做客。席间家姐被族老叫走,半日未归...
    阿易呀阅读 257评论 0 0
  • 病了 在夜晚的脚下 无人关心 不止是难受 还很难过 想你 仿佛只有想你 我才能没那么难受和难过 假如你可以陪我身边...
    会疼这思念阅读 194评论 1 4