Подтвердить что ты не робот

Git файл stash и pop пока не помечен как перемещенный?

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 и заменить новое содержимое файла.

4b9b3361

Ответ 1

Если вы еще не нажали ваш кошелек, выполните:

git stash pop --index

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

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

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

git rm --cached file1

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

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

Ответ 2

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

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

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

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

Обратите внимание, что это означает, что на практике вам не нужно беспокоиться: когда вы должным образом ставите все, что готово для совершения (например, с git add -u), "проблема" заботится о себе.