Відповіді:
Вам потрібно використовувати -M, щоб дозволити git автоматично виявляти переміщений файл при різництві. Використовувати так само, git diff
як згадуваний трикотаж, для мене не працює.
Так просто: git diff -M
слід це робити.
Документація для цього перемикача:
-M[<n>], --find-renames[=<n>]
Detect renames. If n is specified, it is a threshold on the similarity index
(i.e. amount of addition/deletions compared to the file’s size). For example,
-M90% means git should consider a delete/add pair to be a rename if more than
90% of the file hasn’t changed.
~/.gitconfig
?
git diff
. Запуск git diff -M
у одному (перейменованому) файлі не повідомляє про перейменування.
git log --follow -- file_after_move.txt
працює добре. Він показує всю історію, в тому числі перед переїздом. Будь-які ідеї? Я бігаю git version 2.11.0.windows.1
.
-C
Варіант для виявлення копій є корисним і подібним. Я використовував це -M
для розгляду різниці, де я відновив один файл на два (при цьому жодне ім'я не відповідає оригіналу).
Окрім того, що написав трикотаж , ви завжди можете використовувати:
git diff HEAD:./oldfilename newfilename
де HEAD:./oldfilename
означає старе ім'я файлу в останньому коміті (в HEAD), відносно поточного каталогу.
Якщо у вас немає достатньо нового git, вам доведеться використовувати замість цього:
git diff HEAD:path/to/oldfilename newfilename
git diff 39fa7c77e85c51d43ea0cf30d33aec8721812e9e:./oldfilename newfilename
git diff branch:old/filen.name newfilename
cd
в каталог і не додаєте --
перед commit:path
парою. Git, здається, дуже вибагливий із синтаксисом.
<commit-ish>:<pathname>
Синтаксис - це ідентифікатор об'єкта, щось Git-ish; після того, як --
Git очікує лише імена файлів.
З git 2.9 (червень 2016 року) вам більше не доведеться додавати -M
. git diff
використовує -M
за замовчуванням.
Див. Команду 5404c11 , фіксування 9501d19 , фіксування a9276a6 , фіксування f07fc9e , здійснення 62df1e6 (25 лютого 2016 р.) Матьє Моя ( moy
) .
(Об’єднав Хуніо С Хамано - gitster
- у комітеті 5d2a30d , 03 квітня 2016 р.)
diff
: активуєтьсяdiff.renames
за замовчуваннямВиявлення перейменування - дуже зручна функція, і нові користувачі не повинні копати документацію, щоб отримати користь від неї.
Потенційні заперечення щодо активації виявлення перейменування полягають у тому, що воно іноді виходить з ладу, а іноді повільно. Але виявлення перейменування вже активовано за замовчуванням у кількох випадках, таких як "
git status
" і "git merge
", тому активаціяdiff.renames
принципово не змінює ситуацію. Якщо виявлення перейменування не вдається, тепер воно послідовно не працює між "git diff
" і "git status
".Цей параметр не впливає на сантехнічні команди, отже, добре написані сценарії не вплинуть.
git diff -M
активує виявлення перейменування, як уже говорили інші (і як зазначав @VonC, воно активовано за замовчуванням з git 2.9). Але якщо у вас великий набір змін, точне виявлення перейменування все одно може знову вимкнутись. Git відображатиме попередження на зразок наступного, яке легко пропустити серед розгляду, який ви переглядаєте:
warning: inexact rename detection was skipped due to too many files.
warning: you may want to set your diff.renameLimit variable to at least 450 and retry the command.
У цьому випадку встановіть варіант конфігурації, як, наприклад, пропонує git
git config diff.renamelimit 450
і перезапустіть свою команду diff.
З будь-якої причини використання HEAD:./oldfilename
(або абсолютний шлях) не працювало для мене, але все- HEAD:oldfilename
таки (спасибі cmn):
git diff HEAD:oldfilename newfilename
git diff 2a80f45:oldfilename f65f3b3:newfilename
HTH
HEAD:./oldfilename
?
просто запустіть git diff
без жодних аргументів, або git diff -- newfilename
. git досить розумний для порівняння потрібних файлів / вмісту (тобто оригінальний вміст перед перейменуванням та змінений вміст після перейменування)
git mv
використати один файл, а потім порівнювати поетапний стан з іншою ідентичною гілкою, ви отримаєте різницю, "якщо все було видалено та відтворено заново", якщо тільки не -M
буде використано.
git diff -- yourRenamedFile
буде достатньо простого . Дивіться мою відповідь нижче