Git详细教程(一)

Git —— 目前世界上最先进的分布式版本控制系统,高端大气上档次!

一、起步

1、查看是否安装了Git

$ git --version

如果安装了Git就会输出正确的版本号

2、安装Git

如果已安装可跳过
方法一、通过HomeBrew来安装

先安装HomeBrew(如果已安装可跳过)
终端执行命令   $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
然后安装git    $ brew install git

方法二、你也可以通过下载安装程序来安装

3、配置信息

安装完成之后,需要配置用户信息

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

注意--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 --global 选项的命令来配置。
如果想要检查你的配置,可以使用 git config --list 命令来列出所有 Git 当时能找到的配置。还可以通过输入 $ git config <key> 来检查 Git 的某一项配置

$ git config user.name
YoungerLi

二、基础

1、创建Git仓库

仓库即repository,首先选择一个合适的地方,创建一个空目录GitTest$ cd GitTest进入到该目录中,执行

$ git init

瞬间Git就把仓库建好了,目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用$ ls -a命令就可以看见。

还可以克隆现有的仓库,稍后会在《三、远程仓库》里讲解

2、仓库状态

你的仓库目录下的所有文件只有两种状态 未跟踪已跟踪
未跟踪 (untracked)的文件不在版本控制范围内,也就是相当于是外人,不管对该文件做什么都不会被影响,可以说有没有你都一样。
已跟踪 的文件是指那些被纳入了版本控制的文件,已跟踪 的文件又包含3种状态:未修改(unmodified)、已修改(modified)、已暂存(staged)。

其中未修改和已修改都属于未暂存,提交的话只提交已暂存状态。


现在我们在仓库目录下创建一个文件

$ touch README.md
检查当前文件状态
$ git status


可以看到新建的 README.md 文件出现在 Untracked files 下面,说明这是未跟踪文件,这时不管你对README.md做什么修改,它的状态都是Untracked files,没有任何影响。

git status命令的输出十分详细,但其用语有些繁琐。 如果你使用git status -s命令或 git status --short 命令,你将得到一种更为紧凑的格式输出。

跟踪文件
$ git add README.md

此时再运行 git status 命令,会看到 README 文件已被跟踪,并处于暂存状态


只要是出现在Changes to be committed下面,就是已暂存状态。好了,既然我们已经跟踪了README.md文件,接下来要做的就是修改该文件了,打开README.md随便写上一句话这是一个新建的文件,然后再执行git status

可以看到README.md同时出现在了Changes to be committedChanges not staged for commit下面,说明README.md被暂存之后又被修改了,而Changes not staged for commit下的README.md就是已修改的状态,但是还未暂存。Changes to be committed下的README.md是已暂存状态,此时提交的话只会提交已暂存状态的README.md,也就是刚刚修改的README.md文件这是一个新建的文件并不会被提交上去,所以我们需要暂存刚刚修改的README.md文件。

暂存已修改文件
$ git add README.md

此时再运行 git status 命令,会看到 README 文件只处于暂存状态


这个时候提交就会把后来修改的都提交上去了。

你发现了没,跟踪文件暂存已修改文件的命令一样都是git add,其实这是个多功能命令,可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。

查看已暂存和未暂存的不同

如果你想查看具体修改了什么地方,可以用 $ git diff 命令。
现在我们再次对README.md进行修改,添加一行我又修改了一次,先不暂存,此时的状态应该是README.md同时出现在已暂存和已修改下面,然后执行$ git diff

此命令比较的是仓库目录中当前文件和暂存区域之间的差异, 也就是修改之后还没有暂存起来的变化内容。
若要查看已暂存的将要添加到下次提交里的内容,可以用 $ git diff --cached$ git diff --staged命令,效果一样
git diff --staged / git diff --cached

请注意,$ git diff 本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。 所以有时候你一下子暂存了所有更新过的文件后,运行 git diff 后却什么也没有,就是这个原因。

提交更新

现在我们修改完内容之后就可以提交了,在此之前,务必要执行一次$ git status确认好要提交的内容是否已添加到暂存区域,然后再执行提交命令

$ git commit

这种方式会启动文本编辑器以便输入本次提交的说明,输入完提交说明保存退出即可完成提交
另外,你也可以在 $ git commit 命令后添加 -m 选项,将提交信息与命令放在同一行

$ git commit -m "first commit"

请记住,提交时记录的是放在暂存区域的快照。 任何还未暂存的仍然保持已修改状态,可以在下次提交时纳入版本管理。 每一次运行提交操作,都是对你项目作一次快照,以后可以回到这个状态,或者进行比较。

跳过使用暂存区域

尽管使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。Git 提供了一个跳过使用暂存区域的方式, 只要在提交的时候,给 $ git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 $ git add 步骤:

