fork別人的項(xiàng)目到自己的repository,然后clone到本地進(jìn)行開(kāi)發(fā)。然后別人的項(xiàng)目也在繼續(xù)開(kāi)發(fā)瞧预,本文主要說(shuō)明如何把fork的項(xiàng)目的新的提交同步到自己的倉(cāng)庫(kù)。
核心思想是利用多個(gè)遠(yuǎn)程倉(cāng)庫(kù)(remote repository)
先執(zhí)行完fork仅政,然后到自己的倉(cāng)庫(kù)clone代碼下來(lái)垢油,以master分支為例
$ git branch
* master
保持工作目錄是最新的并且是干凈的
$ git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
接下來(lái),看一下遠(yuǎn)程倉(cāng)庫(kù)
$ git remote -v
origin ssh://git@xxx/YOUR_REPO/my-android.git (fetch)
origin ssh://git@xxx/YOUR_REPO/my-android.git (push)
此處origin別名對(duì)應(yīng)的遠(yuǎn)程倉(cāng)庫(kù)地指向的是自己的倉(cāng)庫(kù)(因?yàn)槭菑淖约旱膫}(cāng)庫(kù)clone的)
接下來(lái)圆丹,我們要添加對(duì)于目標(biāo)倉(cāng)庫(kù)(別人的倉(cāng)庫(kù))的指向滩愁。
$ git remote add upstream ssh://git@xxx/UPSTREAM_REPO/my-android.git
然后再看一下遠(yuǎn)程倉(cāng)庫(kù)情況
$ 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)
已經(jīng)關(guān)聯(lián)了遠(yuǎn)程倉(cāng)庫(kù)了,使用sourcetree直觀的看一下?tīng)顟B(tài)
從圖中看出辫封,我fork之后硝枉,對(duì)方的倉(cāng)庫(kù)又有很多次提交,這時(shí)我的倉(cāng)庫(kù)里也有幾次提交倦微,通過(guò)rebase來(lái)保持同步妻味。
rebase upstream的master分支
$ git rebase upstream/master
然后就是普通rebase的操作,如果有沖突不知道怎么解決欣福,請(qǐng)參考我的另一篇“Git自學(xué)成才——rebase完整版”
完成rebase之后责球,看一下節(jié)點(diǎn)是OK的
接下來(lái)是要執(zhí)行push,如果直接push到自己的遠(yuǎn)程倉(cāng)庫(kù)劣欢,是被拒絕的
$ 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.
這時(shí)有兩種方法:一種是刪除遠(yuǎn)程分支棕诵,然后直接push;另一種是使用 git push --force 強(qiáng)制推送凿将。
這里我選擇第二種強(qiáng)推的方式校套,第一種方式參見(jiàn)我的另一篇“Git自學(xué)成才——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上面的狀態(tài)也是OK的牧抵。
至此笛匙,同步了別人倉(cāng)庫(kù)的最新提交侨把,也保有了自己的提交。