当前位置:蜗牛素材网>综合资讯>科技>正文

git版本对比命令 一篇文章教你学废Git版本管理

人气:351 ℃/2024-02-10 08:14:18

VCS(Version Control System),一种用于记录一个或多个文件内容变化 历史,以便将来能对特定版本的历史记录进行查看,更改,备份还原的系统。 可以简单类比为「 游戏存档 」,打Boss前存下档,没过关,重新读档; 分支剧情,想体验不同选择触发的不同剧情,可以存多个档, 想玩哪个读哪个。

VCS一般分为下述三类:

  • 1. 本地VCS

使用简单的数据库来记录文件的历史更新差异,比如RCS。

  • 2. 集中式VCS

用一个服务器来保存所有文件的修订版本,协同工作的人连接这个服务器, 获取或提交文件更新,比如SVN。

这种协同方式有个两个明显的缺点: 1.「 需要联网 」:同步和推送更新速度受带宽限制,内网还好,外网可能会有点慢了(大文件); 2.「 依赖中央服务器 」:每个人的本地只有以前所同步的版本,如果服务器宕(dang)机了,谁都无法获取或提交更新。

  • 3. 分布式VCS

每个用户拥有完整的提交历史,支持离线提交更改,查看历史提交记录等。中央服务器更多的只是用作更改合并,同步的工具,比如Git。

