在github上,當看到好的項目代碼時,有兩種方式可以將代碼“下載”到本地。一是可以直接clone原項目,二是通過github的“fork”功能“拷貝”項目到我們自己的主頁上,再從主頁上clone“拷貝項目”。
兩種方式最重要的區別是,如果我們修改了clone到本地的代碼,想push一下,顯然第一種方式不可行,因為項目的遠程信息是別人的(通過git remote -v 可以查看),而第二種方式,由於創建者相當於是我們自己,是能夠push的(當然先要add 和commit)。但是我們push之后,原項目的主人是看不到我們修改的代碼的,如果想讓原作者接受並merge你的修改,這時可以發起pull request,這樣原作者就能收到pull request請求,並可以審閱你的代碼是否合理,如果他比較滿意,就可以merge你的修改,這樣原項目就得到了完善,而你也就成為了光榮的“貢獻者”之一。
一般情況我們是不需要fork的。很多人錯誤的在使用fork,把它當成一種“收藏”功能,這其實並沒有什么必要。一來,可以直接用“watching”來關注該項目,當有新的issue,commit,pull request時,你會收到相應的郵件提醒(前提是設置了郵箱)。二來fork的項目只是保留了fork當時的狀態,如果項目作者在你fork之后更新了項目,你是看不到的。這就帶來一個問題:如何實現fork后的項目與原項目的同步?這是我今天參與一個項目的時候才意識到的,以前沒有思考過這個問題(諸位莫要見怪)。查閱了一些資料,找到了一個比較簡單可行的答案。方法如下:
在我的主頁上有一個項目“zhihu-api”,可以看到,它是從“lzjub567/zhihu-api”fork來的。

1. 將自己主頁的項目clone到本地,如下圖:

此時,若我們查看項目的遠程信息,發現結果都是關於我自己主頁的,origin是分支名稱:

2. 為項目添加遠程分支:

其中 upstream是遠程分支名,后面的鏈接是原作者的倉庫地址,此時再重新查看項目的遠程信息,發現多了upstream的信息,是剛剛添加的原作者的倉庫

3. 如果遠程項目進行了更新,我們需要從upstream分支進行拉取,這樣本地的代碼就和原作者的代碼同步了。

4. 將本地代碼提交到自己主頁的分支,即origin上了,這樣,我自己主頁的項目就和原作者的項目進行了同步。

總結一下:實現fork的項目和原項目同步的方法是利用本地的項目作為“中轉”,為本地的項目添加兩個遠程信息,拉取原倉庫的新代碼,push到自己的倉庫上,就達到了“同步”。
實現這個目的的做法不止這一種,只是我剛好看到了,覺得比較簡單,就記錄到這里備忘。
推薦文章:
作者:hitchc
鏈接:https://www.jianshu.com/p/fede3333205f
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。