1. 程式人生 > 其它 >如何優雅的讓fork後的倉庫與原倉庫同步

如何優雅的讓fork後的倉庫與原倉庫同步

https://github.com/selfteaching/the-craft-of-selfteaching/issues/67

http://www.qtcn.org/bbs/simple/?t53628.html

最常見的問題,當你fork了一個倉庫以後,原倉庫的程式碼又被修改了,這時候能平臺並不會幫你自動同步程式碼到你fork以後的倉庫。這時候你提交程式碼,提交合並請求時的版本就和原倉庫的不一致了。這時候有什麼好的辦法解決問題呢?

最簡單粗暴地方法就是:

刪除自己的倉庫,重新fork一個倉庫

事先把自己修改的程式碼儲存好,然後刪掉fork的倉庫,接著重新fork一份原倉庫,這時候再把fork的倉庫克隆到本地,程式碼修改以後再提交。

這可是大招哦,不能一上來就用了。要在最後實在沒辦法的情況下使用,我們還有更加優雅的辦法。另外說一下,如果原倉庫已經整合了很多合併程式碼的請求,並且程式碼和你的相差很大的情況下,建議使用這種簡單粗暴的方法,很省事。

接下來我們來講一下優雅的方式是什麼樣子的,在此之前,你最好搞明白git pullgit merge的區別和聯絡。


更新程式碼併合並

  1. 進入本地倉庫的目錄
  2. 使用命令git remote -v檢視遠端倉庫的地址,以及是否關聯原始碼倉庫
D:\Project\study>git remote -v
origin  https://github.com/fxiaoyu97/Study-Log.git (fetch)
origin  https://github.com/fxiaoyu97/Study-Log.git (push)

如上所示,如果只關聯了一個倉庫地址,表示還沒有關聯原倉庫地址,這時候我們需要設定一下,這個關聯設定一次就好。

  1. 新增原倉庫的關聯:git remote add upstream https://github.com/selfteaching/the-craft-of-selfteaching.git ,這樣就可以把原倉庫設定為你的upstream倉庫。命令執行後完全沒有任何返回資訊,我們可以執行命令git remote -v檢視一下。
D:\Project\study>git remote -v
origin  https://github.com/fxiaoyu97/study.git (fetch)
origin  https://github.com/fxiaoyu97/study.git (push)
upstream  https://github.com/calos/study.git (fetch)
upstream  https://github.com/calos/study.git (push)
  1. 執行命令git status檢查本地是否有未提交的修改,如果存在的話,先把未提交的修改從本地倉庫推送到自己的遠端倉庫,最後再執行git status檢查一下本地檔案的狀態。
git add -A
git commit -m "提交說明"
git push origin master
git status

注意:這一步可以避免出現文字衝突的情況,但是如果你本地倉庫的修改不是很重要,建議還原的到未修改以前的樣子。

  1. 獲取原倉庫的更新內容:git fetch upstream
D:\Project\study>git fetch upstream
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (3/3), 608 bytes | 26.00 KiB/s, done.
From https://github.com/fxiaoyu97/study
   44a5a2d..8da9cb5  master     -> upstream/master
  1. 切換到master分支:git checkout master
  2. 合併原倉庫的內容到本地master分支:git merge upstream/master,如果遇到衝突就在本地解決衝突。
  3. 把本地倉庫的內容推送到自己的倉庫:git push

如果遠端原倉庫的歷史commit被修改整理過,而自己在沒有同步遠端原倉庫的情況下有新的PR需求請求,可以有兩個方案處理:

  1. fork最新的遠端倉庫,重新提交。
    1. 備份自己的改動
    2. 刪除自己的fork的倉庫,重新fork遠端原倉庫
    3. 將最新改動的應用到新fork的倉庫,然後提交PR
  2. 強制同步遠端主倉庫的所有提交,處理衝突,再次提交
    1. 備份自己的改動
    2. 新增遠端遠倉庫為自己本地倉庫的一個upstream,試用一下命令強制同步git fetch upstrem && git reset --hard upstrem/master && git clean -f -d
    3. 將自己的改動應用到強制同步過來的分支,如果使用的其他分支備份,可以使用rebase命令合併過來,如果有衝突,處理衝突
    4. 檢查自己的commit是否正確合理,無問題則可重新提交PR