2012-03-24 17 views
9

說我有一個工作樹和/或索引是「髒的」(即我有本地修改還沒有提交或隱藏),我試圖做一個「混帳拉」沒有第一次提交或積攢。 (或者,假設我正在引入一個新的團隊成員git和他們試圖運行「git pull」時他們的本地回購是「髒」。)我想知道做一個「 git拉「在這種情況下。如果不安全,可能發生的最糟糕的事情是什麼?如果我從一個可信賴的來源或不可信任的來源獲取信息,這有什麼關係?當我的工作樹和/或索引很髒時,「git pull」是否安全?

我的調查到目前爲止表明了一個混亂的想法,我認爲這是一個相當直接的問題。

首先,通過git-藏匿手冊頁使得它聽起來像git的拉動是非常安全的,如果你在一個情況下的東西可能出錯是將中止:

Pulling into a dirty tree 
     When you are in the middle of something, you learn that there are 
     upstream changes that are possibly relevant to what you are doing. 
     When your local changes do not conflict with the changes in the 
     upstream, a simple git pull will let you move forward. 

     However, there are cases in which your local changes do conflict 
     with the upstream changes, and git pull refuses to overwrite your 
     changes. In such a case, you can stash your changes away, perform a 
     pull, and then unstash, like this... 

這實際上似乎到目前爲止,我的簡單測試也是如此。

也可能暗示「git pull」非常安全,Visual Studio的Git Extensions工具欄有一個突出的拉按鈕,在對「git pull」進行脫殼之前不會檢查髒物。 (如果我設計的是Visual Studio工具欄,我會盡量避免讓自己在腳下拍攝變得特別容易。)

git-pull手冊頁不會讓我的「git pull」聽起來很危險,儘管它表明這不是一個最好的做法:

If any of the remote changes overlap with local uncommitted changes, 
    the merge will be automatically cancelled and the work tree untouched. 
    It is generally best to get any local changes in working order before 
    pulling or stash them away with git-stash(1). 

但你也可以找到建議,揪成髒是非常糟糕的,e.g.

Avoid git-pull! 
git-pull should never get invoked if you have dirty files lying around or if your branch is ahead of master. 
This will always lead to some dirty artifacts in the commit history 

有沒有一個簡單的答案哪個角度看是最好的,或者這在某種程度上是個案的事情?

跟進:使用「git pull --rebase」而不是「git pull」會改變答案嗎?在某些情況下,重新激活可能有它的ownpitfalls,但到目前爲止,我的猜測是,有一個髒的工作樹/索引不會使rebase更難以處理。

回答

5

維護Apache DeltaSpike項目的人沒有冒犯,但我相信Git手冊頁上關於Git關於Delta Spike wiki內容的評論。

還要注意的是,在引用的文本(重點煤礦):

git-pull不應該得到,如果你有不潔的文件躺在附近或者如果你的分支是提前掌握的調用。這總是會導致提交歷史中的一些髒文物。

「提交歷史記錄中的髒文物」是Git合併提交。這發生在你合併分支的任何時候,而不是重新分配另一分支的內容。這些合併提交是否「髒」取決於您的項目,您的組織以及它的意見和政策。

無論如何,git-pull從來都不是危險的操作。如文件所述,它不會破壞您的任何歷史記錄或正在進行的工作。

+1

來自wiki的聲明是奇怪的:本地修改將從不**導致提交歷史中的「工件」。 – Cascabel 2012-03-25 06:06:27

+0

@Jefromi:的確如此。這就是爲什麼我把重點放在後一部分(如果有必要,它會自動創建提交)。 – 2012-03-25 16:19:51

+0

我在DeltaSpike的Wiki中看不到這樣的評論。 – 2012-04-13 20:35:56

3

根據我的經驗,這絕對安全(我使用git約4年)。如果您有無限制的更改,通常只是告訴您工作副本很髒。

1

git pull就是簡單的git fetch + rebase/merge,自動合併會產生噪音或意想不到的結果。 (噪聲的例子:你不需要需要 10次合併提交時,你所做的只是將一行添加到同一個文件10次。)如果未初始化只是簡單地執行git pull並且未經檢查地推回,則噪聲將被檢入。

我只想說,新的團隊成員更容易迷失方向後,一個髒工作樹拉,不管它是否安全,它將取決於響應(檢查結果每次拉後都會是一個好的開始)。

0
git fetch 

然後合併,重定位或重置取決於從服務器獲取的內容。你可以使用拉,它不會摧毀正在進行的工作。然而,前一種方法是優選的。

1

到目前爲止,我不知道這其實事關混帳拉(這聽起來像它預先檢測是否有可能合併衝突和中止如果有可能),但注意至少切線是合併(即做git合併)到一個骯髒的工作樹可以顯然限制你的能力,以「撤消」合併的情況下,合併變糟糕。特別是,從git的合併手冊頁:

[merge] --abort 
     Abort the current conflict resolution process, and try to 
     reconstruct the pre-merge state. 

     If there were uncommitted worktree changes present when the merge 
     started, git merge --abort will in some cases be unable to 
     reconstruct these changes. It is therefore recommended to always 
     commit or stash your changes before running git merge. 
0

場景A:

如果拉承諾會在你的工作樹的未提交的修改衝突,那麼混帳會中止和使您免於使您的回購混亂。

方案B:

如果拉承諾將在您的回購與提交衝突,你也有你的工作樹那會不會衝突提交的修改,然後你最後你的手會一團糟。您必須解決衝突並提交,而不會失去拖動之前工作樹中的更改。

在Git中引入新的團隊成員之後,情景B有時會出現。新成員對我的團隊的一個常見錯誤是無意中/疏忽地改變了我們網絡驅動器回購站中的文件,而不是像他們應該的本地克隆一樣,而且他們也忘記提交這些更改!除此之外,保護自己免受團隊犯錯的一種方法是:首先總是先拉到一個乾淨的當地回購協議,處理當地的任何衝突,然後從當地的回購協議拖到您與您分享的回購協議球隊。這個額外的步驟可以防止場景B,並且使得該樹對您而言透明,或者在最壞的情況下向場景A呈現。謝天謝地,場景A可以作爲正常衝突處理,而不會出現場景B的頭痛。

相關問題