本文将以一个简单实例的形式来介绍 Git 版本切换
首先,在一个自定义的位置,创建目录 a,比如在 D 盘下
[注意] 本文会用到一些常用的 Linux 的 Shell 命令,详细信息移步至此
先使用 cd d: 命令,切换到 d 盘,然后使用 mkdir a 命令,在 d 盘下新建一个名称为 a 的文件夹。最后,使用 ls 命令,查看 d 盘下的所有文件及文件夹,发现 a 是存在的,所以操作成功
然后,使用 cd a 命令,进入 d 盘下的 a 文件夹
接下来,使用 git init 命令,初始化一个 Git 仓库。创建仓库的本质就是在当前文件夹下创建一个. git 文件夹
然后使用 git status 命令,查看当前的文件状态
接下来,在 a 文件夹下,使用 touch 1.txt 命令,新建一个 1.txt 文本文件,再使用 git status 命令,查看当前的文件状态。在状态报告中可以看到新建的 1.txt 文件出现在 "Untracked files" 下面,表示该文件为未跟踪的文件
接着,使用 git add 1.txt 命令,跟踪该文件。此时再运行 git status 命令,会看到 1.txt 文件已被跟踪,并处于暂存状态。只要在 "Changes to be committed" 这行下面的,就说明是已暂存状态
再运行提交命令 git commit -m 'add 1.txt',提交文件 1.txt。提交后它会提示,当前是在哪个分支 (master) 提交的,本次提交的完整 SHA-1 校验和是什么(beac21a),以及在本次提交中,有 1 个文件修订过,0 行添改,0 行删改过
再运行命令 git status 时,因为文件已经被提交了,所以提示没有什么可供提交的了,工作目录很干净
接下来,我们使用 cat > 1.txt 命令,将 1.txt 文件的内容从无内容修改为'1'。使用 git status 时,提示当前文件没有放置在暂存区
使用 git add 1.txt 命令,放置在暂存区,再使用 git status 时,提示 1.txt 文件已被跟踪,并处于暂存状态
使用 git commit -m 'alter to 1'命令,来提交文件 1.txt。提交后它会提示,本次提交的完整 SHA-1 校验和是 f73e651,以及在本次提交中,有 1 个文件修订过,1 行添改过
接下来,照猫画虎,创建 1.txt 的第三个版本,将其内容修改为'2'并提交。本次提交的完整 SHA-1 校验和是 74833f8,以及在本次提交中,有 1 个文件修订过,1 行添改过、1 行删改过
现在,我们总共把三个版本的 1.txt 文件提交到 Git 仓库中了
- 版本1:空内容
- 版本2:'1'
- 版本3:'2'
当然了,在实际工作中,我们处理的文件比较复杂,并不能记得每次都改了什么内容。在 Git 中,我们用 git log 命令查看提交历史
git log 命令显示从最近到最远的提交日志,我们可以看到 3 次提交,最近的一次是 alter t0 2,上一次是 alter to 1,最早的一次是 add 1.txt
如果嫌输出信息太多,可以加上 --pretty=oneline 参数
git log 有许多选项,下表列出了一些常用的选项及其释义
- 选项 说明
- -p 按补丁格式显示每个更新之间的差异
- --word-diff 按 word diff 格式显示差异
- --stat 显示每次更新的文件修改统计信息
- --shortstat 只显示 --stat 中最后的行数修改添加移除统计
- --name-only 仅在提交信息后显示已修改的文件清单
- --name-status 显示新增、修改、删除的文件清单
- --abbrev-commit 仅显示 SHA-1的前几个字符,而非所有的40 个字符
- --relative-date 使用较短的相对时间显示(比如,"2 weeks ago")
- --graph 显示 ASCII 图形表示的分支合并历史
- --pretty 使用其他格式显示历史提交信息可用的选项包括oneline,short,full,fuller 和format(后跟指定格式)
- --oneline `--pretty=oneline --abbrev-commit` 的简化用法
我们常用 - p 选项展开显示每次提交的内容差异。可以看到,最近一次更新和上一次更新的区别是将 1 修改为 2。上一次和上上一次更新的区别是从空内容变成内容为 1
有时候图形化工具更容易展示历史提交的变化,随 Git 一同发布的 gitk 就是这样一种工具。它是用 Tcl/Tk 写成的,基本上相当于 git log 命令的可视化版本,凡是 git log 可以用的选项也都能用在 gitk 上。在项目工作目录中输入 gitk 命令后,就会启动下图所示的界面
现在,我们准备把 1.txt 回退到上一个版本,也就是内容为'1'的那个版本
首先,Git 必须知道当前版本是哪个版本,在 Git 中,用 HEAD 表示当前版本,也就是最新的提交 (74833f8172d219dbf755dff7cdc64356bff39aad),上一个版本就是 HEAD^,上上一个版本就是 HEAD^^,当然往上 100 个版本写 100 个 ^ 比较容易数不过来,所以写成 HEAD~100
现在,我们要把当前版本 "alter to 2" 回退到上一个版本 "alter to 1",就可以使用 git reset 命令
首先,使用 cat 1.txt 命令查看该文件的内容为'2',接着使用命令 git reset --hard HEAD^,将文件返回到上一个版本,再使用 cat 1.txt 命令查看该文件的内容为'1'
我们用 git log 再看看现在版本库的状态,发现最新的那个版本 "alter to 2" 已经看不到了
如果想返回到最新的版本,可以使用命令 git reset --hard commit_id 来实现
但是,如果找到最新版本的 1.txt 的 commit id 呢?Git 提供了一个命令 git reflog,该命令按照之前经过的所有的 commit 路径按序来排列,用来记录你的每一次命令
从 git reflog 命令返回的结果中发现,第五行的 beac21a 是上上个版本的 1.txt 文件的是 commit id,第四行的 f73e651 是上个版本的,第三行的 74833f8 就是最新版本的
下面使用 git reset 命令,将文件恢复到最新版本
Git 允许我们使用命令 git reset --hard commit_id 在版本的历史之间切换
HEAD 可以用来替换 commit_id,HEAD 指向的版本是当前版本,上一个版本就是 HEAD^,上上一个版本就是 HEAD^^,往上 100 个版本写成 HEAD~100
可以用 git log 可以查看提交历史,或者用 git reflog 查看命令历史,以便确定要切换的版本的版本号
来源: http://www.cnblogs.com/xiaohuochai/p/6685402.html