前言
Github工作流
是一個基於分支的、支援團隊協作的效率工程。我們可以在工作中,很方便的合併、review
他人程式碼,並且可以清晰的看到提交記錄,方便程式碼回滾。
很多網際網路企業都已經採用這種多人協同的開發方式,真的非常爽,誰用誰知道。
github工作流
通過如下工作流,可以很輕鬆的完成功能提交, 並且還可以讓合併程式碼的人輕鬆review、comment.
graph TD
fork到自己倉庫.. --> 建立功能分支... --> 提交點程式碼到功能分支... --> create-pull-request....
如下為React倉庫中的某個pr
工作流常見問題彙總
1. 原生程式碼太久遠,需要更新
當然不是每個pr都是一番風順的。比如你的功能分支已經寫了幾個月了, 此時你本地的程式碼相對於遠端倉庫來說就太久遠了,如果不更新的話,可能會導致有很多衝突。
需要在你的功能分支上再拉一次遠端程式碼。
graph TD
git_pull_upstream_master..... --> create_pull_request....
細心的同學可能會發現, 在你這次pr的commit裡,包含了主分支的commit。
3an4js2 feature: xxx
3an4js2 master commit three
3an4js2 master commit two
3an4js2 master commit one
複製程式碼
這是因為git pull 相當於把遠端倉庫的的程式碼合併到你本地倉庫了,自然就有這些commit了。
那有沒有辦法使 既能更新原生程式碼 又 沒有這些不屬於我的commit
呢?
graph TD
1.git_fetch_upstream_master...... --> 2.git_rebase_upstream/master...... --> 3.git_push_-f...
rebase 相當於把當前分支的修改 拼接在 最新的master後面, 如下mywork
分支的c5,c6就直接拼接在了origin
後面, 沒有多餘的提交記錄
而pull=fetch+merge
, merge
會把origin的commit 合併到你的分支裡。這也是pr裡會顯示主分支的commit的原因。
2. rebase | merge 出現衝突
git rebase upstream/master
get merge master
複製程式碼
rebase
和 merge
都有可能產生衝突
如果是rebase產生衝突
- 我們修改完衝突,只用
git add
, git rebase --continue
就可以了
merge產生衝突
-
重新走一遍提交流程
3. 合併多個commit為1個
有時候,我們要提交的功能很複雜,可能會產生多個commit, 但是在提交pr的時候,只需要一個彙總的commit 就可以了,這個要怎麼做呢?
例如:
- 1: 我的第4次提交
- 2: 我的第3次提交
- 3: 我的第2次提交
- 4: 我的第1次提交
- 5: feat: ...
將這1 - 4提交合併為一個
我們可以將當前git指標
指到倒數第五次提交,這樣1 ~ 4次提交就變為未提交狀態.
git reset 2as4cjd4(commitId)
再重新add, commit 就可以了
複製程式碼
4.如何將程式碼切換到別人的pr
- 先找到pr的id
- git fetch upstream pull/id/head:temp
- git checkout temp
這個命令就是 將遠端id為..的pr拉取到本地的temp分支,切換到temp分支就可以看到遠端的pr了