2013-06-28 72 views
0

我的項目在服務器上有一個裸回購安裝。我目前在分支0.9/develop。我合併了0.9/develop與另一個開發人員正在開發的分支。事實證明,這將是方式更多的工作來解決他的代碼,而不是完全消除他的變化。不幸的是,在合併之後我已經運行了git push origin 0.9/develop,並且將這些更改提交給我的開發和臨時服務器(是的,我很笨)。我的git回購有多嚴重?

我一直在經歷一系列類似的問題,但沒有一個似乎涵蓋了我的確切案例。這一個是特別有用的:How to revert Git repository to a previous commit?

使用從這個問題的信息,我能夠成功地抹殺最後一次提交的項目。具體來說,我做了一個git reset --hard f6c84a0,在我將其他開發者的n00bery合併到我的詩歌之前,它成功地將我的本地存儲庫重置爲提交權。

好的,太好了。現在我只需要修復光禿禿的回購。所以我試了git push --force origin 0.9/develop。不幸的是,我丟失了服務器發送回來的特定消息,但這是沿着「成功」的方向,並且它表明遠程repo已更新爲提交f6c84a0。

當我試圖ssh到服務器,然後去我登臺環境和運行git pull,反應是:

From /home/ben/web/example 
+ 77d54e4...f6c84a0 0.9/develop -> origin/0.9/develop (forced update) 
Already up-to-date. 

然而,當我從臨時服務器跑了git log,所有的合併提交仍在0.9/develop分支上。我嘗試了一些東西,比如git pull --force,但是我不能讓糟糕的承諾消失。

好,很好。有不止一種方法來剝皮貓。我清理了臨時服務器,並做了一個新的git clone --recursive --no-hardlinks example.git stage.example.com,並運行了一些必要的安裝腳本來完成一些小的服務器維護工作。

現在我不能回到我的0.9/develop branch。在過去,我只是跑git checkout 0.9/develop,但如果我現在就試試,我得到這樣的:

Branch 0.9/develop set up to track remote branch 0.9/develop from origin. 
Switched to a new branch '0.9/develop' 

等待......什麼? 0.9/develop不是一個新的分支。從這個問題與信息工作:How to clone all remote branches in Git?我做了git branch -a,得到了以下幾點:

* 0.9/develop 
    master 
    remotes/origin/0.8/develop 
    remotes/origin/0.8/master 
    remotes/origin/0.9/develop 
    remotes/origin/HEAD -> origin/master 
    remotes/origin/category-address 
    remotes/origin/jaminimaj 
    remotes/origin/master 
    remotes/origin/permissions 
    remotes/origin/ticket-duration 
    remotes/origin/timzone-support 

我又試圖git checkout origin/0.9/develop,但我得到了以下信息:

Note: checking out 'origin/0.9/develop'. 

You are in 'detached HEAD' state. You can look around, make experimental 
changes and commit them, and you can discard any commits you make in this 
state without impacting any branches by performing another checkout. 

If you want to create a new branch to retain commits you create, you may 
do so (now or later) by using -b with the checkout command again. Example: 

    git checkout -b new_branch_name 

HEAD is now at f6c84a0... bugfix: revert email helper 

好了,好消息是臨時服務器現在有適當的代碼庫,但我處於分離的HEAD狀態。我意識到,我可能在這裏錯過了一些非常不重要的事情,但它肯定會讓我的週五晚上變得糟糕。我怎樣才能讓我的臨時服務器HEAD指向0.9/develop的HEAD?另外,我想在我的開發環境中做同樣的事情,但我寧願以適當的方式執行,而不是擦除整個服務器並重新開始。我可以這麼做嗎,還是隻能通過從repo重建服務器來暴力破解?感謝大家的幫助!

+1

這不是一個錯誤......它是你想要的......它是一個新的本地分支......只是基於遠程分支:「分支0.9 /開發設置爲跟蹤遠程分支0.9 /開發從原產地。 切換到一個新的分支'0.9/develop'' –

+0

你問關於[改變光禿禿的回購活動分支](http://stackoverflow.com/questions/3301956/git-correct-way-to-change-主動分支在-A-裸庫)? –

+0

@MattCooper它可能不是一個錯誤,但它不是我想要的。我不想要一個新的本地分支。我想要裸回購的'0.9/develop'分支。 –

回答

3

消息

Branch 0.9/develop set up to track remote branch 0.9/develop from origin. 
Switched to a new branch '0.9/develop' 

意味着:

  • 混帳創建了一個名爲0.9的新的分支指針/開發點到原點的當前頭/ 0.9 /開發
  • 這個分支指針具有自動生成的配置設置來跟蹤遠程分支,以便git pull和git push按預期工作。

所以它做它應該做的。這只是有點反直覺,基本上與分支機構一起工作,您需要在克隆的存儲庫中使用本地分支。每當您運行git pull時,它都會與遠程分支合併。

順便說一句,在跟蹤分行的git拉相當於

git fetch 
git merge remotes/origin/0.9/develop 
+0

感謝您的解釋。但是爲什麼'git'告訴我我處於detatched HEAD狀態? –

+1

因爲你做了'git checkout origin/0.9/develop'。檢查遠程分支頭指向的提交,但沒有給你一個你可以提交的本地分支,什麼git調用分離的HEAD狀態。 – confusopoly

+0

太棒了。謝謝。還有一個問題。我可以修復我的開發環境而不擦除它並重新克隆?我猜我只需要'變身'? –

0

也許是你的根本問題是answered here

後像您這樣的客戶端操作必須重置回幾次提交,再次拉,如他們的回購在強制推動之前。

如果你碰巧聽不到,別擔心只是checkout a 本地分支。如果您在直接散列,標籤或遠程分支上使用結帳,或者在某些操作的中間使用結賬,它很容易發生。這意味着你目前沒有分支。

您可以通過

git checkout origin/0.9/develop 

目前還不清楚是否丟失了當地的分支機構或沒有得到它。使用git branch來查看您是否有0.9/develop,如果是,請檢出。如果不是,請啓動git gui並使用創建分支菜單從追蹤分支創建它。

+5

不能贏得所以我猜。提供詳細信息並稱爲「囉嗦」。不要提供細節並獲得「提供細節」。無論哪種方式,都可以獲得「親密的關係」 - 無論這些都是。 –

+0

在答案中看到編輯 –

0

聽起來好像您需要檢查裸露回購中的分支並使用git reset將其重置回您想要的位置。或者,您可以在當地回購當地分公司git resetgit push -f它。在升級回購中,您必須像在正常工作回購中那樣執行git reset