Git 使用命令笔记

本篇笔记是对 Git 使用过程中,非常有实践操作意义但平时不会用到的一些命令总结,主要包括了以下几个方面的内容:

  • Git 打包,解决对指定 Branch、HEAD 等的文件打包
  • Clone 库之后多分支切换
  • 远程仓库管理,包括远程仓库 Branch 查看、远程仓库 Branch 删除
  • Tag 管理,主要包括添加标签和推送标签
  • 单 Commit 的 Merge 操作
  • 大文件无法上传的处理

    1. Git 打包

    Git 打包指用 git 命令进行打包文件方便分发、存档。作为版本管理工具,Git 有多个和版本管理相关的点,例如:主分支(master)、当前分支上的头指针(HEAD) 、标签等内容。因此在进行打包操作的过程中有多种方式可以选择,详细内容可以参考 Git 开发手册[^1]。

1.1 打包 master

使用命令:

1
git archive --format=zip --output master.zip master

上面的命令在最后指定了使用 master 分支,此外申明了使用 zip 进行存档(⚠️ git 的打包格式主要有 ziptar ,如果没有申明的情况下可以从输出结果中推荐文件类型,不能推断的情况下默认为 tar——官方文档说明是默认输出 tar 文件,但在 git version 2.17.2 (Apple Git-113) 环境下测试命令 git archive --output masr master 是没有保存为 tar 文件,而是一个文本文件)

1.2 打包 HEAD 文件

针对头指针打包,不仅仅可以直接进行对头指针的打包而且可以通过分支比较以及头指针比较,打包存在文件差异的内容。

1.2.1 直接打包 HEAD 文件

使用命令:

1
git archive --format=zip --output head.zip HEAD

基本操作和 master 类似,需要声明使用 HEAD

1.2.2 打包更新的 HEAD 文件

使用命令:

1
git archive --format=zip -o update.zip HEAD `git diff --name-only HEAD^`

需要在声明 HEAD 之后使用 git diff --name-only HEAD^ 命令,表示是比较 HEAD 的前一个 commit;如果是使用的 git diff --name-only HEAD~3 ,表示的是最后三个版本修改的文件——即使用 git diff 用于比较筛选出更新的文件

1.2.3 打包标签

使用命令:

1
git archive --format=zip --output filename.zip <tag>

命令使用上和 master 打包方式一样

2. 克隆仓库后分支切换

直接使用 git clone 命令克隆仓库,直接显示只有一个 master 分支,但是实际上 origin 分支上保留了其他分支(如果存在多分枝的情况)。因此需要使用命令或者其他工具(Visual Studio Code 提供了选择分支的按钮,可以直接进行选择操作)。

使用命令的操作流程:

  1. 显示所有分支信息,这样可以看到其他分支的

    1
    git branch -a
  2. 切换到其他分支,需要申明 origin

    1
    git checkout origin/other_branch
  3. 其他分支本地化,以实现 origin 上分支作为工作分支——这样才能实现在相应分支上进行本地操作

    1
    git checkout -b other_branch origin/other_branch

3. 标签管理

标签管理涉及到的内容还是非常丰富,具体内容可以查看官方文档[^2]。这里只是对标签添加和推送两个管理,进行简要总结。

3.1 添加标签

Tag 有两种形式一种是轻量标签附注标签,轻量标签的话直接使用 git tag <标签标识> 即可;如果是需要更复杂的信息,例如加上用户邮箱等附注信息,需要 gpg 加密(加密过程可以参考 GitHub 指导文档[^3],也可以参考 gpg加密操作 )。在加密完成之后,使用如下命令进行添加签名标签:

1
git tag -u <keyid> -s <tag_name> 

上面的选项 -s 没有指定参数,它的作用是申明制作一个 gpg 签名标签;-v 也没有指定参数,表示的是验证指定的标签;-u 指定了一个 keyid 参数,它是在创建 gpg 密钥的设置

如果是直接使用 git tag -a <tag_name> 是创建一个附注标签,但是是没有进行签名的。

3.2 签名标签验证

使用 gpg 签名的标签,可以使用 git tag -v <tag_name> 验证标签

3.3 推送标签

标签推送的命令和推送分支是一样的,直接使用命令 git push origin <tag name>。例如下面是一个得到的验证的结果:

4. 远程仓库管理

在本地对远程仓库的管理,除了将本地 commit 推送到远程仓库的操作,还会涉及到在本地查看远程仓库分支和删除远程仓库上的分支

4.1 查看远程分支

在进行详细管理之前,需要查看已有分支(包括远程分支),可以使用如下命令:

1
git branch -a

4.2 删除远程分支

本地分支和远程分支并没有绝对的关系,删除了远程分支之后如果需要使用相应的命令来删除本地分支,反之亦然。

1
2
3
4
5
# 删除本地分支,如果需要强制删除,可以使用 -D 来替换 -d
git branch -d <branch_name>

# 删除远程分支,需要使用 git push 进行操作
git push origin --delete <branch_name>

4.3 配置远程分支

主要解决的问题是已经启动当当本地项目需要推送远程仓库时,需要配置远程仓库信息。使用命令 git remote add <upstream> <repo_url> 进行配置, upstream 可以使用任何名称(例如常用 origin),repo_url 表示的是远程仓库 url。

5. 合并

这里合并主要是在遇到只需要合并单个 commit 或者单个文件的情况,而非合并分支

5.1 合并单个 commit

1
git cherry-pick <commit-hash>

切换到相应的分支之后,用上面的命令进行合并对应的 commit

5.2 合并指定文件

该场景主要是解决需要将某个分支上的 HEAD 文件覆盖另一个分支上对应的文件,而不需要完全修改所有的文件。该方式的好处的可以方便测试单个文件调整之后,是否可以良好运行;另一个好处就是可以方便回滚:

1
2
3
4
5
# 使用下面的命令可以将其他 branch 的 filename 直接覆盖到当前 branch 的 file
git checkout <other_branch> <filename>

# 如果测试失败之后,可以直接回滚,直接使用如下命令
git checkout HEAD <fielname>

参考

[^1]: git archive (Administration) - Git 中文开发手册
[^2]: Git - 打标签
[^3]: Managing commit signature verification - GitHub Docs

[^4]: Git - 签署工作

作者

ZenRay

发布于

2020-09-01

更新于

2021-06-10

许可协议

CC BY-NC-SA 4.0