1. 程式人生 > >使用Git時,本地倉庫向遠端倉庫push失敗問題解決

使用Git時,本地倉庫向遠端倉庫push失敗問題解決

        剛開始學習並使用 Git 就遇到了問題。使用 Git 時,本地倉庫向遠端倉庫 push 失敗(遠端倉庫並未有內容更新)。在網上查找了一些方法,但是都不能很好地解決。最後還是請教前輩才得以解決,在此分享一下。

        我的具體情況,我把本地的 “testA” 工程進行 Git 管理,使用“git init"進行初始化,作為一個遠端倉庫。然後克隆 "testA" 倉庫,建立一個新的倉庫 "testB" 作為本地倉庫。在 克隆 某一工程後,Git 預設使用 "origin" 標識原始倉庫testA。我在 testB 工作目錄中進行檔案的修改,add,commit 之後,想把所做的修改 push 整合到 testA 倉庫中。

        在 testB 目錄下執行命令: git push origin master。然後檢視 testA 倉庫,發現 push 並沒有生效(就是檔案沒有變化)。

        分析:造成這個錯誤的原因是,git不允許多個使用者同時對遠端倉庫的主分支origin/master進行操作。

        以此克隆 Git 會預設建立本次倉庫的 master 分支和遠端倉庫的 origin/master分支。本地倉庫還未進行過 commit 修改時,其實本地倉庫的 master 分支和遠端倉庫的 origin/master 分支都指向同一個commit物件。如下圖:


        當本地倉庫 commit 一次修改後,origin/master 分支變成了 master 的上游分支,如下圖:


        此時,master的修改要想push到origin/master分支上,是不能實現的。因為當前有兩個倉庫,遠端倉庫的使用者在origin/master 分支上操作,而本地倉庫的使用者在 master 分支上操作。當本地倉庫的使用者試圖push修改的檔案到遠端倉庫的 origin/master 分支上時,相當於有兩個使用者同時對 origin/master 分支進行操作,這是 git 不允許的。

        解決方法:在遠端倉庫 testA 目錄下新建一個分支:git branch dev,(這個分支的名字任意)

        然後通過命令:git checkout dev

    把工作暫時切換到dev分支下,

        這時在本地倉庫 testB 目錄下執行:git push origin master

        還有最後一步,在 testA 目錄下執行:git checkout master   把工作切換回該分支,就可以檢視push更新了。

        該方法親測有用。

        注:

        1、要想實現push操作,有一步是必須的。在遠端倉庫testA的目錄下,修改.git檔案中的config檔案,在最後加上兩句,因為git預設會拒絕push操作。

        [receive]

        denyCurrentBranch = ignore

        2、本地倉庫向遠端倉庫push前,要保證和遠端倉庫版本的同步。所以最好先pull一下,以確保除自身修改內容外的檔案同步。

        2、實際操作中,一般將遠端倉庫的master作為主分支,不直接在其上進行修改,而是建立一個新的分支,在新的分支上修改測試完成之後,再把master和新的分支合併。這樣的好處是:如果出現什麼麻煩的錯誤,只要切換回master分支,檔案就恢復到了建立新分支時的狀態。

        3、這裡要說一下的是,網上查到解決該問題的方法,可以在此用"git init --bare"進行遠端倉庫的初始化,這樣該倉庫就是一個裸倉庫,實際上不存在working tree,就不會與本地倉庫產生衝突。但是這樣的後果就是該倉庫不能進行各種git操作。所以該方法我沒有嘗試。各位大神親測過的可以留言交流一下。

        個人的小見解,如有問題煩請指出。