Git自學成才——fork倉庫保持同步

wIsper發表於2019-03-08
fork別人的專案到自己的repository,然後clone到本地進行開發。然後別人的專案也在繼續開發,本文主要說明如何把fork的專案的新的提交同步到自己的倉庫。
核心思想是利用多個遠端倉庫(remote repository)
先執行完fork,然後到自己的倉庫clone程式碼下來,以master分支為例

$ git branch
 * master複製程式碼
保持工作目錄是最新的並且是乾淨的

$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean複製程式碼
接下來,看一下遠端倉庫

$ git remote -v
origin	ssh://git@xxx/YOUR_REPO/my-android.git (fetch)
origin	ssh://git@xxx/YOUR_REPO/my-android.git (push)複製程式碼
此處origin別名對應的遠端倉庫地指向的是自己的倉庫(因為是從自己的倉庫clone的)
接下來,我們要新增對於目標倉庫(別人的倉庫)的指向。

$ git remote add upstream ssh://git@xxx/UPSTREAM_REPO/my-android.git複製程式碼
然後再看一下遠端倉庫情況

$ git remote -v
origin	ssh://git@xxx/YOUR_REPO/my-android.git (fetch)
origin	ssh://git@xxx/YOUR_REPO/my-android.git (push)
upstream	ssh://git@xxx/UPSTREAM_REPO/my-android.git (fetch)
upstream	ssh://git@xxx/UPSTREAM_REPO/my-android.git (push)複製程式碼
已經關聯了遠端倉庫了,使用sourcetree直觀的看一下狀態

Git自學成才——fork倉庫保持同步

從圖中看出,我fork之後,對方的倉庫又有很多次提交,這時我的倉庫裡也有幾次提交,通過rebase來保持同步。

rebase upstream的master分支

$ git rebase upstream/master複製程式碼
然後就是普通rebase的操作,如果有衝突不知道怎麼解決,請參考我的另一篇“Git自學成才——rebase完整版”
完成rebase之後,看一下節點是OK的

Git自學成才——fork倉庫保持同步

接下來是要執行push,如果直接push到自己的遠端倉庫,是被拒絕的

$ git push origin master:master
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'ssh://git@xxx/YOUR_REPO/my-android.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.複製程式碼
這時有兩種方法:一種是刪除遠端分支,然後直接push;另一種是使用 git push --force 強制推送。
這裡我選擇第二種強推的方式,第一種方式參見我的另一篇“Git自學成才——rebase完整版”

$ git push -f origin master:master
Compressing objects: 100% (186/186), done.
Writing objects: 100% (281/281), 66.82 KiB | 11.14 MiB/s, done.
Total 281 (delta 126), reused 184 (delta 41)
remote: Resolving deltas: 100% (126/126), completed with 54 local objects.
To ssh://git@xxx/YOUR_REPO/my-android.git
 + 8aaa796...d298312 master -> master (forced update)複製程式碼
push成功,看一下sourcetree上面的狀態也是OK的。

Git自學成才——fork倉庫保持同步

至此,同步了別人倉庫的最新提交,也保有了自己的提交。


相關文章