git学习

此博客主要用于记录git学习过程中的知识点,以后遗忘的时候可以快速查询。主要学习资料为git的参考api以及B站网课。

系统地学习git这个想法其实是不久之前才萌生的。从大二的时候开始接触到git,只会最简单的git clone,git push,git pull。也一直只会add,commit,push三连。因为那个时候基本只是自己需要从开源网站上获取代码供自己直接使用,以及提交作业,所以学了基本的功能也没有仔细研究深入。这一问题在本学期期末的课设中被无限的放大了。
这一学期我们小组的课设是一个WEB设计的题目,采用了前后端分离开发的方法,因此我们借用了git的workflow,希望借此来起到比较好的并行开发的效果。然而由于对工作流的不熟悉,期间出现了由于前后端进度不同导致的merge难度过大,对git本地版本控制的不了解以至于切换分支时导致的工作丢失等等问题。因此决定在课设结束后的假期中尽快将git系统地学习。
下面是git的学习笔记,由于之前已经对一些命令有所了解,因此此处命令学习可能不会太过细致,只是做标注记录。
1. git的三大区域

在这里插入图片描述
要想要系统的学习git,首先需要了解的是git的三大工作区域。git可以被分为工作区(working directory),暂存区(stage或者index),版本库(history)。本地的代码修改过的代码都会在工作区当中保存,通过命令行可以将修改后的文件上传到暂存区,上传完毕后可以通过命令将修改记录保存为一个版本并保存在版本库当中。版本库当中利用HEAD指针指向当前版本。
git的版本当中保存的是其父版本上对应的修改,因此版本之间事实上可以理解为树结构并且利用指针相连。保存在版本库当中的代码可以被拉取到本地以便于进行版本控制。

2. git命令

- git init
在本地项目中git init会生成.git文件夹,里面包含git用于版本控制的配置文件。如果是远程仓库的项目初始化的话,git init会创建一个readme.md,里面包含部分默认的项目介绍,之后git会自动将该文件提交到stage并且commit形成一个版本,并且利用git remote add将远程仓库地址的URL标记为origin。

- git add
git add简单来说是将修改过的文件提交到Stage当中,命令后面可以加path也可以利用通配符进行文件的提交,除此之外,还有部分常用参数:
-u:用于选中修改过的或者被删除的文件,不会选中untracked的文件;
-A:选中所有不同的文件,即-u加上untracked;
-i: 查看所有修改了但是还没有提交的文件。

- git rm
用于在版本控制中删除文件,删除时会将删除操作提交到STAGE上。

- git commit

简单来说用于生成一个版本。可以通过添加参数来实现额外功能。
-m: 添加版本描述信息;
-a: 无视Stage 提交所有在git版本控制管理下的文件,不建议使用
-amend: 用于在merge前追加提交,可以在不生成一个新的commit-id的情况下将新的修改提交到当前commit-id中,建议在当前版本追加时使用,若需要切换到历史版本追加过于复杂。

- git log
简单来说主要用于查看commit的历史版本,如果要查看所有版本(包括已经回退的版本)应使用git reflog。通过添加参数实现其他功能。
–online: 简化输出,只保留hash前7位以及commit message;
–stat: 额外输出文件删改数据;
-p(–show): 输出每一个commit的具体情况(show只显示一个,需要hash);
–pretty: 自定义输出信息(git log --graph --pretty=format:"%h %s");
–author: 检索筛选提交者;
-n(数值): 限定输出个数;
–after/–before: 限定时间;
–graph:可视化;

- git reset
主要用于回退版本,主要有三种参数:soft,hard,mixed。
–soft: 该参数会将HEAD指针指向目标版本,但是不会改变STAGE和工作区,包括原先删除或者新增的文件的记录都会保留在stage中。
–mixed: 相较–soft会清空STAGE,所有的文件都需要重新add。
–hard: 相较–mixed会将工作区的文件都改为对应版本的文件,原先的修改未提交的不会保留。

- git branch
用于查看分支或新建分支。-a可以查看所有分支(包括远程仓库)

- git checkout
用于检出文件,将文件修改成版本对应的默认文件,即回退单文件操作。而后面跟的参数为分支名时本质上就是将HEAD切换到对应分支之后将所有文件都检出为分支对应的原始版本。

- git merge
用于合并分支,若需要在A分支合并B分支,则需要先切换到A分支,再执行合并操作。而合并过程中,对同一个文件的相同位置进行修改会引起冲突(即git无法知道以指向的两个版本中的哪一个为准),这时git会在代码中用<<<<<<<<<HEAD这种方式标注两个版本的代码,用户自行决定如何保留代码之后将冲突标识删除,即人为解决冲突。
注意:往往在main-dev开发的过程当中,每次merge到主分支之后,都需要对相应的dev分支进行merge。

- git push
主要对git push -u origin main这一命令进行解释:
-u指的是设定默认值,此处设为origin main后之后若直接使用git push,则是默认向该远程分支push。
origin是之前提到的在git init时git会将远程仓库地址的URL别名为origin,可用于快速访问。
main表示的是分支。

- git pull
git pull事实上是两个命令的合并:fetch &merge。
git fetch指的是用于追踪远程仓库的版本,将本地的版本库更新为远程仓库的版本库;
git merge与之前原理相同。
git pull 则是直接将远程仓库的版本放到工作区。

- git rebase
变基操作,功能强大但是复杂,且与远程仓库使用的时候情况需要具体讨论。此处还在更新中ing

  • 合并频繁多次的提交为一次,使history简洁易懂

注意,此用法的rebase尽量用于未上传至远程仓库的版本,否则合并版本后从远程仓库下拉时merge极其复杂。
git rebase -i 版本号:将该版本号之后到当前版本之间的版本合并;
git rebase -i HEAD~n: 从当前版本号找最近的n个版本执行合并(选择s表示squash);选择s表示squash

  • 将分支合并为主分支的一部分

此处通过举例的方式说明。
现有主分支main,开发分支dev。目标为将开发完的dev分支变为主分支的一个版本。
(1)git checkout dev //切换分支到dev上
(2)git rebase main //将主分支在dev之后的版本全部放到dev之后
(3)git checkout main//切回main分支
(4)git merge dev//将dev分支合并回main

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值