Git 工作流程——以Github为例

适用于个人和小团队的标准工作模式

学习视频:十分钟学会正确的github工作流,和开源作者们使用同一套流程

假设项目初始内容如下

  • Github:

    • main(master) 分支 Init 内容
  • Loacl git:

    • main(master) 分支 Init 内容
  • DIsk:

    • main(master) 分支 Init 内容(仅作理解)

1. 建立个人工作分支

使用如下命令创建一个个人工作的分支并切换到该分支上

1
git checkout -b my-feature

当前状态如下

  • Github:

    • main(master) 分支 Init 内容
  • Loacl git:

    • main(master) 分支 Init 内容
    • my-feature分支 Init 内容
  • DIsk:

    • my-feature分支 Init 内容

2. 对本地内容进行修改、提交、推送

(1) 当前状态如下

  • Github:

    • main(master) 分支 Init 内容
  • Loacl git:

    • main(master) 分支 Init 内容
    • my-feature分支 Init 内容
  • DIsk:

    • my-feature分支 Init-changes 内容

使用git diff可查看对比做出修改的内容

(2) 暂存更改内容

使用git add <filename>暂存已做出的修改

此时状态如下

  • Github:

    • main(master) 分支 Init 内容
  • Loacl git:

    • main(master) 分支 Init 内容
    • my-feature分支 Init-changes 内容
  • DIsk:

    • my-feature分支 Init-changes 内容

(3) 提交已暂存的更改

使用git commit命令提交

若想添加注释可使用如下命令

1
git commit -m "text"

此时状态如下

  • Github:

    • main(master) 分支 Init 内容
  • Loacl git:

    • main(master) 分支 Init 内容
    • my-feature分支 Init-f-commit 内容
  • DIsk:

    • my-feature分支 Init-f-commit 内容

(4) 将内容push到Github上

使用git push origin my-feature将内容push到Github中自己的分支

此时状态如下

  • Github:

    • main(master) 分支 Init 内容
    • my-feature分支 Init-f-commit 内容
  • Loacl git:

    • main(master) 分支 Init 内容
    • my-feature分支 Init-f-commit 内容
  • DIsk:

    • my-feature分支 Init-f-commit 内容

若此时GitHub中的main(master)分支有其他的修改或提交,须进行第三步处理主分支的改变

此时状态如下

  • Github:

    • main(master) 分支 Init-update 内容
    • my-feature分支 Init-f-commit 内容
  • Loacl git:

    • main(master) 分支 Init 内容
    • my-feature分支 Init-f-commit 内容
  • DIsk:

    • my-feature分支 Init-f-commit 内容

3. 处理主分支的改变

(1) 本地返回main(master)分支

1
git checkout main

此时状态如下

  • Github:

    • main(master) 分支 Init-update 内容
    • my-feature分支 Init-f-commit 内容
  • Loacl git:

    • main(master) 分支 Init 内容
    • my-feature分支 Init-f-commit 内容
  • DIsk:

    • main(master)分支 Init 内容

(2) 拉取远程改变

1
git pull origin main

此时状态如下

  • Github:

    • main(master) 分支 Init-update 内容
    • my-feature分支 Init-f-commit 内容
  • Loacl git:

    • main(master) 分支 Init-update 内容
    • my-feature分支 Init-f-commit 内容
  • DIsk:

    • main(master)分支 Init-update 内容

(3) 切换回my-feature分支并合并代码

使用以下命令切换回my-feature分支

1
git checkout my-feature

再使用以下命令合并代码

1
git rebase main

此时可能会出现rebase conflict,需要手动选择要保留的代码

此时状态如下

  • Github:

    • main(master) 分支 Init-update 内容
    • my-feature分支 Init-f-commit 内容
  • Loacl git:

    • main(master) 分支 Init-update 内容
    • my-feature分支 Init-f-commit 内容
  • DIsk:

    • my-feature分支 Init-update-f-commit 内容

(4) 推送my-feature分支

使用以下命令推送

1
git push -f origin my-feature

-f表示强制,切忌在pushmain分支时使用,须谨慎谨慎再谨慎!!!!!!!!!

此时状态如下

  • Github:

    • main(master) 分支 Init-update 内容
    • my-feature分支 Init-update-f-commit 内容
  • Loacl git:

    • main(master) 分支 Init-update 内容
    • my-feature分支 Init-f-commit 内容
  • DIsk:

    • my-feature分支 Init-update-f-commit 内容

(5) 审查并合并到main分支

此时生成新的pull request,项目管理员审查代码之后Squash and merge合并分支的改变并同步到main分支,简化提交内容,此时状态如下

  • Github:

    • main(master) 分支 Init-update-update2 内容
    • my-feature 分支
  • Loacl git:

    • main(master) 分支 Init-uodate 内容
    • my-feature分支 Init-f-commit 内容
  • DIsk:

    • my-feature分支 Init-update-f-commit 内容

(6) 清理本地分支

a. 切换到main(master)分支

1
git checkout main

b. 删除my-feature分支

1
git branch -D my-feature

-D表示强制删除,切忌使用在main分支上,须谨慎谨慎再谨慎!!!!!!!!

此时状态如下

  • Github:

    • main(master) 分支 Init-update-update2 内容
  • Loacl git:

    • main(master) 分支 Init-update 内容
    • my-feature分支 Init-f-commit 内容
  • DIsk:

    • main(master)分支 Init-update 内容

c. 拉取最新main(master)分支

1
git pull origin main

此时状态如下

  • Github:

    • main(master) 分支 Init-update-update2 内容
  • Loacl git:

    • main(master) 分支 Init-update-update2 内容
  • DIsk:

    • main(master)分支 Init-update-update2 内容

至此一个工作环节结束