从根本上来说,Git是一个 内存寻址的文件系统 ,根据文件的Hash值来定位文件。 这个40位的Hash值使用SHA1算法生成,由两部分拼接: header = "<type>" content.length "\0" (参数依次为:对象类型,数据字节长度,空字节(用于分隔header与content) hash = sha1(header content) ,这里的拼接是二进制级别的拼接,而非字符串拼接。

2. Git与SVN的区别

Git和SVN除了上面说的联网需求不同外,还有「 存储差异 」:

SVN关心: 文件内容的具体差异 ;而Git关心: 文件整体是否发生改变 。 SVN每次提交记录的是:「 哪些文件进行了修改,修改了哪些行的哪些内容 」。

如图,Version 2中记录的是文件A和C的变化,而Version 3中记录文件C的变化,以此类推; 而Git中,并不保存这些前后变换的差异数据,而是保存整个缓存区中的所有文件, 又称 快照 ,「 有变化的文件保存,没变化的文件不保存,而是对上次保存的快照做一个链接 」, 因为这种不同的保存方式,使得Git切换分支的速度比SVN快上不少。

当然SVN也有它的优点,比如「 权限控制 」,可以设定每个账户的读写权限,而Git中 则没有相应的权限控制。至于用哪个的,还是看公司要求吧~

3. Git的四个组成部分

简单说下Git的四个组成部分:

  • 工作区 :不包含.git文件夹在内的整个项目目录,所有修改都在工作区内进行。
  • 暂存区 :又称索引区,本地文件修改后,执行add操作会把工作区的修改添加到缓存区。
  • 本地仓库 :当执行commit操作时,暂存区的数据被记录到本地仓库中。
  • 远程仓库 :托管项目代码的服务器,多人协作时通过远程仓库进行代码同合并与同步。

接下来说下这几个部分是如何协同工作的:

工作区与暂存区:工作区更改,通过git add命令可以把更改提交到暂存区; 也可以git checkout命令使用暂存区内容覆盖当前的工作区的内容。

暂存区与本地仓库:可以通过git commit命令把暂存区的内容提交到本地仓库, 每次commit都会生成一个快照,快照使用Hash值编号。可以通过git reset Hash值, 把某个快照还原到暂存区中。

工作区和本地仓库:通过git checkout 快照编号,直接把某个快照还原到工作区中。

本地仓库和远程仓库:可以通过git push命令把commit推送到远程仓库,多人协作的 时候可能还需要进行一些冲突处理;还有通过git clone拉取某个远程仓库的项目到本地, 或通过git fetch拉取远程仓库的最新内容,检查后决定是否合并到本地仓库中。

工作区和远程仓库:这里两者的协作一般是git pull,即把远程主机的最新内容拉取下来后直接合并。

4. Git中文件的几个状态

按照大类划分,可以分为两种状态: Tracked (已跟踪)和 Untracked (未跟踪), 依据是:「 该文件是否已加入版本控制 」?

文件状态变化周期流程图:

流程简述:

假设某个项目已加入Git版本控制系统

  • 1.新建一个文件,该文件处于 Untracked 状态;
  • 2.通过git add命令添加到缓存区,此时文件处于** Tracked 状态又或者说 此时这个文件已经被版本控制系统所跟踪,而且他处于 STAGed **(暂存)状态;
  • 3.通过git commit命令把暂存区的文件提交提交到本地仓库,此时文件处于 Unmodified (未修改)状态;
  • 4.此时如果去编辑这个文件,文件又会变成** Modified **(修改)状态;

5. Git中的四类对象

在Git系统中有四种类型的对象,几乎所有的Git操作都是在这四种对象上进行的,依次为: Blob (块)对象, Tree (树)对象, Commit (提交)对象, Tag (标签)对象。 前三者的关系如图所示:

接着我们来详解的讲解这四类对象:

① 块对象(Blob)

一块二进制数据,「 仅存放文件内容 」,不包括文件名、权限等信息。Git会根据文件内容计算 出一个 Hash值 ,以这个Hash值作为文件索引保存起来。意味着,相同文件内容的文件,只会保存 一个,即共享同一个Blob对象。可以使用: git hash-object 文件名 来计算文件内容的Hash值。 如果你知道已经添加到Git中的某个文件的hash值,还可以通过 git cat-file hash值 来读取数据 对象,可选参数: -p (查看Git对象内容) , -t (查看Git对象类型),示例如下:

② 树对象(Tree)

保存一个或多个块对象的引用,每次commit对应一个树对象,这里生成一个commit, 然后调用** git ls-tree Hash值 ** 查看树对象的内容:

利用上面的 git cat-file -p hash值 来查看blob块的具体内容:

除了保存块对象的引用外,树对象还可以引用「 其他树对象 」,从而构成一个「 目录层次结构 」。 新建一个test目录,复制一个1.txt文件到这个路径下,提交一个commit,然后查看树对象的内容:

可以指向了另一个tree对象,这个tree对象指向另一个1.txt文件,树对象解决了 文件名 的问题。 而对于提交的人、时间、说明信息等,我们还需要通过提交对象进行了解。

③ 提交对象(Commit)

保存树对象的Hash值,父Commit的Hash值,提交作者、时间、说明信息。 同样可以使用** git cat-file **命令查看commit对象:

④ 标签对象(Tag)

一般会对某次重要的commit加TAG,以示重要,分为两种情况:

  • 轻量级标签 :不会创建真正的TAG对象,而是直接引用commit对象的Hash值。
  • 附加标签 :会创建TAG对象,TAG对象中包含commit对象的引用,除此之外会创建 一个文件: .git/refs/tags/标签名 ,里面保存TAG对象的引用。

这里为我们上面的两个commit一次打上两种标签,然后看下具体的结果:

0x2、Git下载安装配置

  • Windows系统 :到 Git For Windowsgit-for-windows.Github.io 下载,傻瓜式下一步。
  • Linux系统 :到 Download for Linux and Unix 下载,如果是Ubuntu的话,直接Terminal键入: sudo apt-get install git 安装即可。
  • Mac系统 :到 Installing on Mac 下载,不过新系统貌似默认已经带有Git了,另外如果安装了 Homebrew的话可以直接命令行键入: brew install git 进行安装。

0x3、Git本地基本操作

1. 相关配置「git config」

安装完后,使用Git还需要进行环境的配置,配置信息保存在gitconfig文件中,有三种级别:

  • system (系统): 系统中所有用户 都会生效,配置文件: C:\Program Files\Git\mingw64\etc\gitconfig , 不同的系统可能不一样,你可以通过: git config -e --system ,底部可以找到配置文件的路径:
  • global (全局): 当前系统用户下生效 ,配置文件: C:/Users/当前用户/.gitconfig , 同样可以采用上面的: git config -e --global 查看配置文件的位置。
  • local (本地): 配置仅在当前项目生效 ,配置文件: 项目路径/.git/config

配置生效优先级:local > global > system, 常用命令

# 配置git config --global user.name "用户名" # 配置用户名git config --global user.email "用户邮箱" # 配置邮箱git config --global core.editor 编辑器 # 配置编辑器,模式使用vi或者vim# 查看配置git config --global user.name # 查看配置的用户名git config --global user.email # 查看配置的邮箱# 查看所有配置列表git config --global --list # 查看全局设置相关参数列表git config --local --list # 查看本地设置相关参数列表git config --system --list # 查看系统配置参数列表git config --list # 查看所有Git的配置(全局 本地 系统)

除了命令行的方式外,你还可以直接去编辑对应的配置文件。

2. 获取帮助「git help」

git help 命令 # 查看某个git命令的介绍,用法git 命令 --help # 另一种写法

3. 创建本地仓库「git init」

git init 仓库名 # 创建一个新的带Git仓库的项目git init # 为已存在的项目生成一个Git仓库

4. 添加文件到暂存区「git add」

git add 文件名 # 将工作区的某个文件添加到暂存区。git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件git add . # 将当前工作区的所有文件都加入暂存区git add -i # 进入交互界面模式,按需添加文件到缓存区

很多人应该没用过交互界面模式,这里演示下用法:

流程简述:

  • 在GitTest文件夹中新建两个文件;
  • 键入git add -i,进入交互界面模式,键入4,选择添加untracked(未标记)的文件;
  • 根据未标记文件的序号来添加文件,输入?会弹出相关提示,直接回车,结束选择;
  • 键入4,可以看到已经不存在untracked的文件了。

5. 让Git不Tracked特定文件「.gitignore文件配置」

当我们使用git add命令把未标记的文件添加到缓存区后,Git就会开始跟踪这个文件。 对于一些比如: 自动生成的文件日志临时编译文件应用签名文件等 ,就没必要进行跟踪了, 我们可以编写一个**「.gitignore文件」 ,把不需要跟踪的文件和文件夹写上,git就不会去 跟踪这些文件了,另外: .gitignore文件与.git文件夹在同级目录下**。

如果不想自己写这个文件,可以到 github.com/github/giti… 选择对应的模板,复制粘贴。 也可以自行编写,支持简化了的真这个表达式(规范与示例模板摘自: Git王者超神之路

*[abc][0-9]?**

模板示例:

# 忽略所有以 .c结尾的文件*.c# 但是 stream.c 会被git追踪!stream.c# 只忽略当前文件夹下的TODO文件, 不包括其他文件夹下的TODO例如: subdir/TODO/TODO# 忽略所有在build文件夹下的文件build/# 忽略 doc/notes.txt, 但不包括多层下.txt例如: doc/server/arch.txtdoc/*.txt# 忽略所有在doc目录下的.pdf文件doc/**/*.pdf

有一点要特别注意!!!!

配置.gitignore只对那些 没有添加到版本控制系统的文件生效 ( 未Tracked 的文件)!

举个简单的例子:

有A,B两个文件,你先把他两个add了,然后在.gitignore文件中 配置了不跟踪这两个文件,但是你会发现根本不会生效。

git add Agit add B# 配置不跟踪A和Bgit add .gitignore

所以,最好的做法就是在项目刚开始的时候,先添加.gitignore文件。 当然,即使是发生了,还是有解决方法的,可以键入下述命令清除标 记状态,然后先添加.gitignore,再添加文件即可:

git rm -r --cached . # 清除版本控制标记,.代表所有文件,也可指定具体文件

另外,如果你用的IDEA系列的代码编辑器,可以安装一个「.ignore」的插件,手动 勾选不需要跟踪的文件,直接生成.gitignore文件。

6. 将暂存区的内容提交到本地仓库「git commit」

git commit -m "提交说明" # 将暂存区内容提交到本地仓库git commit -a -m "提交说明" # 跳过缓存区操作,直接把工作区内容提交到本地仓库

如果不加-m “提交说明”,git会让用你让默认编辑器(vi或vim)来编写提交说明。 除此之外,有时可能想修改上次提交的内容:提交说明,修改文件等:

# 合并暂存区和最近的一次commit,生成新的commit并替换掉老的。如果缓存区没内容,# 利用amend可以修改上次commit的提交说明。# # 注:因为amend后生成的commit是一个全新的commit,旧的会被删除,所以别在公共的# commit上使用amend!切记!!!git commit --amend git commit --amend --no-edit # 沿用上次commit的提交说明

7. 查看工作区与缓存区的状态「git status」

git status # 查看工作区与暂存区的当前情况git status -s # 让结果以更简短的形式输出

8. 差异对比(内容变化)「git diff」

git diff # 工作区与缓存区的差异git diff 分支名 # 工作区与某分支的差异,远程分支这样写:remotes/origin/分支名git diff HEAD # 工作区与HEAD指针指向的内容差异git diff 提交id 文件路径 # 工作区某文件当前版本与历史版本的差异git diff --stage # 工作区文件与上次提交的差异(1.6 版本前用 --cached)git diff 版本TAG # 查看从某个版本后都改动内容git diff 分支A 分支B # 比较从分支A和分支B的差异(也支持比较两个TAG)git diff 分支A...分支B # 比较两分支在分开后各自的改动# 注:如果只想统计哪些文件被改动,多少行被改动,可以添加--stat参数

9. 查看历史提交记录「git log」

git log # 查看所有commit记录(SHA-A校验和,作者名称,邮箱,提交时间,提交说明)git log -p -次数 # 查看最近多少次的提交记录git log --stat # 简略显示每次提交的内容更改git log --name-only # 仅显示已修改的文件清单git log --name-status # 显示新增,修改,删除的文件清单git log --oneline # 让提交记录以精简的一行输出git log –graph –all --online # 图形展示分支的合并历史git log --author=作者 # 查询作者的提交记录(和grep同时使用要加一个--all--match参数)git log --grep=过滤信息 # 列出提交信息中包含过滤信息的提交记录git log -S查询内容 # 和--grep类似,S和查询内容间没有空格git log fileName # 查看某文件的修改记录,找背锅专用

除此之外,还可以通过 –pretty 对提交信息进行定制,比如:

更多规则与定制如下(更多可参见: Viewing the Commit History ) format对应的 常用占位符 :(注:作者是指最后一次修改文件的人,提交者是提交该文件的人)

占位符说明占位符说明%H提交对象(commit)的完整哈希字串%h提交对象的简短哈希字串%T树对象(tree)的完整哈希字串%t树对象的简短哈希字串%P父对象(parent)的完整哈希字串%p父对象的简短哈希字串%an作者(author)的名字

搜索更多有关“git版本对比命令 一篇文章教你学废Git版本管理”的信息 [百度搜索] [SoGou搜索] [头条搜索] [360搜索]
本网站部分内容、图文来自于网络,如有侵犯您的合法权益,请及时与我们联系,我们将第一时间安排核实及删除!
CopyRight © 2008-2024 蜗牛素材网 All Rights Reserved. 手机版