2010-02-06 61 views
3

我想我說的都對。將工作樹更新到Git的HEAD

我已經有了一個Git登臺服務器,我的朋友和我從我們當地的repo回覆中推送了對Git repo的更改,當我們準備公開某些內容時,我們標記爲'all那麼,但我必須做一個git reset --hard來更新服務器上的實際文件到HEAD,這對我來說似乎有點奇怪。

我認爲這個問題可能是對git工作原理的基本誤解。通常,我將我的代碼分支到本地回購庫,處理它,然後將其合併到主回購庫,然後git push,這是正確的嗎?

對不起,當談到git,我是一個新手,任何與遠程git回購工作的資源將不勝感激,謝謝!

回答

7

這聽起來像是你推動到服務器上的非裸回購。當您推入回購協議時,回購協議的內部狀態會發生變化,但簽出的文件不會更新,這就是爲什麼您必須執行git reset --hard(或git checkout)來檢出更新的文件副本。由於這個原因,建議只推動裸露的回購。您可以使用git --bare initgit clone --bare創建裸回購。

+1

這也許會變得有用。光禿的回購是我沒有真正看過的東西。這會給我一個項目的「git」部分嗎?我猜我會保留在我的登臺服務器上的裸回購並克隆它以獲取文件「出」它呢? – Zack 2010-02-07 03:12:43

+1

是的 - 裸露的回購包含Git跟蹤的信息,但沒有簽出文件副本。一般來說,您應該在服務器上放置一個裸副本並推送到該服務器。 – mipadi 2010-02-07 04:26:46

+0

請參閱'git push「後,爲什麼我看不到遠程回購中的更改?在Git FAQ頁面中:http://git.wiki.kernel.org/index.php/GitFaq#Why_won.27t_I_see_changes_in_the_remote_repo_after_.22git_push.22.3F – 2010-02-07 10:23:51

1

我不完全理解你的問題,但我可以推薦你this workflow這對我們的團隊非常有用。在this other post中,您會發現腳本來自動化它,但是我發現最好在開始時運行完整的git命令,以便將流程內部化。

另外,this resource關於託管的儲存庫和gitosis是非常好的。這個實用的鏈接,加上讀一本關於git的書,對我們能夠快速採用git非常有用。

+0

我相信這是 - 只是 - 我正在尋找,謝謝! – Zack 2010-02-06 22:24:11

2

扎克,

我認爲問題是,你的遙控器是不是一個純倉庫(即,它已與它相關的工作樹)。你應該永不推入一個非裸倉庫,因爲這會更新索引/緩存,但不是工作樹。當您運行「git reset --hard」時,(非裸)存儲庫工作樹只會正確更新,因爲此命令會更改工作樹狀態以反映上次提交的狀態,即您剛剛推送的提交。

遠程倉庫應與「--bare」標誌被創建,也就是說,你應該通過調用創建回購:

$ git的初始化--bare

,然後就可以正確地將你推變成它。

我描述了使用多個存儲庫here的開發工作流程,同時我在文章的第二部分提供了腳本/別名/提示。

+0

感謝您的支持,它幫助我獲得了當前的解決方案 – Zack 2010-02-08 19:22:17