git工作流

yuanheci 2025年02月13日 24次浏览

搬运自牢瑞的博客:https://brrblog.netlify.app/SkillShared/git.html


step1. 项目初始化

  • romote — main(master) [init]
  • localGit
  • disk
    首先,拉取项目到自己本地。
git clone <url/ssh>

之后,切换到最新分支main/master(为方便叙述,后续段落统一使用 main),并新建分支,切换到对应分支。

git checkout main
git branch <namedev_branch>
git checkout <namedev_branch>

之后便可进行开发工作。

step2. 日常开发

  • romote — main(master) [init]
  • localGit
    • main(master) [init]
    • <namedev_branch> [init]
  • disk [init]
    如上,完成初始化后,我们的代码管理的状态,注意disk中不包含任何分支信息,它只存储当前最新代码。

日常的代码处理为如下步骤:

git add .
git commit -m "feat: ..."
git push -u origin <namedev_branch>

step3. 检查origin状态

若 origin 的 main 分支代码未发生更新:
在完成日常开发任务并提交远程分支后,我们会获取到如下状态:

  • romote
    • main(master) [init]
    • <namedev_branch> [init] --> [my-commit]
  • localGit
    • main(master) [init]
    • <namedev_branch> [init] --> [my-commit]
  • disk [my-commit]
    则跳转 step5 进行合并。

若 origin 的 main 分支代码发生更新:
在完成日常开发任务并提交远程分支后,我们会获取到如下状态:

  • romote
    • main(master) [init] --> [update]
    • <namedev_branch> [init] --> [my-commit]
  • localGit
    • main(master) [init]
    • <namedev_branch> [init] --> [my-commit]
  • disk [my-commit]
    则进行 step4 同步修改。

step4. rebase

明确一点,一切以主分支上代码为基准,主分支更新,本地的更新必须建立在主分支更新上。

所以,首先在本地,切换到主分支,获取更新。

git checkout main
git pull origin main

此时的代码状态为:

  • romote
    • main(master) [init] --> [update]
    • <namedev_branch> [init] --> [my-commit]
  • localGit
    • main(master) [init] --> [update]
    • <namedev_branch> [init] --> [my-commit]
  • disk [init] --> [update]
    之后,切换到私人分支,进行 rebase 在本地合并代码。
git checkout <namedev_branch>
git rebase main

解释一下 rebase 操作,先将个人的修改 [my-commit] 扔一边,先同步主分支的 [update] ,之后在 [update] 的基础上进行 [my-commit] 的修改。
自然地,这个过程可能出现 rebase conflict,即代码冲突,这时候就需要手动选择保留哪一段代码。

这里再补充一下git merge和rebase的区别:
image-1739427909971

这两种方法之间的最大区别在于,merge保留了commit的完整历史记录,包括按时间顺序排列,而rebase使提交变得整洁,仅与分支上的commit相关。
Merge具有更高的可追溯性,而Rebase则更整洁且易于审核。

若 rebase 操作成功,再将结果push到远程个人分支。

git push -f origin <namedev_branch>

由于进行了 rebase 操作,所以需要使用 -f (force) 提示符。

之后获取到如下的代码状态:

  • romote
    • main(master) [init] --> [update]
    • <namedev_branch> [init] --> [update] --> [my-commit]
  • localGit
    • main(master) [init] --> [update]
    • <namedev_branch> [init] --> [update] --> [my-commit]
  • disk [init] --> [update] --> [my-commit]

step5. PR合并代码

恭喜,已经完成了所有的准备工作,现在可以提 PR 了。

以 GitHub 为例,作为开发者,只需要新建 PR 请求,即点击 [New pull request] 按钮,请求将私人分支的代码更新合并到主分支。

作为项目所有者,或管理员,会收到 PR 请求,可以选择合并或拒绝,以合并为例,点击 [Squash and merge] 合并代码。

Squash(压缩) 就是将分支上的所有改动 commit 合并到一个 commit(这里称作update2) ,这是必要的,分支上可能有许多小改动,而我们希望主分支的每一次代码版本都是可用且功能完整的。

一般来说,在仓库所有者合并代码后,开发者需要删除个人开发分支,远程个人分支可以在GitHub上操作,本地分支操作如下:

git checkout main
git branch -d <namedev_branch>
git pull origin  main

此时代码状态:

  • romote
    • main(master) [init] --> [update] --> [update2]
  • localGit
    • main(master) [init] --> [update] --> [update2]
  • disk [init] --> [update] --> [update2]
    至此,一整套代码管理工作流程完成。