Git的使用
Posted 四季帆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git的使用相关的知识,希望对你有一定的参考价值。
1. Git经典流程图
工作区: 用户的工作目录,平时写代码,写文档的目录;
暂存区: 临时存储的一个区域,为了更方便撤销工作而建立;
本地仓库:存放自己每次提交的历史版本的位置(自己建的仓库);
远程仓库:这个叫法是为了和本地仓库做区分。远程仓库主要是为了集中管理一些主要的版本,以及为了方便其它开发者获取和更新这个远程仓库(项目负责人建的仓库)。
流程描述如下:
第一步:项目负责人在本地创建一个本地仓库A,在远程服务器上创建一个远程仓库A,此时两个仓库都是空的;
第二步:项目负责人在本地仓库搭建好框架之后(执行git init,添加框架代码),将本地仓库A推送到远程仓库A(git push操作);
第三步:项目组员通过git clone操作,把远程仓库A的项目代码clone到自己的本地仓库;
第四步:项目组员在自己的本地仓库中进行项目开发和迭代,测试OK后push到远程仓库(被项目负责人邀请并加入到该项目团队的组员才有权限push);
第五步:项目负责人从远程仓库进行git pull操作,拉取远程库A的内容,对项目组成员的完成情况进行检查。
2. Git常用命令
git init 初始化本地仓库
git status 查看工作区、暂存区状态
git add 文件名 将工作区的新建或修改添加到暂存区
git rm --cache 文件名 删除暂存区里的文件
git commit -m "描述更改记录的字符串" 文件名 将暂存区的内容提交到本地仓库(注:-m参数表示不进入vim模式)
3. Git高阶操作
3.1 查看版本更新日志(第三和第四个命令更常用)
git log 显示的日志信息最全(一次提交日志显示几行)
git log --pretty=online 每行显示一次提交日志
git log --online 效果和第二个命令差不多,使用该命令查看,第一行的版本始终是HEAD指针指向的版本,也就是工作区的版本
git reflog HEAD@{x}中的x表示的是从当前版本想要回退到某个版本HEAD指针要移动的次数
3.2 版本回滚(三种方式)
3.2.1 第一种基于索引值(哈希值)的回滚
git reflog 查看所有版本的哈希值的前几位
git reset --hard 查看当前HEAD指向的版本
git reset --hard xxxxxxx 回退到哈希值为xxxxxxx开头的版本
经过几次回滚之后,使用git reflog查看日志会发现有重复的哈希值版本显示,这个时候使用git log --online命令显示更简洁;但是如果想回退到当前版本之前的某个版本,还是得使用git reflog,因为其它的日志查看命令只显示当前版本以后的版本。
3.2.2 第二种基于^符号的回滚
git reset --hard HEAD^ 有几个^符号就表示往后回退几个版本
3.2.3 第三种基于~符号的回滚
git reset --hard HEAD~3 符号~后的数字表示需要回退几个版本
总结:第一种方式的回滚往前、往后均可,第二种和第三种方式只能往后回滚,当需要往后回滚的版本很多是,第三种比第二种方式更佳。这里的往后回滚的意思是:在当前HEAD指向的版本之前添加的版本。
3.2.4 版本回滚命令的参数对比
查看git中关于reset的帮助文档
sijifan$ git help reset
//git reset命令的三个参数对比:
soft参数,这个参数不会触碰工作区域和暂存区域的东西。只会移动本地库里面的HEAD指针。
mixed参数,这个参数可以在本地库移动HEAD指针,也可以重置暂存区域。但不会重置工作区域。
hard参数,这个参数既会移动本地库的HARD指针,也会重置暂存区域和工作区域
注意:hard这个参数在一定情况下会有一定的危险。比如在工作区内容没提交到本地仓库之前,使用了hard参数把本地库的内容重置到工作区,会导致工作区更改的内容丢失。
3.3 git命令参数的特点
git命令参数分为长参数和短参数,短参数前面是一个-,长参数前面是两个--。例如
git commit -m "commmint message log" [pathname]
git commit --message "commmint message log" [pathname]
4. 示例操作
4.1 文件的恢复
4.1.1 从本地仓库恢复文件到暂存区和工作区
描述:文件test.txt被提交到了本地仓库,然后删除了工作区的文件test.txt,然后提交没有test.txt这个文件的工作目录到本地仓库
sijifan$ touch test.txt
sijifan$ git add test.txt
sijifan$ git commit -m "add test.txt file" test.txt //此时工作区、暂存区、本地仓库中都有test.txt文本文件
sijifan$ rm test.txt
sijifan$ git add --all test.txt git commit -m "delete test.txt file" test.txt //此时工作区和暂存区无test.txt文件,本地仓库中"add test.txt file"版本中有test.txt文件,"delete test.txt file"版本中是没有test.txt文件的
//接下来从本地仓库恢复test.txt文件到暂存区和工作区
sijifan$ git log --online
sijifan$ git reset --hard xxxxxxx
sijifan$ ls //此时工作区目录下就有tes.txt文件了
附:git add 参数对比
git add 默认不加参数 它会监控工作区的状态,将工作区的所有变化提交到暂存区,包括文件内容修改和新文件,但是不包括被删除的文件
git add -u(或者--update) 它仅监控已被add的文件(即tracked file),它会将被修改(文件内容修改和文件删除)的文件提交到暂存区,但是不会提交新文件
git add -A(或者--all) 前两者的合集,会把修改的文件和新建的文件添加到暂存区,把工作区已经删除了的文件从暂存区删掉
4.1.2 从暂存区恢复文件到工作区
描述:文件temp.txt文件被添加到了暂存区,但是没有提交到本地仓库,如何从暂存区恢复文件到工作区
git status 提示使用git reset HEAD temp.txt或者git checkout -- temp.txt
git reset HEAD temp.txt 如果不想要temp.txt这个文件了,就使用这个命令,撤销暂存区的修改
git checkout -- temp.txt 如果想要temp.txt这个文件,就使用这个命令,把temp.txt工作区的修改(删除也算一种修改)全部撤销
注意:git checkout -- temp.txt命令中的--很重要,如果没有--就是切换分支的操作了。
Git对版本的管理遵循一个原则,本地仓库中只增加,不删除。
==》所以当工作区中的test.txt文件被删除后再添加到本地仓库,只是当前提交的这个版本中没有了test.txt文件,删除版本之前提交的版本中的test.txt文件依旧存在。
4.2 文件对比
4.2.1 操作命令
git中文件的比较操作是用Linux中的diff命令来完成的。
git diff test.txt 比较工作区和暂存区的test.txt文件
git diff HEAD test.txt 比较工作区和本地仓库的test.txt文件
git diff HEAD^ test.txt 比较工作区和HEAD指针指向的版本的前一个版本比较
4.2.2 diff格式解读
diff命令是以一行为单位进行文件的管理和比较的,所以即使只是在某一行后面添加了一些内容,也是按删除一行,增加一行的方式处理。
@@ -1,6 +1,8 @@ //@@中间的-1,6表示下面显示内容是从老文件的第一行开始,总共显示了6行;@@中间的+1,8表示下面显示内容是从新文件的第一行开始,总共显示了8行
+2222 //带 + 号的部分表示增加的内容
······
-3333 //带 - 号的部分表示删除的内容
66666 //其余部分表示新旧文件公有的部分
5. 分支
在git的版本库初始化好之后,默认会有一个分支,叫master分支,利用以下命令查看分支:
sijifan$ git branch
5.1 分支操作的示例
假如一个项目有3个功能分别为A、B、C,则创建三个分支brach_A、brach_B、brach_C,三个技术团队分别在三个分支上开发,比如功能B已完成开发,功能A和C还没完成开发,先将分支branch_B合并到主分支(master)上,则实现了功能B的上线(主版本大升级),分支B和C不受影响,继续开发;开发到后期的时候功能C添加了很多新的需求,但是原有的架构无法满足新需求了,此时可以新建一个分支开发添加了新需求的功能C,分支branch_C可以删掉,也可以保留(但是不会合并到主分支了)。
5.2 分支的好处
并行的推进多个功能开发,提高开发效率;
如果开发的某个分支开发失败,不会对其它分支有任何影响。
5.3 分支的简单操作
git status 查看当前所在分支
git branch -a 查看这个项目所有的分支,分支名前面的* 代表当前所在分支
git branch 分支名 创建分支
git checkout 分支名 切换分支
git merge 要合并的分支名 比如在master分支下执行git merge branch_B,表示将分支B中的内容合并到主分支
注意:使用merge合并命令,要求我们切换到接收修改的分支上,由接收修改的分支来执行merge合并命令
5.4 解决分支合并后产生的冲突
产生冲突的原因,两个分支中都有hello.c文件,分支1中在hello.c文件的第三行添加了一行注释,分支2中在hello.c文件的第五行添加了一行注释,两个分支的hello.c都提交到了本地仓库,合并的分支1和分支2,出现冲突。
//合并失败的文件如下:
apple
<<<<<<< HEAD
冲突1
=======
冲突2
>>>>>>> master
banana
//修改的方法如下:
首先,必须删除提示信息(“<<<<<<< HEAD”、“=======”、“>>>>>>> master”这三行) ;
然后,修改冲突1和冲突2(只保留冲突1、只保留冲突2、都保留、都不保留),四种皆可;
最后,再次提交(执行git add 和git commit -m "xxx"),注意这里的commit后面没有文件文件名hello.c。
6. 拉取操作:git pull(git fetch + git merge)
git fetch [远程库名] [远程库分支] 拉取远程库内容到本地仓库
git merge [远程库名/远程库分支] 本地合并远程库的内容
git pull <远程库名> <远程分支名>:<本地分支名> 取回远程库某个分支的更新,再与本地的指定分支合并
//当修改比较简单,确定不会产生合并冲突的时候使用git pull命令;
//当远程库的修改可能和本地仓库产生冲突的时候,可以先把远程库的内容放到本地,经过对比之后再合并(解决合并冲突),使用fetch+merge命令组合
以上是关于Git的使用的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段15——git命令操作一个完整流程
VSCode自定义代码片段15——git命令操作一个完整流程
GitGit 分支管理 ( 克隆远程分支 | 克隆 master 分支 git clone | 查看远程分支 git branch -a | 克隆远程分支 git checkout -b )(代码片段
GitGit 分支管理 ( 克隆远程分支 | 克隆 master 分支 git clone | 查看远程分支 git branch -a | 克隆远程分支 git checkout -b )(代码片段