git版本控制相关命令
git采用快照的方式记录修改。每一次的版本都只记录上一个版本的版本号,这样保证了版本的先前追溯的稳定性,同时为分支和分布存储提供了巧妙的设计基础。
git的分支其实也是版本控制。git的分支并不是重新写一份文件,而是完全使用先前的版本记录,使用分支的指针指向。这里会发现版本的控制其实已经完全实现了分支,分支只是给了你一个存储多条路线的机会,哪怕没有分支控制,也完全可以使用reflog查看全版本,reset控制版本跳跃、更新已经生成新的分支版本,最后使用add和commit重新合并。版本控制的命令完全是为了操作方便,所谓的分支控制,其实就是版本控制。只是分支控制提供了方便的指针,显式的用于操作,事实上在push时,非主线路的版本是不推送的。这其实完全是底层语言指针设计思想的具体使用。不得不说linus对于c语言的使用真厉害。
git的另一个强大的地方,分布式也需要版本控制的基础。分布式的设计其实也就是对于版本控制的更高一层的使用,毕竟你push的每一次更新都是新的版本,提交时比较的也就是版本的更新。不过分布式推送的时候是不提交那些隐式版本的,或者说是只推送一条现在所使用的主线路,除非你提交其他分支,要不连显示的分支版本也不提交。
git reset
版本切换命令,有三种操作方式,使用版本号、head加^以及head~加数字的方式。head本事表示当前版本,加数字的方式,数字就代表加了几个^,即该版本之前的第几个版本。后面两种方式也只能回退,而第一种可以根据版本号随意切换。后面介绍中,版本号的位置可以用三种方式实现,当然后两种仍然不能往前走,后面就不再重复写了。
在这里要区分好三个区的不同,他们就像三个链表分别对应不同的一套代码。三个区域的指针指向哪里,对应的区域就表示哪一个版本的信息。当然所能表示的信息必须都是存在commit库中的。
git reset --hard 版本名
将版本彻底回退到某一版本,版本名只需要输入前几位识别出不同即可。该命令会将working tree、index和commit三个区间的内容全部回退。
git reset --mixed 版本号
该命令为git reset默认值,回退index和commit的内容,代码不变,相当于有一个人在该版本时下载代码,并且做了修改,还没有加入index区间。
git reset --soft 版本名
该命令回退只回退commit的内容,类似于有一个人在该版本时下载代码,做了修改和添加,准备提交。
git reset file
表示只对某个文件设置,其实该命令的file可以加载之前所有版本的后面。签名的命令没有file表示默认当前的所有文件,而加上file表示只对该file文件操作。
git log
用于显示版本信息,如果一个屏幕装不下,空格下一页,b上一页,q退出,回车下一行。
git log
查看之前的版本,不包括现在版本之后的版本。
git log --pretty=oneline
以一个版本一行的方式显示。
git log --oneline
同样以一个版本一行的方式显示,但是版本号不全显示,只显示6位,6位基本就足够标识了。
git reflog
一个版本一行的方式显示,同git log --oneline,但是多了[email protected]{前面第几个版本,现在所在的为0。这里要记住,这里的数字不代表可以使用head~的方式使用,head方式使用的必须是在主线路上的,如果回退并直接修改了内容,现在的版本就被抛弃,只会出现在reflog中,而不再会出现在log中了。}。reflog与log不同的是reflog命令不仅仅显示之前的版本号,只要本地数据库有的版本号,不论现在处于那个版本都会显示出来。
git log --graph --all
图示版本路线。
git diff
git diff commit1 commit2 file
该命令用于比较两个版本的区别。比较时,如果不写,默认commit1为工作区,commit2默认为commit1的上一级(working tree->index->commit,只考虑先版本的,如果commit1为之前版本,commit2为工作区版本)。--cached代表index缓存区。commit仓库的版本号总是用head标识方式来代替。加file表示该文件,不加默认全部。
有关git的其他内容可以通过这里访问https://blog.****.net/astar3/article/details/80764843