4、git add和git commit

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4、git add和git commit相关的知识,希望对你有一定的参考价值。

参考技术A git中的文件对象,最终都是存储在.git/objects目录中,以二进制形式存储的。git既松散存储,也进行差异化存储。每次修改一个文件,会在.git/objects目录中,生成一个二进制对象,当再次修改时,又生成另一个二进制对象,这即是松散存储。但是当工作区的二进制对象数超过6700个时(数目可配置),git会进行一次打包行为,针对相同文件进行差异化存储来减少文件数。

git大概总共有100多个命令,命令不是很多,但是每个命令,都可以带很多参数,功能很强大。git命令总共分为两类:高级命令和底层命令。

git add和git commit都属于高级命令,高级命令是通过调用多个底层命令来完成操作,这一节希望大家能彻底搞明白git add和git commit.

举个例子,假如我们新建一个工程,并新建了一个test.go文件,在这个文件里边随便写一些内容,下面我们用底层命令来生成一个完整的git历史记录:

第一步:针对test.go文件生成二进制存储对象

git hash-object命令就是针对某一个文件生成它的二进制存储对象,并返回它的sha1签名码,假设返回的是"0d5a2b611190403ef08124286fe64608456101cd"

第二步:更新索引文件

这一步是将我们上一步生成的对象以及它的路径添加到索引中。用到了我们上一节讲过的updae-index命令。

以上两步命令和git add test.go命令完全等价。

第三步:生成目录树对象

调用write-tree命令之后,git会针对当前索引区的目录结构,生成一个tree对象,并返回这个tree对象的sha1签名码,假设返回:d8329f

第四步:生成commit对象

echo后边单引号里边的内容就是我们的提交message了。第三步和第四步就是完成了一次git commit命令的操作。

大家可以试着操作一下以上四部命令,并观察一下.git/objects目录和工作区git状态的变化。

回滚代码

工作中我们时常会遇到回滚代码的需求

分两种情况,push上去了,和没有push(只是commit/add了)

如果没有push上去,命令是 git reset,如果push上去了使用git revert

git reset 的功能是回退本地的代码,并不会改变线上的代码,git reset 有3个参数可用

1.git reset --mixed +版本号    暂存区(add区)和提交区(commit区)会回退到某个版本,本地的代码不会改变。

2.git reset --soft +版本号      提交区(commit区)会回退到某个版本,暂存区(add区)不会回退,本地代码不变。

3.git reser --hard +版本号     暂存区(add区)和提交区(commit区)会回退到某个版本,本地的代码会改变。

git revert 的功能是回退线上代码

git revert +版本号 -》输入commit的message,生成一个新的commit,-》push 覆盖线上的版本

这样就完成了线上版本的回退

git revert 的快捷命令

git revert HEADE  回退到上一次提交的版本

git revert HEADE^ 回退到上上次提交的版本

下面介绍用命令行回滚和用sourceTree回滚代码

我在工作中使用sourceTree工具,如果想把本地代码重置到某一次提交,可以在想回到的版本的位置右键,选择右键菜单中的‘将xxx重置到这次提交’,

 技术分享图片

 

 

在提示框中点击确定,此时本地仓库中的代码回退到了选中的版本中,也就相当于commit之前,然后在‘文件状态中’出现了你的本地代码和本地仓库中的代码不同的部分,也就相当于你现在在本地代码中修改的部分。

技术分享图片

 

分支旁边也会出现箭头

技术分享图片

 

向下的箭头表示你本地的代码和线上仓库中的代码有7处差别

此时如果想放弃本地代码的更改,使用线上仓库的代码版本,可以选中文件,右键,在右键菜单中选择‘重置’

技术分享图片

在弹出的确认框中点击确定,此时就放弃了你本地代码的更改,现在‘拉取’线上代码

 技术分享图片

就会同步线上仓库的代码到本地,此时本地仓库的代码和线上仓库就版本一致了。

命令行的回滚 git reset --hard 465dd43

技术分享图片

 

在分支旁边显示和线上版本的差距,此时‘拉取’,就会同步本地的代码为线上代码的版本。

技术分享图片

以上这些都是适用于coomit之后,push之前,想回退commit的内容的场景,线上仓库的代码版本是没有回退的,回退的只是本地仓库的版本

如果想回滚线上仓库的版本怎么办呢?

先说命令行的方式 git revert +版本号 意思是回退xxx版本提交的修改,也只会回退xxx版本提交的修改,如果最新版本和xxx版本之间还间隔着其他版本的修改,其他版本的修改是不会回退的。

如果回退的时候出现冲突,如下图,需要手动解决冲突,再commit

技术分享图片

之后执行git push ,完成线上版本的回退

再来看sourceTree,在想要回滚的版本位置右键-选择提交回滚,如果有冲突需要手动解决,然后push,完成线上版本的回退

 技术分享图片

有点啰嗦地整理完了,希望对日后地工作有帮助

以上是关于4、git add和git commit的主要内容,如果未能解决你的问题,请参考以下文章

git checkout .和git checkout -f的区别;git add . git add -u git add -A的区别

git checkout .和git checkout -f的区别;git add . git add -u git add -A的区别

git add .、git add -A 和 git add -u 之间的区别 [重复]

git 命令 git status add rm commit mv

git add -A /git add -u/git add .的用法

分布式版本控制系统Git-----4.Git 常用命令整理