git stash и отредактированные куски - PullRequest
12 голосов
/ 30 октября 2010

Я полностью люблю git add -p и git stash, но иногда у меня возникает следующая проблема, которая воспроизводится следующей последовательностью команд:

  • git add -p my_file: тогда я редактирую кусок вручную (используя e), потому что разделение, которое предлагает git, меня не устраивает
  • git stash --keep-index: тогда я провожу некоторое тестирование, и если тесты пройдут , я не фиксирую
  • git stash pop: теперь проблема возникает: файл my_file теперь считается конфликтующим , и git полностью испортил мой отредактированный кусок, поэтому мне нужно отредактировать файл, удалить ненужный объединить метки и запустить git add my_file, а затем git reset HEAD

Я озадачен, потому что это происходит только при редактировании фрагмента вручную. Я не понимаю, как это вообще должно иметь значение.


Чтобы воспроизвести проблему:

  • touch newfile
  • git add newfile
  • git commit -m 'newfile'
  • добавить две строки в файл
  • git add -p newfile
  • редактировать блок (e), удалить одну из строк в блоке, затем выйти из git add (q)
  • git stash --keep-index
  • git stash pop

Теперь файл newfile находится в открытом состоянии. Обратите внимание, опять же, что проблема возникает только с отредактированными вручную ханками . Нет никаких проблем с приведенными выше командами, если вы не редактируете никакой ханк вручную.

Кстати, предыдущее состояние файла находится на третьем этапе (git show :3:newfile), а ранее подготовленная версия находится на втором этапе (git show :2:newfile). Таким образом, я мог бы с помощью некоторой мерзкой черной магии поставить второй этап в этом индексе и третий этап в рабочем репо ... но я не знаю, как это сделать, поэтому я делаю это вручную. : - (

Ответы [ 3 ]

7 голосов
/ 14 марта 2011

Чтобы создать и протестировать индекс, содержащий часть изменений рабочего дерева, включая отредактированные вручную фрагменты, выполните:

git add --patch <files>

git stash --keep-index

<test the indexed changes>

git reset --hard

git stash pop --index

На этом этапе нет конфликтов, а также хранилище, индекс и рабочий каталог.находятся в состоянии, непосредственно предшествующем git stash.Теперь вы можете git commit проиндексировать изменения.

Конечно, это довольно странно и не очень интуитивно понятно, и мне бы очень хотелось узнать, есть ли более простой способ сделать это.

4 голосов
/ 03 ноября 2010

Я задал вопрос в списке рассылки git. То, что я описываю, это ожидаемое поведение. Это не ошибка. : - (

Вот ответ, который я получил:

Если вы не редактировали блок вручную, каждый блок будет либо в состояние HEAD или в состоянии A, и применение различий между HEAD и A для такой файл будет либо неоперативным (блок уже применен), либо успешное применение.

Для меня это серьезное ограничение git add --patch, и я не понимаю, каким образом это поведение может быть полезным для любого, но я научусь жить с этим.

2 голосов
/ 31 октября 2010

git stash --keep-index сохраняет ваш индекс, но все равно добавляет содержимое индекса как часть тайника.

Попробуйте git stash save -p - немного утомительнее сохранить тайник, но, вероятно, будет делать то, что выхочу.

...