一、安装Git
Linux
sudo apt-get install git
Mac
-
安装homebrew,通过homebrew安装。
参考文档:http://brew.sh/
-
安装Xcode,选择菜单"Xcode->Preferences",在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。
Windows
在git官网下载安装程序,傻瓜式安装即可。
安装完成后在开始菜单里面找到"Git->GIt Bash",若弹出一个命令窗口,即说明安装成功。
设置git:
git config --global user.name "Your Name"
git config --global user.email "Your Email"
Note:这里的–global参数是对机器上的所有Git仓库使用该配置
二、Git的基本使用
创建版本库
-
创建一个空目录,该目录为以后写代码或文件的地方
mkdir git_study cd git_study
-
初始化git仓库
git init ls -ah
初始化后在git_study文件夹下面生成了一个.git隐藏文件,该文件是用来跟踪管理版本库的。
向版本库中添加文件
-
编写一个新的文件readme.txt,内容如下:
-
使用
git add
命令将文件添加到仓库:git add readme.txt
执行完该命令后没有任何显示即说明添加成功。
-
使用
git commit
命令把已经添加的文件提交到仓库:git commit -m "worte a readme file"
Note:-m参数后面输入的是本次提交的说明,可以任意输入,最好将本次提交所更改的内容用简短的语句写出来,便于查找。
查看仓库状态及文件差异
-
首先将readme.txt文件修改,修改后的内容如下所示:
-
这时,我们可以使用
git status
命令来查看仓库当前的状态:上面的输出信息说明:readme.txt文件被修改过了,但是还没有加入到仓库中。
-
如果忘了修改的具体内容的话,可以通过
git diff
命令来查看具体的修改内容:git diff readme.txt
从上面的输出信息可以看到,在原来的基础上增加了一句话。
Note:在"git diff"命令的输出结果中,一行之前若果是减号,则说明改行被删除;一行之前如果是加号,则说明该行被添加;一行前面什么也没有,则说明改行没有发生改动。
-
将被改动的文件提交到仓库:
git add readme.txt
在提交之前,可以通过
git status
来查看当前仓库的状态:输出的信息表示当前的修改已经被添加(或者可以说是保存在了要提交到仓库的文件空间中)
git commit -m "add second line"
将当前修改提交后再查看仓库的状态显示:工作区是干净的。
版本回退
-
如果忘了以前对该仓库中的文件都做了哪些修改的话,可以使用
git log
命令来查看历史记录:Notes:
-
参数 --pretty=oneline可以使输出每次的修改信息缩短到一行
-
commit后面黄色的遗传十六进制数时每次对应的版本号,使用SHA1计算得来。
-
-
退回到"wrote a new line"版本:
首先需要知道:
- 在git中,用
HEAD
表示当前的版本 HEAD^
表示上一个版本,以此类推- 若回退的半本书较多,可以写成
head~num
,其中num为回退的版本数
现在,就可以使用
git reset
命令来实现版本的回退了:可以看到,现在的文件信息已将变为了上个版本中的内容
这时,查看一下历史记录:
可以看到历史记录中没有了"add second line"的记录
如果想回到"add second line"这个版本的话,可以指定版本号(版本号从前面的记录中找)来实现回退:
可以看到,文件内容回来了。
如果找不到以前的版本号,可以使用
git reflog
命令来查看历史使用过的命令:这样就可以看到以前的版本号了。
- 在git中,用
-
git版本回退的原理:
在git内部,有一个HEAD指针指向当前的版本:
当版本回退时,只需要将指针指向"wrote a new line"即可:
两个重要的区:工作区和暂存区
工作区(Working Directory)
在一开始使用git init
初始化的目录
版本库(Reponsitory)
在工作区中有一个.git
的隐藏文件,这就是版本库。
在版本库中有暂存区(stage或者叫index)、git自动为我们创建的第一个分支–master以及指向master的一个指针–HEAD。
暂存区(stage)
用于保存文件的修改并将所有被保存的修改一次性提交到当前所在的分支。
工作区、暂存区以及master之间的关系
在向仓库中添加的时候,分为两个步骤:
- 使用
git add
将修改添加到暂存区中; - 使用
git commit
将更改提交到当前分支。
管理修改
Git在本质上是对修改进行管理和跟踪的,而非文件。
所谓修改,就是相对于之前的工作空间,你所作出的一系列操作,包括在文件中新增加一行,删除了一行,更改了某些子,或是在工作空间中添加了一个新的文件等等。
实例:
-
对readme.txt 进行修改:
-
将修改添加到暂存区:
-
对readme.txt进行第二次修改:
-
提交更改并查看工作区状态:
显示还有修改没有被提交
-
使用
git diff HEAD -- readme.txt
命令查看当前版本与文件的区别: 看到第二次的修改没有被提交。
-
原因:
在第一次修改后,将修改添加到暂存区中,在第二次修改后,没有add修改,而是直接commit,导致第二次修改没有保存就被提交。
撤销修改
使用git checkout -- file
可以丢弃对工作区的修改
Note:这里的两个杠非常重要,有杠表示撤销工作区的修改,没杠表示切换分支的命令。
文件被修改后未添加到暂存区的情形:
-
在readme.txt中添加一句话:
-
查看此时的工作区状态:
-
执行
git checkout -- readme.txt
命令后查看当前工作区的状态:Note:这里的撤销有两种情况: 1.readme.txt自修改后还没有被放到暂存区,则撤销后就回到和版本库中最新的版本相同的状态; 2.readme.txt已经添加到暂存区,然后对其做了修改,则撤销后就回到添加到暂存区后的状态。
-
查看一下文件内容:
可以看到,文件中被修改的内容已经被撤销了。
文件被修改后已经添加到暂存区的情形:
-
修改文件内容,并将修改保存到暂存区:
-
查看工作区的状态:
可以看到git提示我们可以使用
git restore --stage file
命令来取消在工作区的暂存,重新放回工作区(也可以使用git reset HEAD file
命令); -
执行撤销修改的命令:
文件的修改从暂存区回到了工作区,如果想继续删除修改,则可以使用
git checkout -- file
命令来删除工作区中的修改。
文件提交到版本库时想撤销本次提交(前提是没有推送到远程库):
使用git reset
命令,将版本回退。
删除文件
-
创建一个新的文件text.txt,并将其提交到版本库中;
-
使用
rm
命令将改为年间删除; -
此时工作区的状态为:
这里分为了两种情况:
-
如果时你确实要将该文件删除,那么应使用
git rm
和git commit
命令将文件彻底删除: -
若果是你将文件误删了,可以使用
git checkout -- text.txt
将文件恢复为最新的版本:Note:这里只能恢复到版本库中的最新版本,你会丢失最近一次提交后你的修改内容。
-