Git原理
本文最后更新于:2022年7月21日 下午
Git原理
[TOC]
仓库 (repository)
仓库是git中最大的单位,就是一份代码/项目所在的地方,在实际中,就是一个目录(category)。
仓库可以通过git init
命令来创建,创建之后,会出现一个.git
的隐藏目录,里面保存着Git所需要的文件。
仓库里的文件一开始是空的,即使实际中的目录有文件,我们需要手动将文件添加进仓库(的暂存区),使用git add <file>
,可以一次添加多个文件,也可以使用通配符。
1 |
|
添加文件之后,就可以使用git commit
命令进行提交,commit就是把暂存区(Stage)的改动一次性提交给仓库(实际上是分支branch),在提交的时候,可以附带一些信息(这点是强烈推荐)
1 |
|
commit的消息也可以选择性地遵守一定的规则
feat: 新功能
change:需求变更
fix:缺陷修复
test:修改测试代码
docs:文档变更
style:代码格式调整
refactor:代码重构
查看本地文件改动
1 |
|
版本回退
Git最重要的特点就是能够版本回退,回退的单位是commit。要回退到某个commit,需要先知道对应的commit id
,这个id是用SHA1算出来的随机字符串。
回退的时候使用的是git reset
命令
1 |
|
要找到想要的commit id,可以用git log
来看过去,假如已经在“过去”,可以用git reflog
来看未来。要从乱七八糟的log中找到你要的commit,那就得看你的commit message有没有好好写了。
文件撤销修改(discard changes/rollback)
假如你不是想回退整个版本,而是改动一个文件后不想要改动了,那就可以使用git checkout
命令。
1 |
|
假如想把一个已经放进暂存区的文件撤回到和仓库一样的状态,可以使用之前提到的git reset
命令
1 |
|
假如要从仓库中删除一个文件,那么应该使用git rm
命令,假如是误删除了一个文件,也可以使用和上面一样的git checkout
命令来恢复。
添加远程库、推送
查看、删除、添加远程库
1 |
|
之后把本地库内容推送到远程库上可以使用git push
命令
1 |
|
假如是想从远程库中下载一份到本地,使用git clone
命令,链接在Github的repo主页都会写。
1 |
|
分支管理
每次commit,都会有一条时间线,这个时间线就是分支(branch)。默认的分支叫做master或者main,HEAD
指向当前分支,下面是分支创建切换的基本操作:
1 |
|
有多个分支时,可以合并分支:
1 |
|
对于分支管理,建议master分支用来发布版本,然后新建一个dev分支,所有人的改动都在dev分支上进行,有大版本更新时再合并到master。
拉取
git的拉取可以分为fetch
、pull
两种,fetch
将远程主机的最新内容拉取到本地,需要检查再判断是否合并到本机,而pull
则是拉取下来直接合并,但是可能产生冲突。
1 |
|
如图经常有这种冲突的情况,本地dev分支进行了改动,远程master分支也进行了改动。
此时可以采取解决方案1:把merge到master分支
但是这样不太好看,于是可以采取解决方法2:rebase再push
假如有冲突的话,可以在pycharm里面的Update Project打开代码解决冲突的三视窗口,在这里可解决代码冲突。这个不是git的命令,是pycharm的。
藏匿stash
假如你在某个分支上工作到一半时,想切换到master分支去临时修复一个bug,可以通过git stash
命令保存当前尚未commit的任务。
假如你没有stash就切换分支,会发现当前状态还是在dev改动后的状态
1 |
|
pick一个commit
假如想复制别的分支的某个commit到当前分支,可以使用git cherry-pick
命令,相当于在这个分支做了一次commit。
1 |
|
标签 Tag
使用git tag
命令可以为当前commit打上一个标签,差不多就是给commit起个别名。
1 |
|
但是push的时候假如要加标签,需要一个额外的参数--tags
1 |
|
子模块 Submodule
Git - git-submodule Documentation (git-scm.com)
Git中submodule的使用 - 知乎 (zhihu.com)
子模块就是一个嵌入在一个仓库里的另一个仓库,子模块拥有自己的History,可以单独管理。
创建子模块使用如下命令,创建后会出现一个.gitmodules文件和子仓库的目录,此时一般单独commit一次表示加入了子模块。
1 |
|
创建子模块之后,别人clone并不会拉取到子模块代码,可以使用如下命令
1 |
|
假如在本库中修改了子模块:
需要进入子模块文件夹,在子模块单独使用各类git命令。之后再本库中使用git add
把子模块的变化提交上去。(可以先git status
查看要提交什么,并不是提交整个库)
假如子模块远端有版本变化:
需要进入子模块文件夹git pull
,或者使用git submodule foreach 'git pull origin master'
一键更新所有子模块。
假如要删除子模块:
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!