2010-10-30 62 views
12

我完全愛git add -pgit stash但我偶爾有以下問題,這是由下面的命令序列重放:git的藏匿和編輯大塊

  • git add -p my_file:然後我編輯大塊手動(使用e),因爲那混帳表明分裂不適合我
  • git stash --keep-index:然後我做了一些測試,如果測試通過我不承諾
  • git stash pop:現在出現問題:文件my_file現在被認爲是爲衝突,和git已經完全與我的編輯大塊搞砸,所以我必須編輯這個文件,刪除無用的合併標記,並運行之後git reset HEAD
  • git add my_file

我很困惑,因爲這隻有在手動編輯大塊時纔會發生。我不明白這應該如何改變。


要重現該問題:

  • touch newfile
  • git add newfile
  • git commit -m 'newfile'
  • 文件
  • git add -p newfile
  • 編輯的H中添加兩行UNK(e),除去在大塊線之一,然後退出GIT中添加(q
  • git stash --keep-index
  • git stash pop

現在文件newfile處於未合併狀態。再次請注意,問題僅出現在手動編輯的區塊中。如果不手動編輯任何大塊,上述命令無任何問題。

順便說一下,文件的前一狀態處於第三階段(git show :3:newfile),並且以前的階段版本處於第二階段(git show :2:newfile)。所以我可以通過一些git黑魔法設法將第二階段放在這個索引中,並且在工作回購的第三階段......但我不知道該怎麼做,所以我親自動手做。 :-(

+0

我嘗試了幾次,但我無法用git 1.7.2.3版重現您的問題。你使用什麼版本? – 2010-10-31 15:46:00

+0

我在Mac OS X上使用1.7.3.1版本。 – 2010-10-31 19:16:56

+1

在'git add -p'中嘗試了不同的隨機編輯 - 並且它對我來說總是正常工作。順便說一句,我在Linux上。聽起來像一個錯誤 - 我會建議在git郵件列表上詢問,它們相當敏感。 – 2010-10-31 20:28:33

回答

4

我在git郵件列表中提出了問題,我描述的是預期的行爲,它不是一個錯誤。:-(

這裏是我得到了答案:

如果您沒有手動編輯大塊,大塊每會無論是在 元首或狀態,塗敷頭之間的差異和A到 這樣的文件內容可能是空操作(大塊已應用),或 全成應用程序。

對我來說這是git add --patch嚴重的限制,我不這樣何種方式瞭解行爲可能對任何人都有用,但我會學習和它一起生活。

+1

看起來問題在於,當您執行「git stash --keep-index」時,它會同時存儲暫存的和未暫存的更改,唯一的區別是它會保留工作副本中的暫存更改。當你嘗試應用隱藏時,暫存的更改都會在工作副本和存儲中導致衝突。在他們回答的非編輯好的情況下,它會記住工作副本中存在哪些區塊,哪些區塊不存在並且不會應用曾經存在的避免合併衝突。對於編輯過的部分,只有部分應用了它,但它無法實現。 – axk 2011-10-14 08:45:07

2

git stash --keep-index保留您的指標,但它仍然增加了索引內容藏匿的一部分

嘗試git stash save -p - 比較繁瑣一點,以節省藏匿,但可能會做你想要什麼。

+0

這是如何解釋,當我有一個手動編輯的塊時,git認爲只有**衝突**? – 2010-10-31 05:18:03

+0

因爲你的git存儲流行時你的索引不匹配。 – Scott 2010-11-01 02:25:04

+0

@斯科特:對不起,我不明白你的答案......: - /爲什麼只有當手動編輯的塊時纔有衝突? – 2010-11-01 07:17:33

7

來創建和測試包含的工作樹改變,包括手動編輯帥哥部分索引,這樣做:

git add --patch <files> 

git stash --keep-index 

<test the indexed changes> 

git reset --hard 

git stash pop --index 

在這一點上不存在衝突,並且存儲庫,索引和工作目錄是在緊接着git stash之前的狀態中。您現在可以通過git commit索引更改。

當然,這很奇怪,不是很直觀,我真的很想知道是否有更簡單的方法來做到這一點。

+0

+1,這個工程。我自己也找到了同樣的解決方案,但錯過了 - 索引開關。考慮到它存儲了索引和未分離的更改,這是一種合理的方式,以避免工作副本中暫存的更改與隱藏的更改之間的合併衝突,必須首先從工作副本中刪除這些更改(即,硬重置)。 – axk 2011-10-14 09:05:21

+0

謝謝!現在把它吸引到magit中... – seanmcl 2013-12-30 22:42:41