天天看點

github中fork分支和pullrequest的最佳實踐

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):

    1. 檢查目前的分支:
      git branch
            
      * 2.0
            
    2. 建立一個新的臨時分支:
      git checkout -b dev
      git branch
            
      2.0
      * dev
            
    3. 修改代碼,修改完之後,需要把變化commit到這個分支裡面
      git status
      git add .
      git commit -m "#122: some changes."
            
    4. 将臨時分支上傳到github:
      git push origin dev
            
    5. 在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
            
    6. 如果分支送出之後,遠端upstream的分支進行了修改,這是最麻煩的。
      git checkout 2.0
      git pull --rebase upstream 2.0
      git checkout dev
      git rebase 2.0
            
      這時rebase後,有可能會有沖突,就需要手動把conflict修複掉。然後,
      git add .
      git rebase --continue
            
    7. 再将從upstream同步後的記憶體更新到github上:
      git push --force
            
      由于github上的commit順序與本地不同,如果直接push需要merge,那就整個亂了。是以,需要使用–force直接覆寫掉github的。

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