2010-04-19 93 views
26

可能重複:
git push error '[remote rejected] master -> master (branch is currently checked out)'Git的基本工作流程

我是新來的Git,並試圖將它用於本地Grails項目。
步驟我跟着:

  1. 創建Grails項目
  2. 進入項目目錄和git init
  3. 添加的所有文件在項目中臨時區域和提交。
  4. 在回購的git的狀態給出了以下消息

    [email protected] /c/Work/Grails/projects/yyy/tables (master) 
    $ git status 
    # On branch master 
    nothing to commit (working directory clean) 
    
  5. 試圖保持它作爲主分支,通過克隆回購進行更改,後來又推又變回。爲此

  6. 在我的IDE中,簽出項目(IntelliJ)。這實際上是將項目克隆到另一個目錄。
  7. 進行更改並提交項目
  8. 將本地更改推送到主站。

    15:41:56.249: git push -v origin master 
    Pushing to c:/Work/Grails/projects/xxx/tables 
    remote: error: refusing to update checked out branch: refs/heads/master   
    remote: error: By default, updating the current branch in a non-bare repository   
    remote: error: is denied, because it will make the index and work tree inconsistent   
    remote: error: with what you pushed, and will require 'git reset --hard' to match   
    remote: error: the work tree to HEAD. 
    

克隆回購狀態

$ git status 
# On branch master 
# Your branch is ahead of 'origin/master' by 1 commit. 
# 
nothing to commit (working directory clean) 

請幫我理解這一點。是否有更好的工作流程要遵循。我可以通過Intellij初始化回購,並嘗試在主分支上工作。仍然不確定上面有什麼錯。

謝謝。

+0

只需推入不同的分支,然後合併它:'git push origin master:foo'。 – kenorb 2015-09-30 15:32:51

回答

33

首先,你不需要克隆你的本地倉庫。您可以使用分支來將開發劃分到同一個存儲庫中。

Git是一個分佈式VCS,如果您在Subversion或CVS之前有過使用經驗,那麼您需要改變主意。

Git非常敏捷,您可以使用不同的工作流程。克隆庫是團隊工作更需要的,而不是本地開發(恕我直言)。

分支是一個很好的選擇。

參見。讓我們設置主人您的存儲庫分支爲生產就緒代碼。讓我們創建另一個分支爲發展

$ git checkout -b development master 

現在你在發展分公司工作。

您可以針對每個要開發的功能使用不同的分支。這非常簡單和有用。

讓你想實現一些新的功能,我們想象一下,你需要創建一個新的分支:

$ git checkout -b newfeature development 

現在你可以用你的代碼工作,添加文件,提交等。

接下來你需要合併新開發的功能將發展分支:

$ git add . 
$ git commit -m "My last changes for the new feature" 
$ git checkout development 
$ git merge newfeature 

現在從newfeature分支新的代碼合併到發展分支。

爲了在以後的某個時候,當你決定你在發展分支代碼得到一些里程碑,你可以從發展分支合併所有更改。

這是一個非常基本的工作流程,它可以爲許多分支機構提供幫助。

我現在建議你:閱讀更多關於git,分支,存儲(對於快速修復非常非常有幫助)。過了一段時間,你將會使用git獲得很大的努力。

祝你好運。

+0

非常感謝您爲您提供的分步答案..您絕對正確,我仍然認爲傳統的SCM模式。我之前只使用過ClearCase和Microsoft SourceSafe ......所以,你可以想象一下:-) ...你的回答幫助我把許多概念放在一起,讀到git ..非常感謝... – bsr 2010-04-19 21:07:23

45

問題是,您嘗試推送到非裸回購。非裸回購是一個有關聯的工作樹(即,文件實際簽出到磁盤)。默認情況下,Git不會讓你推到非裸回購;推到一個非裸回購只會更新Git的內部數據結構,改變工作樹(磁盤上的文件),這意味着如果你回到你推回來的回購,並開始處理文件,你將在這些文件的舊版本上工作。當然,這會在您嘗試提交更改時導致問題。

做到這一點,最好的辦法就是推到倉庫,這是一個通過傳遞--bare標誌創建創建回購時到Git:

$ mkdir new_repo 
$ cd new_repo 
$ git --bare init 

當然,裸回購韓元沒有檢出任何文件,所以你實際上無法使用它(你必須先克隆它)。

如果您只是使用Git回購進行本地開發(而不是共享或提供Git回購),您不需要有一個遠程回購推送;您可以在本地非裸回購的單一副本上工作。

+0

非常感謝你的詳細回覆..我實實在在地閱讀了關於類似問題的一些答案。我可能會按照您的建議使用一個本地回購,然後在需要時克隆。不過,是否有可能我簽入(提交)第一個(主)回購,然後嘗試推出克隆的回購。我很好奇如何有人可以克隆我的回購,並在後期階段推送給主。我非常感謝你的評論,所以我不會長期感到後悔。再次感謝 – bsr 2010-04-19 21:00:32

+0

注意:有一種情況下推送到非裸露的回購可以是適當的:http://stackoverflow.com/a/10731806/ 6309 – VonC 2012-05-24 05:49:04

10

這是一個成功的git工作流程的最清晰,最全面的描述。它基本涵蓋了Sergey提出的建議,並增加了一些非常有用的圖形。當您合併包括--no-ff標籤保持的事實,你有一個歷史的特性分支記錄

A successful Git branching model

筆者還建議。

+0

感謝Jason .. – bsr 2010-05-10 20:12:10

3

我試圖解決同樣的問題時,在這裏結束了,好在有一個更好的答案在那裏:

Git push error '[remote rejected] master -> master (branch is currently checked out)'

你應該檢查一出。尤其是因爲在這種情況下很容易結束。對我來說,我所做的只是創建一個目錄,然後通過git來創建我的新「共享存儲庫」。它在USB上,因爲我們的網絡完全被鎖定,我們無法共享目錄或訪問GitHub。

然後我將我們的所有源代碼複製到該目錄中,添加它,提交它,然後將生成的存儲庫克隆到我的本地驅動器,以便現在可以將其作爲我的起源。我想我以後可以讓GitHub遠程控制並取消共享的USB存儲庫。但是,我在本地驅動器上進行的首次更改並嘗試推送到遠程(密鑰存儲庫),因爲密鑰存儲庫不是「裸露的」,所以向我發送了消息。所有的原始文件仍然存在。

請參閱鏈接到問題的評分最高的答案,看看該怎麼做。要點是你在共享庫中設置一個標誌,以便它認爲它是空的,然後刪除除.git子目錄之外的所有內容,然後你的推送就可以工作。

+0

感謝回答所問的問題。其他的答案充滿了有用的git知識,但你的我超過了我的眼前的問題。 – 2012-05-22 08:25:33