標籤:

我從github上下載了個開源代碼並用到了我的項目中,但是開源代碼一直在更新,如何能夠很方便的更新到呢?

我從github上下載了個開源代碼並用到了我的項目中,並做了些修改,但是開源代碼一直在更新,如何能夠很方便的更新到我的項目中呢,比如我項目裡面用了兩份開源代碼,fork就不適用了吧?


請先搞清楚 remote 的概念。以下引自 github 的幫助文檔 About remote repositories

A remote URL is Gits fancy way of saying "the place where your code is stored." That URL could be your repository on GitHub, or another users fork, or even on a completely different server.

"remote" 是 git 用來表示「你的代碼存儲位置」的 url 地址。這個地址可以是你在 github 上自己建立的倉庫,或者另外一個用戶 fork 的倉庫,或者在另一個 github 之外的伺服器上的 git 地址。

如果你的用戶名是 devMe, fork 的開源項目的用戶名叫 devA,項目名叫 foobar, 原始項目的 remote 地址就是

git@github.com:devA/foobar.git

你的 fork 項目地址就是

git@github.com:devMe/foobar.git

一般來說你建立的項目,不管是原創還是 fork,都會有一個默認的 remote 叫 origin,這個 origin 就會指向你自己的 fork 地址。

如果要同步原始項目,只要執行

git pull git@github.com:devA/foobar.git master

就可以了,為了不每次都輸入完整的地址,可以用 add remote 命令來記錄一個快捷方式

git remote add source git@github.com:devA/foobar.git

這裡 source 就是你為原始 remote 地址取的名字。之後就可以

拉取原始項目更新:

git pull source master

拉取自己 fork 項目的更新:

git pull origin master

更多參數請參考文檔

Adding a remote

Fetching a remote

我們團隊有一半以上的成員都使用 fork + pull request 來提交功能和保證主版本的穩定性。大部分人的代碼同步都是建立在上述命令上的,非常簡單明了。

submodule 和 fork 的適用場景是完全不同的,submodule 並不能代替 fork 的功能,因為無法apply 自己的修改,以及通過 pull request 合併到原始地址。


設置個upstream,

具體請參考:

github fork confusion

How do you make an existing Git branch track a remote branch?


iOS嗎?用 cocoapods。否則 git submodule。

不要直接改源碼,好的代碼都會提供定製的方法,或者繼承下再定製。

對了,其它很多開 branch 的答案都是錯的,不用看。


如果想簡單修改下上游的代碼,又不想push request,也可以git clone後,再新建一個branch,你在這個branch加自己的代碼,還可以修改clone的代碼。如果原作者更新了,git fetch再merge到你的branch。這樣的好處是方便修改上游bug,方便同步,沒有用高級功能,管理簡單。

其他方案就是:git submodule 和 git subtree。

git submodule 下想修改代碼也是可以的,還可以push到github上fork的分支。缺點要用到git submodule。


建一個upstream,然後rebase


如果你的項目的依賴關係是全序的話,那用git submodule就可以了,他更新了你就update一下,繼續用。


@vczh 說的對。

或者是用subtree

Git - Subtree Merging


推薦閱讀:

git圖解:代碼區域總結
讓你的終端更有趣——一句話心情
【收藏】圖解GitHub基本操作
Python 的數學仙境之旅
github 和 sourceforge有什麼區別?

TAG:GitHub |