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
Changes to be committed
和Changes 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
本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。 所以有时候你一下子暂存了所有更新过的文件后,运行 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