git stash и pop show файл больше не помечен как перемещенный? - PullRequest
34 голосов
/ 13 декабря 2011
git mv file1 file2

git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    file1 -> file2

git stash
git stash pop

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   file2
#
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    file1

Как видите, git теряет переименованное отношение после stash / pop.Есть ли способ восстановить эти отношения, или тайник знает, что файлы были перемещены?Я часто прячусь, чтобы увидеть, как выглядит состояние моей системы перед изменениями, но потерять отношение переименования - проблема для меня.Я не знаю, как это исправить, кроме удаления нового файла, повторного выполнения git mv и замены содержимого нового файла.

Ответы [ 2 ]

37 голосов
/ 14 декабря 2011

Если вы еще не набрали свой тайник, сделайте:

git stash pop --index

Это правильно сохраняет перемещенные (но не зафиксированные) отношения файлов в тайнике. Согласно git help stash:

Если используется опция --index, то пытается восстановить не только изменения рабочего дерева, но и изменения индекса. Однако это может не сработать, если у вас есть конфликты (которые хранятся в индексе, и поэтому вы больше не можете применять изменения, как они были изначально).

Если вы уже подняли свой тайник и хотите восстановить перемещенные отношения, выполните:

git rm --cached file1

Это удаляет «старый» неподвижный файл из индекса:

Используйте эту опцию для удаления и удаления путей только из индекса

20 голосов
/ 14 декабря 2011

Краткий ответ: git rm --cached file1

Все, что действительно делает git mv, это переименовывает файл (в файловой системе), а затем добавляет удаление и создание файла в индекс (промежуточная область).Это специально не отмечено.Другие механизмы впоследствии понимают, что это было переименование, видя, что содержимое, которое раньше называлось file1, теперь называется file2.

Поскольку команды git stash изменяют индекс, они могут нарушать работу.Обратите внимание, что теперь у вас есть этап создания, но не удаление!(Обычно git-stash оставляет все без обработки после всплывающего окна, но в этом случае я думаю, что у него нет особого выбора, кроме как поместить новый файл в индекс, чтобы вы не знали, какой из них сохранить. Вы можете избежать этогокогда-либо происходило с git stash pop --index, но это взрывает, если спрятанные изменения не могут быть применены корректно, поэтому это не по умолчанию.) git status больше не может отображать это как переименование, потому что переименование эффективно разделено междуиндекс и рабочее дерево, и ни один из разделов не может требовать его полностью.

Просто запустите git rm --cached file1, чтобы выполнить удаление (т. е. удалить файл1 из индекса), и оно снова будет отображаться как переименование.Вы также можете запустить git add -u для автоматического добавления изменений, если у вас нет других изменений, которые вы не хотите ставить.

Обратите внимание, что на практике вам не нужно беспокоиться:когда вы все правильно готовите для фиксации (например, с помощью git add -u), «проблема» решает сама себя.

...