Получение Git, чтобы следовать переименованным и отредактированным файлам

Вопросы по переименованию файлов в Gitиметь было спросил раньше, но я могуне могу решить мою конкретную проблему.

Я переместил и отредактировал несколько файлов (я нет использоватьgit mv - к сожалению этосейчас слишком поздно для этого). Теперь я хочу, чтобы, когда мой коллега извлекал из моего хранилища, сделав свои правки в те же файлы (не перемещая их), он успешно объединяет мои изменения с его в файле ».новое местоположение. Чтобы успешно слить, Git явно должен знать, что это одни и те же файлы.

Git достаточно умен, чтобы решить это самостоятельно? В это трудно поверить. И если да, то как я могу быть уверен, что Git подберет тот или иной файл, даже если его содержимое изменилось?

 Robin Winslow08 окт. 2012 г., 17:57
Хорошо, но как мне сказать GIT, что файлимеет переехал? Я переместил файлы в Visual Studio, теперь я хочу убедиться, что Git знает. Я старалсяgit mv --cached но это нене существует. Когда я пытаюсьgit mv я получилfatal: bad source, source= ...
 ezod08 окт. 2012 г., 17:55
Это цель.git mv
 Edward Thomson08 окт. 2012 г., 18:10
Git действительно достаточно умен, чтобы решить это самостоятельно. Переименование - это просто добавление и удаление в хранилище, независимо от того, используете ли выgit mv или нет.
 Robin Winslow08 окт. 2012 г., 18:02
Хорошо, я могу это сделать, но этоЭто раздражает, потому что я должен воссоздать целые структуры каталогов. Это кажется глупым мерзавцем не иметь--cached эквивалент для этого.
 ezod08 окт. 2012 г., 18:02
Если у вас нетВы можете просто переместить файлы обратно в их исходные пути, а затемgit mv их на новые пути.

Ответы на вопрос(3)

git diff не понимал, что яd переименованные файлыа также изменил их содержание. Мой сценарий состоял в том, что у меня были файлы A, B, C и вставлен новый B, поэтому старый B теперь был C, а старый C теперь D.git diff говорил мне, что B и C теперь совершенно разные!

Решение, которое я использовал, было утомительным и ручным, но оно сделало свою работу.

Переименовал файлы обратно, как мог. То есть От B до Bnew, от C до B, от D до C.Сделал diff, чтобы проверить без ошибок.Совершил это.Используемыйgit mv назвать файлы обратно их новым именам. От B до C, от C до D.Совершил это.Сделали другие переименования и зафиксировали их как новые файлы. То есть До б.

когда между коммитами был удален файл - там:Нет необходимости говорить это вручную. Если вы действительно перемещаете файл (с помощью git mv, а не удаляете его вручную и снова добавляете), он игнорирует подсказку. Из соображений производительности эвристика нене запускать все время - если вы переместите файл с пути, а затем добавите новый с исходным именем, перемещение может быть не обнаружено.

Обратите внимание, что по логике git хранит только дерево, существующее в каждой ревизии:хранить любая информация отслеживания изменений, внесенных между ревизиями.

Если вы хотите увидеть, чтоОбнаружено, вы можете использовать (-M--find-renames) переключиться наgit diff показывать переименования. Этот переключатель также включает эвристику, которая полезна, если выу нас есть коммит, который нене вызвать их.

Этот эвристический подход является хорошей причиной (если вам нужен другой), чтобы коммиты оставались небольшими и самодостаточными, так как это делает git 'Работать легче.

Решение Вопроса

используется эвристический алгоритм, чтобы определить, переименовали ли вы файл в другой. То есть если выgit mv файл, а затем заменить содержимое полностью, этоне считается переименованием, и вы делаетене нужно использоватьgit mv для того, чтобы обнаружить переименования.

Например:

% mv d.txt e.txt
% git rm d.txt
rm 'd.txt'
% git add e.txt
% git commit -m"rename without git mv"
[master f70ae76] rename without git mv
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename d.txt => e.txt (100%)
% git diff --summary --find-renames HEAD~1 HEAD
 rename d.txt => e.txt (100%)

Так же,git mv Безразлично»t означает, что файл будет переименован, он все равно будет использовать алгоритм diff:

% git mv e.txt f.txt
% echo "Completely replacing f.txt" > f.txt
% git add f.txt
% git commit -m"git mv doesn't help here"
[master 068d19c] git mv doesn't help here
 2 files changed, 1 insertion(+), 14 deletions(-)
 delete mode 100644 e.txt
 create mode 100644 f.txt
% git diff --summary --find-renames HEAD~1 HEAD
 delete mode 100644 e.txt
 create mode 100644 f.txt

Ваш ответ на вопрос