Git进阶--13、Git比对各区差异-git diff
1、git diff 命令说明在commit操作之前,我们通常要确定一下自己在什么地方更改了代码,看看有没有误操作代码,这个时候git status命令的显示就比较简单了,仅仅是列出了修改过的文件,如果要查看具体修改了什么地方,就可以使用git diff命令。 比较有用的选项:--stat:显示有多少行发生变化,简洁的展示差异。 2、比较工作区与暂存区中文件的差别查看工作区与暂存区内容的区别,使用无选项的git diff命令。 git diff file_name:获取指定文件的修改。 (1)首先在工作目录中创建一个hello.html文件,并添加到暂存区。 12345678cd ~ && rm -rf ~/gitDiffTestgit init gitDiffTest && cd gitDiffTestecho "hello git diff" >> hello.htmlgit add hello.html (2)向hello.html文件添加一行新的内容,之后查看工作区与暂存区hello.html文件的区别。 123 ...
Git进阶--14、Git移除大文件
Git 有很多很棒的功能,但是其中一个特性会导致问题,git clone 会下载整个项目的历史,包括每一个文件的每一个版本。 如果所有的东西都是源代码那么这很好,因为 Git 被高度优化来有效地存储这种数据。 然而,如果某个人在之前向项目添加了一个大小特别大的文件,即使你将这个文件从项目中移除了,每次克隆还是都要强制的下载这个大文件。 之所以会产生这个问题,是因为这个文件在历史中是存在的,它会永远在那里。 当你迁移 Subversion 或 Perforce 仓库到 Git 的时候,这会是一个严重的问题。 因为这些版本控制系统并不下载所有的历史文件,所以这种文件所带来的问题比较少。 如果你从其他的版本控制系统迁移到 Git 时发现仓库比预期的大得多,那么你就需要找到并移除这些大文件。 警告:这个操作对提交历史的修改是破坏性的。 它会从你必须修改或移除一个大文件引用最早的树对象开始重写每一次提交。 如果你在导入仓库后,在任何人开始基于这些提交工作前执行这个操作,那么将不会有任何问题——否则, 你必须通知所有的贡献者他们需要将他们的成果变基到你的新提交上。 为了演示,我们将添加一个大文件到 ...
Git原理--4、Git对象和存储原理-Commit对象
1. Commit对象介绍现在来介绍最后一种Git对象commit对象,也叫提交对象。 提交对象可以理解为是对树对象的一层封装,提交信息包括基于当前暂存区中索引文件生成的tree对象,还有包含了提交时间,提交者信息,作者信息,以及提交备注等内容,更重要的是里面还包含了父提交的ID(第一次提交没有父提交ID),由此就可以形成Git提交的有向无环图。(是链式的关系,把所有commit对象关联起来) 即:commit对象通常指向一个 tree 对象,并且封装了文件的提交时间,提交者信息,作者信息,提交备注,以及父提交引用等数据。 下面是commit对象的存储结构: 2. Commit对象说明我们通过练习来说明commit对象,接着用前面Tree对象的本地版本库。 (1)创建一个commit对象 我们可以通过调用commit-tree命令创建一个提交对象,为此需要指定一个树对象的SHA-1值,以及该提交的父提交对象。 说明:使用commit-tree命令来创建提交对象,一般都需要和父提交进行关联,如果是第一次将暂存区的文件索引数据提交到本地版本库,那么该提交操作就不需要指定父提交对象。 ...
Git原理--5、Git对象的总结
提示:前面三篇文章已经分别的对blob对象、tree对象、commit对象进行了详细的说明,这篇文章我们总结一下,Git对象在基础操作流程中的生成的时机。 1. Git操作最基本的流程1)创建工作目录对工作目录进行修改。 2)执行git add ./命令添加文件到暂存区。 相当于执行了如下两个底层命令: git hash-object -w 文件名(修改了多少个工作目录中的文件此命令就要被执行多少次) git update-index 说明:git add命令做了什么事情? 表面上是将工作目录中的文件添加到暂存区中,其实真正的流程是: 先将工作目录中的文件,生成blob对象存储到本地版本库中,一个文件生成一个blob对象,一个文件执行一次git hash-object -w 文件路径命令。 再通过git update-index命令,把本地版本库中blob对象,生成文件的索引(快照),存储到暂存区中。 所以说Git是绝对安全的,只要你对文件做过的修改,哪怕没有提交到本地版本库,只是提交到暂存区,Git也会帮你记录下来。 3)执行git commit -m "注 ...
Git进阶--10、git-merge用法解析-用法大全
git merge 应该是开发者最常用的 git 指令之一,默认情况下你直接使用 git merge 命令,没有附加任何选项命令的话,那么应该是交给 git 来判断使用哪种 merge 模式,实际上 git 默认执行的指令是 git merge -ff 指令(默认值) 1. Fast-forward1.1. ff1.1.1. 触发场景当dev是master最新commit(HEAD)的孩子,默认触发此模式 123456789101112131415161718192021222324252627cd ~rm -rf mergedemomkdir mergedemo;cd mergedemogit init .echo "hello A" > file.txtgit add .git commit -m "A"echo "hello B" >> file.txtgit add .git commit -m "B"echo "hello M1" >> file. ...
Git进阶--11、git-rebase用法解析与merge区别
1. 语法12345git rebase [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase>] [<upstream> [<branch>]]git rebase [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase>] --root [<branch>]git rebase --continue | --skip | --abort | --quit | --edit-todo | --show-current-patch 1.1. 适用场景1.1.1. 合并时精简提交历史squash merge也可以精简提交历史,详情请见Git进阶--10、git-merge用法解析-用法大全 由于squash merge会变更提交者作者信息,这是一个很大的问题,后期问题追溯不好处理(当然也可以由分支dev的所有者来执行squash ...
Git进阶--8、Git-后悔药-回退撤销-大总结
原图可去我的processon下载https://www.processon.com/view/link/63248872f346fb3377e76017
Git进阶--9、git-头指针分离原因及解决办法
分离头是什么我们知道在Git中分支是指向提交,而HEAD指针指向分支。所谓的分离头指针状态就是HEAD不再指向分支,而是直接指向某个commit。 解决办法解决办法11234# 将HEAD指向master分支git checkout master# 将HEAD和master一起指向0c72e64git reset --hard 0c72e64 解决办法2```shell 强制将 master 分支指向当前头指针的位置 :将master指向HEAD所指向的commit,此时master和HEAD都指向同一个commit$ git branch -f master HEAD 检出 master 分支 :将HEAD指向master分支$ git checkout master
Git进阶--7、git-reset、git-revert、git-checkout、git-restore区别
reset与checkout的异同commit模式checkout1git checkout [-q] [-f] [-m] [<branch>|<commit>] 当你checkout分支的时候,git做了这么三件事情 123> 将HEAD指向那个分支的最后一次commit或者指定的commit> 将HEAD指向的commit里所有的文件的snapshot替换掉Index区域里面的内容> 将Index区域里面的内容填充到Working Directory里 所以你可以发现,HEAD,Index,Working Directory这个时候里的内容都是一摸一样的。注意:一般会误解为,Index中的内容是空的,只有git add后才会有东西。实际上不是,add完第一次之后,Index里一直是有东西的。 所以,git里的所有操作就是对这三个区域的状态的操作。 此操作是WD(Working Directory)安全的 reset1git reset (<branch_name>|HEAD|<tree-ish>|<tag_ ...
Git原理 — 2、Git对象和存储原理-Tree对象
1、Tree对象介绍接下来要探讨的 Git 对象类型是树对象(tree object),它能解决文件名保存的问题。tree对象可以存储文件名,也允许我们将多个文件组织到一起。 Git以一种类似于UNIX文件系统的方式存储内容,但做了一些简化。所有内容均以树(tree)对象和数据(blob )对象的形式存储,其中树对象对应了UNIX中的目录项,数据对象blob则大致上对应了文件中的内容。 一个树对象可以包含一条或多条记录(tree对象和blob 对象),每条记录含有一个指向blob 对象或者子tree对象的SHA-1指针,以及相应的模式、类型、文件名信息。 如下图: 1100644 blob 83baae61804e65cc73a7201a7252750c76066a30 test.txt Tree对象存储方式如下图所示: 2、Tree对象说明2.1. (1)初始化一个新的本地版本库12➜ gitObject git:(master) git init gitObject && cd gitObjec (2)创建一个树对象(重点)1)新建一个文件,然后把文件提交到 ...


