本地仓库的使用
本地Git
在本地可以通过命令新建一个空的代码库:
1 | |
然后就可以开始对一个本地 Git 仓库进行管理。
配置
Git 自带一个 git config 的命令来设置并控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:
GIT/etc/gitconfig文件: 包含系统上每一个用户及他们仓库的通用配置。 如果在执行git config时带上--system选项,那么它就会读写该文件中的配置变量。 (由于它是系统配置文件,因此你需要管理员或超级用户权限来修改它。)这个是在GIT表示在安装目录。~/.gitconfig或~/.config/git/config文件:只针对当前用户。 你可以传递--global选项让Git读写此文件,这会对你系统上 所有 的仓库生效。- 当前使用仓库的
Git目录中的config文件(即.git/config):针对该仓库。 你可以传递--local选项让Git强制读写此文件 (默认情况下用的就是它。当然,你需要进入某个Git仓库中才能让该选项生效。)当然也可以直接编辑上述配置文件,但是不推荐。
一般都是个人电脑上使用,所以绝大多数时候采用的是针对当前用户(--global)的方式进行配置:
1 | |
除此之外,个人感觉使用比较多的命令有:
1 | |
基本流程操作(add、commit)
在初始化一个仓库之后,我们就可以创建文件并添加内容(此时的文件是Untracked状态),创建一个 helloworld.txt 文件,并添加内容,之后可以将其追踪并提交:
1 | |
上述 add 命令后加的是文件名,除此之外,可以是 目录、通配符 等等:
1 | |
对于 commit 命令,有一些比较常用的:
1 | |
撤销操作(reset)
对于已经暂存的文件,如果后悔add了,可以取消暂存:
1 | |
其实需要比较下三种重置区别:
git reset --soft: 保留 工作区 和 暂存区 的内容git reset --hard: 对于 工作区 和 暂存区 的内容都不保留git reset --mixed:保留 工作区 内容,但是不保留 暂存区 的内容
对比(diff)
为了随时查看此时文件的状态,可以通过一些命令进行对比
1 | |

一般,我们都是使用可视化工具去对比差异,否则太多了。
查看信息
提交历史中,每个提交记录都有对应的 commit hash 值,唯一标识了这次提交,这是 Git 用 SHA-1 hash 生成的加密字符串。可以通过命令查看:
1 | |
注:如果 git log 比较长或者窗口比较小,这会触发「导航」模式,
不传入任何参数的默认情况下,git log 会按时间先后顺序列出所有的提交,其中常用的参数有:
-p:按补丁格式显示每个提交引入的差异。--stat:显示每次提交的文件修改统计信息。--shortstat:只显示--stat中最后的行数修改添加移除统计。--name-only:仅在提交信息后显示已修改的文件清单。--name-status:显示新增、修改、删除的文件清单。--abbrev-commit:仅显示SHA-1校验和所有 40 个字符中的前几个字符。--relative-date:使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”)。--graph:在日志旁以ASCII图形显示分支与合并历史。--pretty:使用其他格式显示历史提交信息。可用的选项包括oneline、short、full、fuller和format--oneline:--pretty=oneline --abbrev-commit合用的简写。|
1 | |
分支(Branch)
对于分支的操作,推荐一个在线学习网站:Learn Git Branching
在初始化时,Git为我们自动创建了第一个分支master(或者main),以及指向master的一个指针HEAD。如下图,如果使用git创建的默认分支,并且提交了三次,到达版本V4,此时,有两个分支指针指向该版本的状态。

注意master分支与HEAD的区别:
HEAD是一个指向当前所在分支最新提交(commit)的指针。它代表了当前工作目录所在的分支的最新提交版本。当你进行一次新的提交时,HEAD会指向这个新提交,并将当前分支的指针更新为新提交。也就是说,**HEAD始终指向当前工作目录所在的分支的最新提交**。master(或者main)是一个默认创建的分支,通常用于主要的开发和代码稳定版本的管理。它是代码主线的一个表示。当你初始化一个新的Git仓库时,通常会默认创建一个名为master(或者main,根据不同的Git版本和设置而有所不同)的分支。
创建分支 & 切换分支
创建分支语句如下:
1 | |
注意: 创建完分支后,会将分支指向当前所在的节点。对于已有分支,可以通过命令查看并切换:
1 | |
由于git checkout 可以用于切换分支,也可以用于恢复文件(如果名字相同,默认是切换分支),为了避免冲突,在 git 2.23 版本之后,推荐使用 git switch 命令用于切换分支
合并分支(merge & rebase & cherry-pick)
对于版本迭代,如下,当主分支(master/main)开发到版本V2,发现功能需要继续完善,但是版本 V3以及后面的功能能继续交给其他人员开发,这时候就可以在V2后创建DEV分支,然后开始功能完善。(注意:以下图中真正使用的时候,版本应该是Hash值,而不是类似于v1这种)

