Git代码状态转换图
其中:未被Git跟踪的状态为unstage状态
已经被Git跟踪的状态为stage状态,因此包括staging状态和staged状态
一基本应用
1.安装
git的安装除了git core这个东西以外,我们还需要安装git gui和gitk,这些东西后面会方便我们的工作。
ubuntu下:直接采用新立德安装git。如果使用apt-get,可能会遗漏一些库文件,这里推荐大家将git的一些GUI的工具也安装一下,这样可以更直观的了解我们的版本发展情况。
windows下:也有相应的安装文件,le/p/msysgit/downloads/list在这个目录下可以下载到,一般推荐安装这个list里面的第一。
git有一些全局的设置和变量,我们可以通过git config -l去查看这些参数,git在提交修改的时候会记录提交者的姓名和email,这样便于代码的整体管理,安装后我们需要设置一下,我们的一些相关参数,具体设置的命令可以用git config --global user.name "XXXX"去设置全局的作者名和git config --ail "XXX"去设置全局的email地址。设置后,我们在查看每次的修改时,都会显示出这次修改掉作者是谁以及他的mail地址。
后面的命令使用,我们都是基于home目录下的~/gittest进行的,这个目录下面主要有三个文件:1.txt,2.txt,.gitignore这三个文件组成。想了解具体git命令的使用和说明,我们可以使用git XXX --help命令去显示相应命令的说明文档。
2.建立代码库
使用命令:git init
在当前目录中运行以完成初始化,随后可以使用git status去查看当前代码库的状态。这个时候,我们可以看到,我们在自己工程中的,1.txt和.gitignore这二个文件,提示我们他们是untrack的。 2.txt,文件由于我们在.gitignore中添加了它,所以这个文件将会被git ignore掉,这样方便我们的工作,因为我们在工作中,可能会有很多的*.tmp文件已经*.obj这些零时的,我们不关心的文件,所以我们通过.gitignore这个文件去简化我们需要关注的文件.gitignore这个文件里面的文件只要写相对路径就可以,每一行代表一个需要忽视的文件,文件类型或者是目录。
3.管理改动
a.查看当前状态
使用命令:git status
这个命令可以查看当前的状态:
untrack files是指尚未被git所管理的文件;changed but not updated是指文件被git管理,并且发生了改变,但改动还没被git管理;这两种状态,都可以看成是改动还没被git管理的状态,我们这里称非stage状态。
changes to be commited是指进入stage状态的文件,stage是commit和未管理之间的一个状态,也有别名叫index状态,也就是git已经管理了这些改动,但是还没完成提交。
.gitignore中的文件,不会出现在以上三个状态中。
b.向stage添加文件
使用命令:git add
git add [path]会把对应目录或文件,添加到stage状态
git add . 会把当前所有的untrack files和changed but not updated添加到stage状态
c.从stage移除文件
使用命令:git reset
这个命令与add相反,但它还有其他功能,后文介绍。
git reset [path]会改变path指定的文件或目录的stage状态,到非stage状
git reset 会将所有stage的文件状态,都改变成非stage状
d.删除文件
使用命令:git rm [path]
这个命令用来删除文件,可以用git status查看git rm与普通rm的差别。git rm后的文件,都在stage状态。
e.查看差异
使用命令:git diff
git diff 可以查看当前不在stage状态的改动,加参数--cached可以查看stage状态的差异,还可以指定文件名;如git diff -- 可以查看stage状态的1.txt的差异
注意stage状态的diff(即--cached)是stage与HEAD的差异,非stage状态的diff是与stage状态的差异。一个文件可以存在非stage和stage两个状态,可以通过git add和git reset合并。合并的结果都是非stage的状态,因为这个是在stage基础上修改的。
f.回退改动
使用命令:git checkout [path]
git checkout 有很多用处,这里用到的是checkout文件,一些版本管理软件提供有revert命令,可以revert某个文件上的改动。其实这个通过checkout这个文件的最新版本就可以完成。如果做的一些修改不需要了,用git checkout [path]就能把这个文件还原,同时也能从stage和非stage状态中去掉这个文件,就如同没有修改过一样。
g.暂存改动
使用命令:git stash
git stash可以把当前的改动(stage和unstage,但不包括untrack的文件)暂存。然后通
过git stash list查看。并通过git stash apply重新取出来。但apply之前要保证worktree是干净的。
4.提交改动
使用命令:git commit
有了前面对stage状态的管理,提交简单了很多。这个命令会提交stage状态的文件。也有参数可以直接提交所有文件或者所有修改过的文件,不过一般建议都经过stage->commit的流程。
使用这个命令后,git会自动调用系统默认的文本编译器,去编辑commit的内容。这里,我的电脑默认的文本编辑器是vim。
或者使用git commit -m "XXXX"直接为这次修改提交注释。推荐使用。
需要强调的是,这里的提交,都是基于本地完成。这点跟以前中央式的版本管理软件有很大差别。而远程提交,会在多人协作里提到。
git commit -amend可以对最后一次提交做些修改,主要是改注释,也能改改已提交的东西。更强大一点的方法下面会介绍。
5.已提交改动管理
a.查看历史记录
使用命令:git log
使用这个命令,我们可以看到所有当前分支的commit。
使用这个命令后,出现的commit XXXXXXX,后面这个编码是每个commit的唯一编码,我们需要查看某一个commit,只要打出这个commit的前四位就可以了。
查看历史记录也可以使用gitk,更为方便。
b.查看版本差异
使用命令:git diff
git diff可以用来查看版本之间的差异,命令格式为git diff [version1]..[version2],如git diff HEAD^..HEAD~2
c.回退已提交改动
使用命令:git reset
git reset的另一作用是回退改动,记法是git reset [version],一般用HEAD表示最新的change log。那么,回退1个change的写法就是git reset HEAD^,2个为HEAD^^,3个为HEAD~3,以此类推。
git reset 有几个选项:
(1)如果什么都不加,比如git reset HEAD^,会把改动回退到unstage状态,改动不会丢失。
(2)如果加--soft,改动会回退到stage状态。 git常用指令
(3)如果加--hard,改动会直接丢失。 使用时千万小心!!
d.有记录的回退
使用命令:git revert
git revert的回退方式与reset不一样,它会提交与回退改动相反的改动,来与之抵消。也就是和reset起到同样效果的同时,还留下痕迹。但一般只能用来处理最新一个change的回退。
一般调用方式为git revert HEAD。
6.patch的使用
a.制作patch
使用命令:git diff
前面提到的git diff的输出,其实就是标准的patch形式,使用git diff [param] > xxx.patch即可生成对应的patch。这种方式比较灵活,未提交的改动,提交的改动,分支差别等。都可以用这个方法生成出来。
使用命令:git format-patch
这是更为标准的制作patch方式,一般常用的格式为git format-patch [version],然后会从version开始直到最新的(不包括version),每一commit一个patch的众多patches,以0001开始命名,0001是最早的一个patch。也可以用git format-patch -n,n是最新的n个patch,效果与前面一样。另外还可以git format-patch [old_version]..[new_version]生成选择区间的patch。
b.应用patch
使用命令:git apply [path]
path指向patch的路径。patch如果遇到问题,可以手工合有问题的文件或代码块。剩余的再apply。
7.标签
tag是很有用的一项功能,简单来说,tag就是某个change的一个别名。要发布版本,标
记里程碑等,都用tag来做。另外比如像android这样的项目,有多个git库,用同样的tag来统一标记每个库上的某个版本,也为版本的checkout带来了很大的方便。
基本命令:git tag
git tag [tag_name] [version],在对应版本上(一般用change的SHA1),创建tag
git tag -l 列出当前tag
git tag -d [tag_name] 删除tag
有了tag以后,可以使用git checkout [tag_name] -b [branch_name]来检出对应tag时刻的代码。也可以用tag name来实现diff等功能。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论