Я читав, що під час перейменування файлів у 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?
git mv old new
автоматично оновлює індекс. Якщо ви перейменовуєтесь за межами Git, вам доведеться виконати git add new
та git rm old
провести зміни в індексі. Після цього git status
ви працюєте так, як ви очікуєте.
public_html
dir, які відслідковуються в git. Виконавши git add .
і git commit
, він все ще показав купу 'видалених' файлів у git status
. Я виконав git commit -a
і видалення було зроблено, але тепер я не маю історії з файлами, які public_html
зараз живуть . Цей робочий потік не такий гладкий, як хотілося б.
add+rm
абоmv
- він дасть такий же результат. Потім Git використовує своє перейменування / виявлення копії, щоб повідомити, що це перейменування. Джерело, яке ви цитували, теж неточне. Це насправді не має значення, ви змінюєте + перейменувати в одному і тому ж комітеті чи ні. Якщо ви зробите різницю як для зміни, так і для перейменування, виявлення перейменування буде бачити це як перейменування + модифікація, або якщо модифікація є загальним перезаписом, вона відображатиметься як додана та видалена - все одно не важливо, як ви виконали це.