---
# System prepended metadata

title: git contribution
tags: [SE, git]

---

# git contribution

* [使用 git pull --rebase 處理遠端提交](https://awdr74100.github.io/2020-05-04-git-rebase/)
* [開發完成推向遠端分支 - git rebase、git pull –rebase](https://hackmd.io/@romazing/rkKvskBsn)
* [Git Cherry-pick 實戰：最佳實踐與應用場景](https://notes.boshkuo.com/docs/DevTools/Git/git-cherry-pick)

inspire

* message queue

## strict workflow

核心就是 resolve upstream main conflict

### contributer

* upstream: repo of reviewer
* origin: repo of contributer own

when want to implement a new feature

```mermaid
---
title: git contributer
---
flowchart TD;
	n1["git checkout main"]
	n2["git fetch upstream main"]
	n2 --> n1
	n3["git merge upstream/main"]
	n1 --> n3
	n4["git checkout -b feat/XXX"]
	n3 --> n4
	n4 --> n5["Do your feature"]
	n5["Do your feature then commit"]
	n6["create WIP PR, from your feat/XXX branch to upstream main"]
	n9["git rebase --continue"]
    n8["ask review to merge, then modification (always no conflict to upstream main)"]
	n7["git pull upstream main --rebase # never merge!!!"]
	n10["git push origin # push feat/XXX to your own remote"]
	n6 --> n8
	n5 --> n7
	n9 --> n10
	n10 --> n6
	n11["git cherry-pick $(git rev-parse upstream/main) --no-commit"]
	n12["git commit"]
	n5 --> n11
	n13["resolve"]
	n14["resolve"]
	n11 --> n13
	n13 --> n12
	n7 --> n14
	n12 --> n10
	n14 --> n9
    n8--"repeat cycle"-->n7
    %%n8-->n11
```

* 可以在 `git pull upstream main --rebase` 之前先下 `git branch PR/feat/XXX` 避免操作 rebase 錯誤後，無法復原。
* rebase 會 移動 commits 的起點和結束點
* cherry-pick 不會移動起點，只會改終點。
* cherry-pick 會比 rebase 簡單，但是 PR 需要時間審核，所以同時一定會需要 branch serveral branch。保留起點了話，在 merge 後就容易有多條並行的線圖。
    * 並且由於change 是 copy 到 work branch，有變更的檔案會越來越多，甚至影響到正常審核。
* **建議優先使用 rebase**

### reviewer

* origin: repo of reviewer own

```mermaid
---
title: git reviewer
---
flowchart TD;
	n1["when non-conflict PR existed"]
	n2["git fetch specific_remote feat/XXX"]
	n1 --> n2
	n2 --> n3["git reset --hard specific_remote/feat/XXX"]
	n3 --> n4["run local build, checkout no bug"]
	n3
	n5["run app, checkout no bug"]
	n4["run local build, run unit test"] --> n5
	n5 --> n6["click merge button on git web UI"]
	n6 --> n7["git fetch origin main"]
```

## why

* 想要 敏捷、CI/CD
    * 這是主要因素，以前可能 1~2 weeks merge 一次。現在希望盡快讓最新的修改上線，自然就要標準化PR的方式，降低 merge的阻力。
* 讓 reviewer solve conflict 會導致 reviewer 變 bottleneck。
    * 必須要讓 contributer solve 
    * The most straight forward result is **scale** of the team. If reviewer have to solve conflicts in PR, The team is hard to become more than 5 people usually 3 only. On the other hand, strict workflow can scale whole team to about 15.
* 不想要有 branch of branch graph，會難以理解。
    * rebase, cherry pick
    * 任何 merge 類 行為都會導致龐大的graph

## toward automatic team

* strict workflow above
    * conflict issue has well-defined method to solve
* unit test
    * ensure new code/ resolve conflict doesn't break previous feature.
    * This is especially important at multi-contributer repo to prevent from merge breaking existed implement.
* completed CI/CD tool
    * prevent repeated work to prevent from reviewer become bottleneck
    * The final goal is keep whole code review work on web platform.
        * switching between several PR and build locally is time consuming
    * main to deploy
        * minimize time between main to release, lower down reviwer burden.
    * build and run each PR unittest
        * build and run each commit take time and will pause reviewer work.
        * And contributer know if there is basic mistake.
    * build and run app preview of PR
    * code quality tool (optional)
        * LLM code review tool

Reviewers only need to review source code now, they should ensure contributer follow design(code arch).
