Git 版本控制和 CI/CD 流水线的常用技巧和最佳实践。

Pull vs Fetch

git pullgit fetch 的区别:

1
git pull = git fetch + merge to local
命令 作用
git fetch 只下载远程更新到本地仓库,不合并
git pull 下载远程更新并自动合并到当前分支

建议:先 fetch 查看变更,再决定是否 mergerebase

参考: Ruby China - git pull 和 git fetch 有什么区别


Rebase vs Merge

Merge(合并)

  • 创建新的合并提交
  • 保留非线性历史
  • 保持完整的分支记录
  • 适合公共分支间合并

Rebase(变基)

  • 重写提交历史
  • 创建线性历史
  • 看起来像顺序开发
  • 适合特性分支更新

使用原则

原则 说明
公共分支用 merge 不要在公共分支(main/develop)上 rebase
特性分支用 rebase 更新特性分支或准备合并到主分支
团队统一规范 确保团队理解并遵守相同的工作流程
操作前备份 rebase 前创建备份分支或推送到远程

切换默认分支(main → master)

1. 创建并推送 master 分支

1
2
3
4
5
# 从 main 创建 master
git branch master main

# 推送到远程
git push origin master

2. 在远程仓库更改默认分支

  • GitHub: Settings → Branches → Default branch → 选择 master
  • GitLab: Settings → Repository → Default Branch → 选择 master
  • Bitbucket: Repository settings → Branches → Main branch → 选择 master

3. 删除旧的 main 分支(可选)

1
2
3
4
5
6
7
8
# 切换到 master
git checkout master

# 删除本地 main
git branch -d main

# 删除远程 main
git push origin --delete main

注意:更改默认分支会影响其他开发者和 CI/CD,需提前通知团队。


分支同步(develop → master)

方法一:Reset(重置,丢弃所有修改)

1
2
3
4
5
6
7
# 拉取最新 master
git checkout master
git pull origin master

# 重置 develop 到 master
git checkout develop
git reset --hard origin/master

警告:会丢弃 develop 上所有不在 master 的提交。

方法二:Merge(合并,保留历史)

1
2
git checkout develop
git merge master

保留 develop 的提交历史,将 master 的更改合并进来。

方法三:Rebase(变基,线性历史)

1
2
git checkout develop
git rebase master

将 develop 的更改重新应用到 master 之上,可能产生冲突。

方法四:重建分支(彻底同步)

1
2
3
4
git checkout master
git branch -D develop # 删除旧 develop
git checkout -b develop # 基于 master 创建新 develop
git push -f origin develop # 强制推送

警告:强制推送会重写远程历史,需与团队沟通。

安全建议

操作前创建备份:

1
2
git checkout develop
git branch backup_develop # 创建备份分支

出现问题时可用备份恢复。


GitLab CI/CD 并行执行

并行执行原理

GitLab CI/CD 中,同一个 stage 的多个 job 默认会并行执行(前提是有足够的 Runner)。

方法一:同一 Stage 多个 Job

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
stages:
- build
- test

job1:
stage: build
script:
- echo "This is job1"

job2:
stage: build
script:
- echo "This is job2"

test1:
stage: test
script:
- echo "This is test1"

test2:
stage: test
script:
- echo "This is test2"
  • job1job2build 阶段并行执行
  • test1test2test 阶段并行执行

方法二:使用 parallel 关键字

将单个作业分成多个并行实例:

1
2
3
4
5
test:
stage: test
script:
- echo "This is a parallel test"
parallel: 3

这会启动 3 个并行的 test 作业实例。

Runner 并发配置

确保 GitLab Runner 支持并发执行。

在 Runner 配置文件中设置 concurrent 值:

1
concurrent = 10

如果并发数设置过低,作业会排队等待,无法真正并行。

注意事项

  • 并行执行需要足够的可用 Runner
  • Runner 的 concurrent 值决定了最大并发作业数
  • 不同 stage 之间是串行执行的
  • 使用 parallel 关键字可以水平扩展单个作业