2011-12-13 1 views
27
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 теряет переименованные отношения после приставки/поп-музыки. Есть ли способ восстановить эти отношения или сообщить, что файлы были перемещены? Я часто задерживаю, чтобы узнать, как мое состояние системы похоже на предварительные изменения, но потерять отношения переименования - проблема для меня. Я не знаю, как исправить это, кроме как удалить новый файл, снова выполнить git mv и заменить содержимое нового файла.git stash и файл поп-шоу больше не помечены как перемещенные?

+1

Примечания: что горе uld будет интересно попробовать это снова с Git 2.12 (Q1 2017). См. Http: // stackoverflow.com/a/41307892/6309 – VonC

ответ

26

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

git stash pop --index 

Это правильно сохраняет переехал (но не совершал) файл отношения в притон. По git help stash:

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

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

git rm --cached file1 

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

Используйте эту опцию, чтобы убрать из буфера и удалить путь только из индекса

+2

Я не знаю, лучше ли это, чем @Jefromi's –

+2

'git stash pop -index' лучше, если вы запомните это в первый раз. Но если вы ранее забыли указать индекс, 'git rm --cached file1' вернет вас туда, где file2 переименовывается независимо. –

+0

Это немного annyoing. Почему у git всегда есть эти маленькие недостатки, которые кажутся вам просто для того, чтобы вас поймать !? – Steve

18

Короткий ответ: 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), «проблема» заботится о себе.

 Смежные вопросы

  • Нет связанных вопросов^_^