github中fork分支和pullrequest的最佳實踐
最近在參與一個國外的github開源項目,遇到自己fork了源庫,一段時間之後,源庫已經更新了一些内容,這樣,自己fork的版本就落後于源庫了。那怎麼才能與源庫保持同步呢?
youbute上一個教學視訊講得非常清楚:
https://www.youtube.com/watch?v=M7ZYkjOWr6g
我這裡用檔案記錄一下,友善以後參閱和查找:
首先,假設有一個遠端的repository:
https://github.com/ensime/ensime-server.git
- 我們需要在界面上,點選右上角的“Fork”,複制一個倉庫到自己的github賬号下。
- 然後,把自己賬戶下到遠端倉庫複制到本地:
=>git clone https://github.com/yangwen0228/ensime-server.git git remote add upstream https://github.com/ensime/ensime-server.git git remote -v
origin https://github.com/yangwen0228/ensime-server.git (fetch) origin https://github.com/yangwen0228/ensime-server.git (push) upstream https://github.com/ensime/ensime-server.git (fetch) upstream https://github.com/ensime/ensime-server.git (push)
-
pull request
畢竟,我們fork倉庫就是需要做貢獻。這時,我們就要做本地checkout一個新到分支,然後在新到分支裡面做修改,保持fork到自己github倉庫的主分支永遠隻用于與upstream的倉庫進行同步,任何修改都隻是在自己新開的臨時分支中進行,進行pull request時也使用臨時分支,這樣當upstream中有沖突時,隻需要使用本地主分支與upstream分支進行rebase同步。這樣,本地的主分支永遠與upstream的主分支是同步的。而此時,再把臨時分支和本地主分支進行一個rebase同步,将conflict修改好,再push。
這個過程細化一下是這樣的(我這裡master主分支是2.0,一般情況下,預設是master):
- 檢查目前的分支:
git branch
* 2.0
- 建立一個新的臨時分支:
git checkout -b dev git branch
2.0 * dev
- 修改代碼,修改完之後,需要把變化commit到這個分支裡面
git status git add . git commit -m "#122: some changes."
- 将臨時分支上傳到github:
git push origin dev
-
在github上進行pull request
如果一切順利,那麼到這裡,遠端到maintainer接受了你的pull request。那麼,隻需要使用本地主分支與upstream分支進行rebase同步,然後删除本地的dev分支即可。
git push origin --delete dev # 删除github上的dev分支 git branch -D dev # 删除本地dev分支 git checkout 2.0 git pull --rebase upstream 2.0 git push
- 如果分支送出之後,遠端upstream的分支進行了修改,這是最麻煩的。
這時rebase後,有可能會有沖突,就需要手動把conflict修複掉。然後,git checkout 2.0 git pull --rebase upstream 2.0 git checkout dev git rebase 2.0
git add . git rebase --continue
- 再将從upstream同步後的記憶體更新到github上:
由于github上的commit順序與本地不同,如果直接push需要merge,那就整個亂了。是以,需要使用–force直接覆寫掉github的。git push --force
- 檢查目前的分支:
Date: 2017-04-22 10:21
Author: WEN YANG
Created: 2017-07-29 Sat 20:34
Emacs 25.2.1 (Org mode 8.2.10)
Validate