2011-06-16 132 views
160

我有本地&遠程git存儲庫。我想將本地存儲庫與遠程存儲庫同步,以便我的本地存儲庫成爲遠程存儲庫的100%副本。這意味着如果這些回購中的某些文件不同,我們會用遠程文件覆蓋本地文件。如果本地回購站中存在遠程回購中不存在的文件,則會刪除本地文件。git:與遠程同步本地回購

有沒有辦法實現,而不是做一個新的遠程回購克隆?

類似的問題作爲Sync local git repo with remote in one shot discarding local changes/commits

+2

總是當我來到這裏,我正在尋找[正在同步叉子(https://help.github.com/articles/syncing-a-fork/) – 2016-06-11 07:44:06

回答

-2

您可以使用git hooks。只需創建一個掛鉤,在更新後將其更改爲其他回購。

當然,你可能會遇到合併衝突,所以你必須弄清楚如何處理它們。

81

您需要明白,Git存儲庫不僅僅是目錄和文件的樹,而且還存儲這些樹的歷史記錄 - 可能包含分支和合並。

從存儲庫中獲取數據時,您會將全部或部分分支複製到您的存儲庫中。然後這些信息在您的存儲庫中被稱爲「遠程追蹤分支」,例如,像remotes/origin/master或類似命名的分支。

從遠程存儲庫獲取新的提交不會改變任何有關您本地工作副本的內容。

您的工作副本通常會檢出一個提交,稱爲HEAD。此提交通常是您當地分支機構的一個提示。

我想你想更新你的本地分支(或者所有的本地分支?)到相應的遠程分支,然後檢查出最新的分支。

爲避免與工作副本(可能有本地更改)發生衝突,首先清理所有未版本化的東西(使用git clean)。然後檢出與要更新的遠程分支對應的本地分支,並使用git reset將其切換到獲取的遠程分支。 (git pull將包含遠程分支在本地的所有更新,這可能是相同的,或者如果您有本地提交,則創建合併提交。)

(但那麼您將真正失去本地更改 - 。工作副本和本地提交確認你真的想這樣 - 否則最好使用一個新的分支,這樣可以節省您的本地提交和使用git stash保存其尚未提交的更改)


編輯:。 如果您只有一個本地分支並且正在跟蹤一個遠程分支,那麼您所需要做的就是

git pull 

從工作目錄內部。

這將獲取當前版本的所有跟蹤遠程分支,並將當前分支(和工作目錄)更新爲它正跟蹤的遠程分支的當前版本。

+0

如果我在本地變着法子存儲庫,只有a。)想要從遠程獲得所有內容的副本,並且b。)希望在版本之間顯示差異。所以我不承諾,不改變任何東西=沒有本地更新/更改。我應該定期使用哪些命令(例如每週左右)來實現上述兩個功能?請回答KISS(保持簡單愚蠢) - 我也是git noob,而且會RTFM - 但一開始需要幫助。 ;) – kobame 2011-06-17 12:36:19

+0

在你的簡單情況下,我認爲'git pull'應該足夠了。 (我更新了答案。) – 2011-06-17 13:54:54

+0

如果我有一些本地更改,我不想提交。現在,當我做拉它說我提交或藏匿他們。所以在這種情況下,我該如何告訴git來覆蓋這些並執行pull? – Harshana 2015-09-17 07:47:39

2

聽起來像是你想遠程倉庫的一面鏡子:

git clone --mirror url://to/remote.git local.git 

該命令創建一個純倉庫。如果你不想要一個裸倉庫,事情會變得更加複雜。

3

(此信息是從The Git User's Manual

我也在學習,所以這可能不是完全是一個問題的答案,但它可能會幫助別人:

  1. 當遠程倉庫是最初所有分支的克隆副本都存儲在本地存儲庫中(請使用git branch -r查看它們)
  2. 要更新這些副本並使它們變爲最新(即將它們與遠程分支同步),請使用git fetch。這不會影響您現有的任何自定義創建的分支。
  3. 要覆蓋當地分行結算的新版本無論分支你工作(假設你已經執行git add origin /path/to/repository)使用git checkout origin/branch_name,這將覆蓋當地人分支branch_name
73

這些步驟將做修改它:

git reset --hard HEAD 
git clean -f -x -d -n 

然後在不-n

這將需要的所有本地更改護理。現在提交......

git status 

,並注意行如:

Your branch is ahead of 'xxxx' by N commits. 

請記數 'N' 現在:

git reset --hard HEAD~N 
git pull 

最後:

git status 

應該顯示沒有g添加/提交。 全部乾淨。

然而,新鮮的克隆可以做同樣的事情(但速度很慢)。

===更新===

由於在時間略有改善我的git知識,我想出了另一種更簡單的方式做同樣的。以下是(#with解釋)。雖然你的工作的分支:

git fetch # This updates 'remote' portion of local repo. 
git reset --hard origin/<your-working-branch> 
# this will sync your local copy with remote content, discarding any committed 
# or uncommitted changes. 

雖然你的本地提交和變化從視線在這之後消失,有可能恢復已提交的變化,如果需要的話。

+1

非常感謝更新作品完美地與github和bitbucket :) – commonSenseCode 2015-07-01 20:58:40

+0

upvoted因爲更新 – Tundebabzy 2018-02-16 09:44:34

182
git fetch --prune 

-p,--prune
取後,除去任何遠程跟蹤分支,其遙控器上不再存在。prune options

+2

這就是我一直在尋找! P.S.下次我會在挖掘計算器之前仔細閱讀man page :-) – Serg 2014-01-24 08:10:26

+2

在這種情況下'git pull'有效嗎? – 2014-10-26 15:13:03

+5

是的,'git pull -p'也是一樣的 - 'git pull運行git fetch與給定的參數並調用git merge合併檢索到的分支頭到當前分支中 - http://git-scm.com/docs/git-pull – jobwat 2014-10-27 21:37:12

36

你想幹什麼

git fetch origin 
git reset --hard origin/master 
git clean -f -d 

這使得當地的回購酷似遠程回購。

請記住用遠程和分支替換原點和主控制器,以便與其同步。

+1

它也會刪除所有的目錄從npm安裝和bower安裝,不建議,除非你想重新安裝.gitignore中的所有依賴關係。 – chwagssd 2015-10-14 16:35:32

+0

它沒有刪除我的'node_modules',它的工作原理與我想要的完全一樣。 – VSG24 2017-04-10 05:10:12

1

如果您正在討論同步分叉回購,那麼您可以按照下列步驟操作。

如何從混帳

  1. 同步叉子庫查看當前的Git分支

    git branch

  2. 結賬掌握,如果你不是高手

    git checkout master

  3. 獲取上游資源庫,如果你有正確的訪問權限

    git fetch upstream

  4. 如果您收到以下錯誤,然後運行

    git remote add upstream [email protected]:upstream_clone_repo_url/xyz.git

    fatal: 'upstream/master' does not appear to be a git repository 
    fatal: Could not read from remote repository. 
    Please make sure you have the correct access rights and the repository exists. 
    
  5. 現在運行下面的命令。

    git fetch upstream

  6. 現在,如果你是高手,然後合併上游/大師到主分支

    git merge upstream/master

    這就是它!

    通過git remote命令,更具體的git remote -v

    如果我也有權利提交到上游回購,我可以創建本地上游分支,做工作,將知難而上有交叉檢查。

+0

爲什麼我應該在第三步中當我已經得到一個錯誤時去做上游獲取上游? – 2017-03-03 03:48:27