一个很有用的 git 命令

先说一下场景

今天提供更新包给浦发,UAT 环境启动异常,原因是我把一些正在开发的内容也打包了进去。解决的方式当然很简单,只要把我正在开发的内容剔除掉就可以了。

但是,实际情况是我正在开发的内容,不仅新增了文件,还在原有的文件上做了一些修改。完全地剔除,就只能把这些被修改的文件回退或者暂存,可是这样很麻烦(个人觉得)。

不是很好的解决方式

因为每次提交更新包都会有记录,并且这次修改的内容很少(只有一个文件),所以我直接把上一次的更新包解压,然后把本次更新过的文件再放进去覆盖。

理想的解决方式

虽然上面的方式是解决了问题,但是总感觉很不优雅,且很容易出错。巧合的事情来了,正好看到某个著名博主的post中提到的git worktree命令,完美地匹配我所遇到的这个场景。

摘录一下 AI 给出的解释和说明

1
2
3
4
5
6
7
8
9
10
11
git worktree 是一个强大的 Git 命令,它允许您在同一个仓库中管理多个工作树。这意味着您可以同时在同一个项目的不同分支上工作,而无需切换分支或克隆多个仓库。
使用场景示例:
1. 同时处理多个任务:
假设您正在主分支上工作,突然需要修复一个紧急 bug。您可以创建一个新的工作树来处理这个 bug,而不影响主分支的工作
2. 并行开发特性:
如果您需要同时开发两个不相关的特性,可以为每个特性创建一个工作树
3. 在不同的 Git 钩子环境中测试:
您可以在不同的工作树中设置不同的 Git 钩子,用于测试或开发目的
4. 在主分支上保持一个干净的工作树:
保持一个始终处于最新状态的主分支工作树,同时在其他工作树中进行开发和实验。
使用 git worktree 的主要优势是它允许您在不切换分支的情况下同时在多个分支上工作,提高了工作效率,特别是在需要频繁切换上下文的情况下。它还可以帮助您保持一个干净的主工作目录,同时在其他目录中进行实验或开发。

然后我试用了一下git worktree命令:

git worktree add -b develop-temp ../ibot-spdb-dev-temp

它的作用是基于develop分支创建一个新的本地分支develop-temp并检出到指定目录,然后就可以在新的目录下愉快地修 bug、打包、更新,而不会影响正在开发的分支。当然,在修复了 bug 后也应该要记得在原有分支上保持同步。最后,确认一切都完成了之后,可以删除掉新建的分支以及新建的目录。

下面是完整的git worktree命令示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 新增工作树
git worktree add -b develop-temp ../ibot-spdb-dev-temp develop
# 创建一个新的分支 develop-temp
# 基于现有的 develop 分支创建这个新分支
# 在 ../ibot-spdb-dev-temp 路径创建新的工作树
# 在新的工作树中检出 develop-temp 分支

# 删除工作树
git worktree remove ../ibot-spdb-dev-temp/

# 删除本地分支
git branch -d develop-temp

# 验证工作树
git worktree list

# 验证分支情况
git branch -a

其他收获

在用了上述的命令后,我想验证一下新建目录和原有目录的文件差异。本来想使用一些命令行工具或者 app 的,但是用了一下 IDEA 后,发现它自带的 diff 工具已经很好用了,截图展示一下