Я читал, что при переименовании файлов в git вы должны зафиксировать любые изменения, выполнить ваше переименование и затем поставить переименованный файл. Git распознает файл по содержимому, а не видит его как новый неотслеживаемый файл, и сохраняет историю изменений.
Тем не менее, занимаясь этим вечером, я вернулся к этому git mv
.
> $ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
Переименуйте мою таблицу стилей в Finder из iphone.css
вmobile.css
> $ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted: css/iphone.css
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# css/mobile.css
Теперь git думает, что я удалил один файл CSS и добавил новый. Не то, что я хочу, давайте отменим переименование и позвольте git делать всю работу.
> $ git reset HEAD .
Unstaged changes after reset:
M css/iphone.css
M index.html
Вернуться туда, где я начал.
> $ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
Давайте использовать git mv
вместо.
> $ git mv css/iphone.css css/mobile.css
> $ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# renamed: css/iphone.css -> css/mobile.css
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: index.html
#
Похоже, у нас все хорошо. Так почему же git не узнал переименование в первый раз, когда я использовал Finder?
add+rm
илиmv
- он дает тот же результат. Затем Git использует обнаружение переименования / копирования, чтобы вы знали, что это было переименование. Источник, который вы указали, тоже неточный. Это действительно не имеет значения, измените ли вы + переименовать в том же коммите или нет. Когда вы выполняете различие между изменением и переименованием, обнаружение переименования будет видеть его как изменение переименования +, или, если изменение будет полностью переписано, оно будет отображаться как добавленное и удаленное - все равно не имеет значения, как вы выполнили Это.git mv old new
автоматически обновляет индекс. Когда вы переименуете за пределы Git, вам придется выполнитьgit add new
иgit rm old
внести изменения в индекс. Как только вы это сделаете, всеgit status
будет работать так, как вы ожидаете.public_html
каталог, которые отслеживаются в git. Выполнивgit add .
иgit commit
, он все еще показал кучу «удаленных» файлов вgit status
. Я выполнил,git commit -a
и удаления были зафиксированы, но теперь у меня нет истории файлов, которые живутpublic_html
сейчас. Этот рабочий процесс не так гладко, как хотелось бы.Ответы:
Для страничного руководства говорит
git mv
Итак, сначала вы должны обновить индекс самостоятельно (используя
git add mobile.css
). Однакоgit status
все равно покажет два разных файлаВы можете получить другой результат, запустив
git commit --dry-run -a
, что приведет к тому, что вы ожидаете:Я не могу точно сказать , почему мы видим эти различия между
git status
иgit commit --dry-run -a
, но вот подсказка от Linus :A
dry-run
использует реальные механизмы переименования, а,git status
вероятно, нет.источник
git add mobile.css
. Без негоgit status -a
только «увидели бы» удаление ранее отслеженногоiphone.css
файла, но не затронули бы новый неотслеживаемыйmobile.css
файл. Такжеgit status -a
недействителен с Git 1.7.0 и новее. «« Git status »больше не« git commit --dry-run ».» в kernel.org/pub/software/scm/git/docs/RelNotes-1.7.0.txt . Используйте,git commit --dry-run -a
если вы хотите эту функциональность. Как уже говорили другие, просто обновите индекс иgit status
будете работать так, как ожидает ОП.git commit
он не будет фиксировать переименованный файл, а рабочее дерево останется прежним.git commit -a
побеждает практически все аспекты модели рабочего процесса / мышления git - каждое изменение совершается. Что делать, если вы хотите переименовать файл, но внести измененияindex.html
в другой коммит?mobile.css
что я должен был упомянуть. Но в этом суть моего ответа: страница руководства говорит, чтоthe index is updated
когда вы используетеgit-mv
. Спасибо заstatus -a
разъяснение, я использовал git 1.6.4git status
не обнаружил переименование. Запускgit commit -a --dry-run
после добавления моих «новых» файлов показал переименования и, наконец, вселил в меня уверенность в фиксации!git status
теперь ведет себя какgit commit
.Вы должны добавить два измененных файла в индекс, прежде чем git распознает его как ход.
Единственная разница между
mv old new
иgit mv old new
заключается в том, что git mv также добавляет файлы в индекс.mv old new
тогдаgit add -A
бы тоже сработало.Обратите внимание, что вы не можете просто использовать,
git add .
потому что это не добавляет удаления в индекс.Смотрите разницу между "git add -A" и "git add".
источник
git add -A
ссылку, очень полезно, так как я искал такой ярлык!git add .
это добавить абсорбцию в индекс.Лучше всего попробовать это для себя.
Теперь git status и git commit --dry-run -a показывают два разных результата, где git status показывает bbb.txt как новый файл / aaa.txt, а команды --dry-run показывают фактическое переименование.
Теперь идите и сделайте регистрацию.
Теперь вы можете видеть, что файл фактически переименован, а то, что показано в git status, неверно.
Мораль истории: если вы не уверены, был ли ваш файл переименован, введите команду «git commit --dry-run -a». Если он показывает, что файл переименован, вы можете идти.
источник
Для git 1.7.x у меня работали следующие команды:
Не было необходимости в git add, так как исходный файл (т.е. css / mobile.css) уже был в подтвержденных файлах ранее.
источник
у вас есть
git add css/mobile.css
новый файл иgit rm css/iphone.css
, таким образом, git знает об этом. тогда он покажет тот же результат вgit status
Вы можете ясно увидеть это в выводе статуса (новое имя файла):
и (старое имя):
я думаю, что за кулисами
git mv
есть не что иное, как скрипт-обертка, который делает именно это: удаляет файл из индекса и добавляет его под другим именемисточник
git rm css/iphone.css
потому что я думал, что это удалит существующую историю. Может быть, я неправильно понимаю рабочий процесс в git.git rm
не удалит историю. Он только удаляет запись из индекса, чтобы следующая фиксация не имела записи. Однако, это все еще будет существовать в наследственных коммитах. Что вас может смущать, так это то, что (например)git log -- new
вы остановитесь в том месте, где вы совершили ошибкуgit mv old new
. Если вы хотите следовать переименованиям, используйтеgit log --follow -- new
.Давайте подумаем о ваших файлах с точки зрения git.
Ваш репозиторий имеет (среди прочих)
и это под контролем git:
Проверьте это с:
Когда вы делаете
С точки зрения мерзавца,
Итак, git сообщает о файлах, которые он уже знает ( iphone.css ), и о новых файлах, которые он обнаруживает ( mobile.css ), но только когда файлы находятся в индексе или HEAD, git начинает проверять их содержимое.
На данный момент, ни «iphone.css удаление» , ни mobile.css являются по индексу.
Добавить удаление iphone.css в индекс
Git точно скажет вам, что произошло: ( iphone.css удален. Больше ничего не произошло)
затем добавьте новый файл mobile.css
На этот раз и удаление, и новый файл находятся в индексе. Теперь git обнаруживает тот же контекст и выставляет его как переименованный. Фактически, если файлы похожи на 50%, он обнаружит это как переименование, что позволит вам немного изменить mobile.css , сохранив операцию как переименование.
Смотрите, это воспроизводимо на
git diff
. Теперь, когда ваши файлы в индексе, вы должны использовать--cached
. Немного отредактируйте mobile.css , добавьте это в индекс и увидите разницу между:а также
-M
это опция "обнаружить переименования" дляgit diff
.-M
расшифровывается как-M50%
(сходство 50% и более заставит git выразить его как переименование), но вы можете уменьшить его до-M20%
(20%), если много редактируете mobile.css.источник
Шаг 1: переименуйте файл из старого файла в новый файл
Шаг 2: сделать коммит и добавить комментарии
Шаг 3: перенесите это изменение на удаленный сервер
источник
git mv
этого новый файл уже находится в индексе.Вот где ты ошибся.
Только после добавления файла git распознает его по содержимому.
источник
Вы не ставили результаты своего поиска. Я полагаю, что если вы сделали перемещение через Finder, а затем сделали это
git add css/mobile.css ; git rm css/iphone.css
, git вычислил бы хэш нового файла и только тогда понял бы, что хэши файлов совпадают (и, следовательно, это переименование).источник
В случаях, когда вам действительно нужно переименовать файлы вручную, например. используя скрипт для пакетного переименования группы файлов, затем
git add -A .
сработал для меня.источник
Для пользователей XCode: если вы переименуете свой файл в XCode, вы увидите, что значок значка изменится на добавление. Если вы делаете коммит с использованием XCode, вы фактически создаете новый файл и теряете историю.
Обойти это легко, но вы должны сделать это перед фиксацией с помощью Xcode:
переименован: Project / OldName.h -> Project / NewName.h переименован: Project / OldName.m -> Project / NewName.m
Затем вернитесь в XCode, и вы увидите, что значок изменился с A на M, и теперь он сохраняет изменения, чтобы зафиксировать изменения при использовании xcode.
источник