一般在实际开发的时候根据功能将主分支中的每个版本的具体实现通过创建不同的分支交给不同的开发人员进行开发,比如:

当上述分发的功能代码开发完成后,需要 review 和测试,最后保证正确的情况下,需要通过合并分支的操作将开发代码进行合并操作。如:
git merge
使用语法:
1 | |
git merge命令还支持一些选项,用于控制合并的行为。其中一些常用的选项包括:
--no-ff:禁用fast-forward合并策略,强制Git创建一个新的合并提交。--squash:将合并结果压缩为一个提交,并且不会保留源分支的提交历史。-m <message>:指定新的合并提交的提交信息。
在当前 HEAD 分支执行语句 git merge DEV 表示当前分支合并DEV分支。如果不产生冲突,那么直接合并成为一个新的版本即可,如图:

注意:当使用 git merge 时候,当前分支与合并的分支如果有冲突,就会提示自动合并失败,需要自己去处理冲突(如果两个分支对同一个文件的同一个地方进行修改,产生了冲突conflict,需要手动解决冲突自己手动选择哪个分支的修改),然后进行提交:
- 使用
git diff或者git status查看哪些文件冲突 - 解决冲突文件
- 进行
git add和git commit进行提交。
一般这种冲突也是借助开发工具去diff然后选择哪个修改。
git rebase
rebase 合并往往又被称为 「变基」,就是改变当前分支的起点。注意,是当前分支! rebase 命令后面紧接着的就是 「基分支」。「变基」操作是会改变提交历史的,但是这种方式不会增加额外的提交记录,会形成线性的提交历史,比较干净和直观。使用语法:
1 | |
首先会找到 当前分支 和 基分支 的共同祖先节点,然后将当前分支上从共同祖先到最新提交记录的所有提交都移动到目标分支的最新提交后面。如下图,使用命令:
1 | |

如图,由于当前分支是DEV,所以HEAD分支指向DEV,而 「基分支」 则是 master,因此执行逻辑为:
- 找到
master分支和DEV分支的共同祖先节点V2 - 找到 当前分支
DEV到共同祖先节点V2的所有提交记录节点:V2.1、V2.2 - 将
V2.1、V2.2提交记录文件修改的内容提交到master分支之后。
其实,这里也需要考虑rebase之后的文件冲突问题。
git cherry-pick
git cherry-pick 的主要作用是将某个或者某些提交从一个分支复制到当前分支,使用语法是:
1 | |
其中,<commit-hash>可以是提交的hash值,也可以是分支指向的提交。注意,只是复制提交内容,会重新生成一个hash提交地址。(即提交的hash地址不一样)
当然git cherry-pick支持一次复制多个提交内容:
1 | |
除此之外,提交内容可以是连续的,如:
1 | |
注意:提交 A 必须早于提交 B
除此之外,需要注意合并冲突,如:
1 | |
删除分支
1 | |
分叉(Branch Diverged)
分叉主要是当某个 DEV 分支开发到一半,因为特殊情况,需要废弃掉整个 DEV 分支,那么整个 DEV 分支的提交记录就是 分叉。产生分叉的原因有很多。
git stash
当我们在一个分支上开发时候,需要切换到其他分支去测试,但是又不想提交当前的内容到本地仓库中,那么就可以使用git stash。 stash,直译为储藏,默认会将未提交的修改(Git追踪暂存和非暂存的)都保存起来。那么这时候就可以切换其他分支去操作了。
使用语法如下:
- 记录一个stash版本:
1
2
3
4git stash
# 保存的时候添加一个message方便记录版本
git stash save "message" - 重新使用:
1
2
3git stash pop # 弹出stash,会将最上面的stash删除
git stash apply # 只是使用stash,不会将存储的进项删除 - 查看现有的
stash:1
git stash list - 移除
stash:1
git stash drop stash@{0}
需要注意的是:
stash是本地的,不会通过git push命令上传到远程服务器上- 默认情况下,
git stash只会缓存Git暂存(staged)和Git追踪未暂存(unstaged)的内容。对于untracked内容和ignored内容则是不会缓存
当在 a 分支使用git stash 保存工作空间内容,然后切换到 b 分支,此时 git stash pop 状态会尝试将存储中的内容添加到 b 分支之上,如果有冲突则提示需要手动 merge 。