Git — 从安装到操作
本文大致描述了Git的操作过程(Windows实现的,少部分与Linux不同)……
安装
- 在 windows 上安装
Git
:- 访问官网,直接从官网上下载:Git
- 安装完成之后,鼠标右键,如果出现了
Git Bash Here
,则说明安装成功 - 输入以下内容查阅版本号也可以验证安装是否成功
git --version
- 因为
Git
是分布式版本控制系统,所以在安装之后必须关联到自己的用户名和邮箱上$ git config --global user.name "xxx" $ git config --global user.email "xxx@xxx.com"
- 注意:
git config
命令的--global
参数表示的是,你这台电脑上,所有的Git仓库都会使用这个配置,
当然,你也可以对某个仓库指定特定的用户名和邮箱,即:$ git config user.name "xxx" $ git config user.email "xxx"
- 注意:
- 查看与修改:
- 查看用户名与邮箱
$ git config user.name $ git config user.email
- 修改用户名与邮箱其实与创建时的操作一样的,可以想象成你创建的新用户名以及邮箱覆盖掉了之前的
- 查看用户名与邮箱
创建版本库
- 版本库 即 仓库,仓库里面的所有文件都由Git管理,Git能跟踪每个文件的更、删、改,以便随时还原到某个时刻
- 创建版本库方法:
- 创建一个新文件夹,比如我在桌面新建一个
project
(在Windows系统中请保持英文名称,以免出现莫名其妙的错误) - 然后:右键 -> 选择
Git Bush here
- 输入
git init
,即可把这个文件夹变为Git可以管理的仓库 - 当然,现在还只是一个“看起来为空的仓库”,其实,创建成功之后,会在该仓库中生成一个隐藏的文件夹:
.git
文件夹 - 现在我们来用
cmd
看一下这个.git
文件夹里面有什么:- 在对应的文件夹路径下面,输入
dir/a:h
,查看隐藏文件 - 输入
cd .git
,进入对应的.git
文件目录下面 - 输入
dir
,看里面的文件
- 在对应的文件夹路径下面,输入
- 需要注意的是,这个
.git
目录是Git用来跟踪管理版本库的,emm,不要碰为好
- 创建一个新文件夹,比如我在桌面新建一个
把文件添加到版本库
假设现在我们在上述的版本库
project
下添加一个名为first.txt
,内容为My first text
的文件。
- 第一步:用
git add
添加文件
- 新建文件
first.txt
,内容为My first text
- 在
project
路径下输入命令:$ git add first.txt
- 如果没有任何提示,这个过程就默默地结束了,那么恭喜你,成功了,Unix的哲学是“没有消息就是好消息”
- 注:
git add
后面可以跟多个文件,甚至是不同类型的文件,如:$ git add a.txt b.doc
- 而下面提到的
git commit -m "xxx"
一次性可提交多个文件- 第二步:用
git commit -m "xxx"
把文件提交到仓库$ git commit -m "xxx"
- 注:未报错即为提交成功,这里引号内的内容是对这次提交的注释,即对本次提交的说明
- 只用
git commit -m
会报错:error: switch 'm' requires a value
,因此,强烈建议写上有意义的内容,这对阅读者更友好
穿梭过去,回到未来
- 我们已经学会了添加和提交,其实
commit
就像一个快照一样,一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit
恢复,然后继续工作,而不是把几个月的工作成果全部丢失 - 实际生活中,我们也不可能把每次的修改都记住,当然,这一点在Git上面完美解决了,我们可以用
git log
查看我们的历史记录:$ git log
git log
命令显示从最近到最远的提交日志- 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上
--pretty=oneline
参数:$ git log --pretty=oneline
- 注:那一大串的字符,其实是
commit id
(版本号),每提交一个新版本,实际上Git就会把它们自动串成一条时间线
- 现在呢,我们启动时光穿梭机,准备把
first.txt
回退到上一个版本,怎么做呢?- 首先,Git必须知道当前版本是哪个版本,在Git中,用
HEAD
表示当前版本,用HEAD^
就表示上一个版本,HEAD^^
表示上上个版本,以此类推 - 其实,
git reset
命令可以做到:$ git reset --hard HEAD^
- 注:当然,还可以继续回退哈
- 首先,Git必须知道当前版本是哪个版本,在Git中,用
- 现在应该被还原了,我们用
git log
查看现在版本库的状态,细心点会发现,怎么没有了最后的版本呢?那岂不是我只能回去不能回来?- 其实办法是有的,如果你的命令窗口没有关闭的话,你可以在回退之前找到那个最后的版本,比如我这里是
dca7d8f1f6d06405f7395712f17d1c83a410cf82
- 然后,我只需要
git reset
到那个版本去即可:$ git reset --hard dca7
- 注:
hard
后面跟的是版本号,这里的版本号不需要写全,Git会自动寻找(当然也不能只写前面一两个字母,以免多个版本号无法确定是哪一个)
- 其实办法是有的,如果你的命令窗口没有关闭的话,你可以在回退之前找到那个最后的版本,比如我这里是
- Git的版本回退速度非常快,因为Git在内部有个指向当前版本的
HEAD
指针,当你回退版本的时候,Git仅仅是把HEAD从指向你指定的版本号 - 现在,你回退到了某个版本,但是关闭了电脑,打开电脑之后想恢复到新版本怎么办?找不到新版本的commit id怎么办?
- Git提供了一个命令
git reflog
用来记录你的每一次命令:$ git reflog
- 现在找到了版本号,就可以穿梭到过去未来啦
- Git提供了一个命令
查看状态与追踪修改
- 之前我们已经成功地添加并提交了一个
first.txt
文件,现在,我们对该文件做一些修改,但是我们并不着急提交到Git上去 - 我们尝试着在命令行里面输入
$ git status
- 情况如下:
git status
告诉我们:first.txt
被修改了,但是这个修改之后的文件并未提交- 那么如何查看修改的具体情况呢?答案是
git diff
:$ git diff first.txt
- 那么,现在我们重新刷一遍流程:
git add first.txt
添加修改后的文件(先添加才能提交,否则会报错)git commit -m "..."
提交修改后的文件git status
查看状态
工作区和暂存区
- 什么是工作区?
- 工作区就是你能看到的目录
- 前面提到过,
.git
是Git的版本库,Git版本库中存放了很多东西,其中最重要的就是:- 暂存区:
stage
(有时也把暂存区叫做索引,所以暂存区也叫index
) - Git自动创建的一个分支:
master
- 指向 master 的一个指针:
HEAD
- 暂存区:
- 下面这幅图表示了工作区、暂存区之间的关系:
- 左侧为工作区,右侧为版本库,在版本库中标记为
index
的区域是暂存区,标记为master
的是master分支所代表的目录树 - 此时
HEAD
实际是指向 master 分支的一个”游标”。所以图示的命令中出现HEAD的地方可以用master来替换 - 图中的
objects
标识的区域为 Git的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容
stage
与git add
,git commit
的联系:- 前面的
git add
用来添加文件,实际上就是把文件添加到暂存区,同时,工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中 - 之后的
git commit
用来提交文件,实际上就是把暂存区中的内容提交到当前分支,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新 - 由于Git自动创建了一个分支:
master
,所以现在git commit
就是往master
分支上提交更改 - 可以简单理解为,需要提交的文件修改全部放到暂存区,然后,一次性提交暂存区的所有修改
- 前面的
管理修改
- 为什么Git比其他版本控制系统设计得优秀?因为Git跟踪并管理的是修改,而非文件,跟着下面体会一下吧:
- 现在我们修改一下
first.txt
,随便为其添加一行this is new
- 然后,我们用
git add first.txt
添加,再用git status
查看: - 现在我们再次修改文件,我们再添加一行
this is new new
- 我们用
cat first.txt
来查看一下这个文件的内容: - 现在我们用
git commit -m
提交一下:- 为什么会显示没有修改呢?
- 我们回顾一下流程:第一次修改 -> git add -> 第二次修改 -> git commit
- 因为Git管理的是修改而非文件
- 当你用
git add
命令后,在工作区的第一次修改被放入暂存区,准备提交,但是工作区的第二次修改并未放到暂存区 - 而
git commit
只负责提交暂存区的修改,所以只提交了第一次的修改
撤销修改
- 现在,我们添加一行:
This line is about to be revoked
- 我们当然可以在退出前手动删除,但是退出之后呢?
- 我们先用
git status
查看一下:- 现在的情况是,我在工作区修改了文件,但是我还没有提交到git上面去,我想通过git来撤销这个修改
- 好的,那么,试试这个命令:
$ git checkout -- first.txt
- 再用
cat first.txt
查看一下文件内容,是不是惊奇地发现,我才添加的一行内容被撤销了… - 注意:
git checkout -- file
中的--
非常重要,如果没有--
,就变成了切换到另一个分支的命令
- 再用
- 现在,我们尝试着“过分一点”:我们不仅给文件添加了一个内容,而且我们还
git add
操作了- 冷静一下,
git status
让我们明白:现在我们只是添加到了暂存区,但是还没有提交 - 那我们怎么撤销呢?
- 冷静一下,
- Git同样告诉我们,用命令
git reset HEAD xxx
可以把暂存区的修改撤销掉(unstage),重新放回工作区:$ git reset HEAD first.txt
git reset
命令既可以回退版本,也可以把暂存区的修改撤销到工作区- 用
git status
查看,可以明白,现在暂存区是干净的,工作区有修改 - 我们再用
git checkout -- first.txt
丢掉工作区的修改吧,让这个世界彻底清净.
删除文件
- 通常删除文件时,直接在文件管理器中把没用的文件删了,或者用rm命令删了:
$ rm first.txt
- 我们现在删除文件,然后通过
git status
命令会立刻明白哪些文件被删除了: - 现在你有两个选择;
- 一是确实要从版本库中删除该文件,那就用命令
git rm
删掉,并且git commit
$ git rm first.txt $ git commit -m "remove first.txt"
- 二是你删错文件了,但是因为版本库里面还有,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- first.txt
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
- 一是确实要从版本库中删除该文件,那就用命令
- 命令
git rm
用于删除一个文件,如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容
本地代码上传到远程仓库(GitHub)
这里我举例把本地的
example
文件夹中的所有内容(这里只有一个index.html
)上传到GitHub仓库中去
- 创建版本库
$ git init
- 将代码上传到本地的Git仓库中
- 首先,我们得清楚的是,我们要做的是将本地的仓库与远程的GitHub仓库关联起来
- 那么,我们必须先把代码先上传到本地的Git仓库中
- 前面,我们只是新建了一个Git仓库,这个仓库显然还是空的,那么,我们现在上传本地代码:
$ git add index.html $ git commit -m "first"
- 至此,本地工作完毕,接下来操作GitHub的Git仓库
- 在GitHub中创建一个Git仓库
- 注:这里的仓库名随意,除了取名外其他项均可不管
- 成功创建如下:
- 其实在创建成功的那一页,GitHub下面有相关的提示,OK,那么我们现在根据提示来关联到GitHub上:
$ git remote add origin git@github.com:xxx/xxx.git
- 注:这里的
git@github.com:xxx/xxx.git
其实就是你的仓库的地址- 添加后,远程库的名字就是
origin
,这是Git默认的名称,也可以改成别的,但是origin已是约定俗成吧- 关联成功之后,就该传代码啦!
$ git push -u origin master
- 注:其实
git push
命令实际上就是把当前的分支master
推送到远程- 可在你的GitHub仓库中查看是否上传成功:(样例如下)
- 我们还差最后一步:将本地内容推送到GitHub上(总不能改一次代码就建一个仓库吧)
- 很简单,假设我现在在目录下做了改动(我对
index.html
做了改动)- 那么,一条命令即可更新远方的
index.html
:$ git push origin master
- 细节
- 细心的朋友可能会发现,似乎刚才的
$ git push origin master
只能刷新index.html
,而假如说我在文件夹新建了new.txt
,这条命令并不会因此就帮我上传到GitHub- 还记得之前说过的么?GitHub是被本地Git仓库关联的,也就是说,只是新建了
new.txt
,都没有传到本地Git上去,怎么可能传到GitHub上去呢?- 好吧,不多费口舌了,直接扔答案吧:
$ git add new.txt $ git commit -m "second" $ git push origin master
- 最终,我们成功在GitHub更新了!也就拥有了真正的分布式版本库!
从远程库克隆(略过)
本次博客先更新到这里,之后若有需要会再次探讨Git世界
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐使用cmder