2012-11-29 200 views
5

我是git的新手。我所做的是分發了我感興趣的幾個存儲庫,然後將它們克隆到我的計算機上與它們一起工作。從遠程git存儲庫中更改

某些原始項目可能會因爲我曾經與本地副本混淆而顯着更新,或者我可能會做出一些微不足道的更改。

從我所瞭解的情況來看,我可以「改變」我的克隆,從原來的變化中「拉」出來。

這對我的更改有什麼影響?例如,假設有一個來自原文件的文件DoSomething.cpp。我修改它,也許修正一個小錯誤或添加一個功能。現在! 1年後,原來的項目經歷了許多修改,並且好得多。我想將這些變化「拉」到我的克隆中,但保持我的變化! (所以這是一種推動的反面)

這很容易嗎?如果是這樣,那麼基本思路是什麼?

我想從原始克隆(我改變的東西)克隆的任何變化都不會被覆蓋,但我實際上可以合併我的變化和原始(在我的叉子上),並賦予能力實際檢查並接受更改。 (例如,如果DoSomething.cpp已改變原來那麼我需要比較的變化,以確保它們兼容。

我想這不是難事,因爲我是叉的所有者我可以rebase或硬重置它然後把我的本地更改我的叉子?(不知道是否會工作雖然因爲是版本問題,一個潛力巨大的),找出哪個分支你在,這是用git status

+0

'混帳拉--rebase'將嘗試試探性地合併更改;如果它不能,它會告訴你它失敗了,你必須進行合併。 –

+0

@larsmans:所以,我想我需要一些工具,可以變基,警告我,告訴我的問題,可能是我自己修復,然後嘗試再次重訂,直到有沒有錯誤?也就是說,是重新設定一個全部還是沒有過程? – jsmdnq

+1

所有這一切正是Git已經做的。你爲什麼不嘗試從頭開始回購? –

回答

0
  1. ,它會告訴你第一行或第二行的分支名稱。

  2. 用於測試,我建議先岔開更改到一個單獨的分支:

    git checkout -b my-patches 
    
  3. 現在確保所有的修改被提交。爲此,您再次調用git status。理想情況下,應該顯示工作目錄乾淨,但如果那不是的情況下,使用git add將更改添加到索引和git commit最終提交它們。如果您想將您的更改分成幾個不同的補丁集(發生衝突時可以很方便),我建議您閱讀如何使用git commit -p。你這樣做,直到所有的更改不再在git status中列出。在git status中會列出一些你沒有碰到的文件,可能是編譯結果。如果沒有任何變化,你有興趣保持在那裏,你沒事。

    如果有任何的makefile或這樣的支持清理目錄(make clean爲例),現在運行它們。

  4. 然後切換回原來的分支,使用(替代master與任何分支的名稱在步驟1中發現):

    git checkout master 
    

    如果你想確保一切正常,運行:

    git diff my-patches 
    

    它應該列出你在叉改線。如果不是,出了點問題。

  5. 現在來了可怕的部分。您現在將丟棄對此分支所做的任何更改。請注意,如果您按照步驟3中所述將所有更改提交到單獨的分支,則它們將會正常。如果您不確定,可以通過複製整個存儲庫文件夾來進行備份。然後運行(再次,替代master,不管你有前):

    git fetch 
    git reset --hard origin/master 
    
  6. 理想情況下,你的部門要現在有origin/master分支的確切狀態。確保一切都看起來沒問題。然後你使用合併回您的更改:

    git merge my-patches 
    

    Git會做到最好,使其儘可能輕鬆的,但會有可能會有衝突。 Git將使用>>>>`<<<<標記將相應文件中的標記標記出來。爲了解決衝突,我建議你做一些互聯網調查或閱讀the section about Basic Merge Conflicts in the open Git Book。確保事後提交合並。

  7. 困難的部分已經結束。現在,您可以刪除臨時分支:

    git branch -d my-patches 
    

    我用了臨時黨支部的原因是爲了能夠方便地恢復存儲庫的狀態,以合併前的嘗試之一。當然,也可以在單獨的分支中檢查遠程狀態,但我更喜歡這樣。

1

你是對的,重新定義是一種方法,你可以保持你的代碼是最新的,並且非常常用。

根據我的經驗,重新定義在管理你的git歷史方面更有用。它使你的歷史保持良好和線性,這使得它看起來像工作順序發生而不是並行發生。另一方面,經常合併將涉及大量的分離/聚合提交。您可以使用git log --graph來直觀地看到這種差異。

簡而言之,rebase將您的提交,將它們轉換爲補丁,然後將它們應用到您重新綁定到的分支。如果存在衝突,git將停止並要求您解決它們,然後您可以繼續。所以你仍然在合併和解決衝突,但只是讓歷史成爲線性的。

0

您是否將上游遙控器添加到了您的分叉回購?這是讓叉子與主人同步的最簡單方法。這是第3步here

0

首先,你應該知道,你是否「合併」或「重訂」 你不會失去你的變化和git會給您提交更改&解決衝突(如果有的話)的機會,然後把你的修改回到你從中拉開的遠程回購。

當你git pull你告訴混帳做到這一點:(拉默認使用「合併」)

拉從遠程文件的最新副本,與我的本地更改&如果將它們合併有一個衝突,你不能自動解決然後通知我,以便我手動解決它;它很簡單。

當你git pull --rebase你告訴混帳做到這一點:

臨時刪除*從我的本地副本的變化(我修改過的文件),拉從遙控器上的最新副本,在合併我的變化頂部&如果有衝突,您無法自動解決然後通知我,以便我手動解決它。 (技術上沒有被移除,它只是使這個本來模糊邏輯更清晰

的區別很微妙,在第二種情況下,你的變化似乎是因爲如果你只是在做這些改變您從遠程獲取的最新副本的頂部......但正如您所看到的,在這兩種情況下,您的更改都會一直保留(否則使用git!)。

你應該合併或重訂?這是很長的討論&有一個地方比另一個更好,並有最佳做法;一些有用的意見在本頁面和更多信息,你可以在網上搜索已經提到的,只需鍵入「混帳合併VS底墊」,你會看到噸關於它的網頁:)

希望這會有所幫助。

相關問題