$ git commit -a -m "first commit"

3、查看提交历史

在提交了若干更新,你也许想回顾下提交历史。 完成这个任务最简单而又有效的工具是 $ git log 命令。会按提交时间列出所有的更新,最近的更新排在最上面,现在执行

$ git log

一共提交了两次

如果想看每次提交的内容差异,可以用-p选项

$ git log -p


如果你觉得输出信息太多,看得眼花缭乱的,可以用--pretty=oneline选项,只输出版本号(类似4534a9...0f6ab)和提交说明

$ git log --pretty=oneline


经过长时间的开发你的提交次数肯定会越来越多,而你只想看最近几次提交的历史,可以用-n选项,n为1 2 3...

$ git log -1      //只会显示你最近一次提交的版本

还可以与-p一起用

$ git log -p -1      //只会显示你最近一次提交的版本的内容差异

更多的查看历史的选项可参考Git查看提交历史

4、撤销操作

重新提交

有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令尝试重新提交

$ git commit --amend

如果你只是提交说明写错了,立刻执行这个命令,然后进入编辑模式你会看到之前写的提交说明,编辑后保存会覆盖原来的提交信息。
如果你忘记了将要提交的文件放入暂存区,你可以立刻$ git add 你忘记的文件放入暂存区,然后执行$ git commit --amend,最终你只会有一个提交,第二次提交将代替第一次提交的结果。

取消暂存文件

如果你想把暂存区的文件取消暂存,也就是提交的时候不想提交某个文件,你可以执行取消暂存的命令,当我们执行$ git status的时候我们在暂存区下面可以看到提示

意思是执行git reset HEAD <file>来取消暂存,所以接下来执行

$ git reset HEAD README.md

即可对该文件取消暂存

撤销对文件的修改

如果你并不想保留对 README.md 文件的修改怎么办? 你该如何方便地撤消修改 - 将它还原成上次提交时的样子或者刚克隆完的样子或者刚把它放入工作目录时的样子? 幸运的是,git status 也告诉了你应该如何做

比如撤销对 README.md 文件的修改

$ git checkout -- README.md

你需要知道 git checkout -- <file> 是一个危险的命令,这很重要。 你对那个文件做的任何修改都会消失 - 你只是拷贝了另一个文件来覆盖它。 除非你确实清楚不想要那个文件了,否则不要使用这个命令。

退回以前的版本

如果你想回退到上一个版本或者以前的版本也不是不可以的,相当于时光倒退,也就是你想回到的那个版本之后所有更改的东西全部消失(此操作要谨慎)

回退版本所用的命令是$ git reset --hard 版本号,想回到哪个版本就找到哪个版本的版本号,然后执行此命令。
还有一个方法$ git reset --hard HEAD^,是回退到上一个版本的快捷方法,此方法不需要知道版本号,用HEAD^^代表回退到上上个版本,依次类推,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100(一般用不到),你不会一个个数上100个版本是哪个版本。
一般我们只会回退到上一两个个版本,不会回退太多,所以$ git reset --hard HEAD^用的最多。

好的,现在先看一下我提交的历史,已经提交过3次了

现在我想回退到上个版本也就是second commit这一版,执行

$ git reset --hard HEAD^

终端输出HEAD is now at 98aee01 second commit可以看到已经回到second commit了,98aee01就是此版本的版本号的前几位(上图中绿色长串),现在你再看看从上个版本提交之后你所更改的东西全都消失了,我们再来看看提交历史$ git log

可以看到最后一次提交的历史都没了,我靠,那我后来改的东西怎么办,还得再重新写吗?我当初咋写的来着?忘了,擦擦擦。。。
别着急,给你一个后悔药,我就知道你会后悔的,让你这么不小心,都说了要谨慎的嘛,让你后来改的东西再回来,也就是再回到最后一次提交的版本,前提是你要知道最后一版的版本号,看上上图third commit的版本号f4ab157...,有了这个你就能再穿越回来了,执行

$ git reset --hard f4ab157

版本号没必要写全,写前六七位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
现在再看看你的东西是不是又回来了,$ git log看一下提交历史是不是也回来了,哈哈!
如果你把终端关闭了,这时你后悔了,想再穿越回来你就看不到最后一版的版本号了,怎么办的,用$ git reflog查看命令历史,根据提交说明找到最后一版的版本号就可以了。

后期会用到远程服务器,以上执行的版本回退只是针对本地仓库,而服务器仓库不变,如果想同步到服务器,执行$ git push -f -u origin master

下一篇:Git详细教程(二)

参考链接
Git - Book
Git教程 - 廖雪峰的官方网站

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

推荐阅读更多精彩内容