Як переглянути файл diff у git перед фіксацією


443

Це часто трапляється зі мною:

Я працюю над парою пов’язаних змін одночасно протягом дня-двох, і коли прийшов час зробити зобов’язання, я в кінцевому рахунку забуваю, що змінилося в конкретному файлі. (Це лише особисте репортаж з git, тому я добре з тим, що в комітеті є більше одного оновлення.)

Чи є спосіб попереднього перегляду змін між моїм локальним файлом, який зараз має бути зареєстрований, та останньою командою для цього файлу?

Щось на зразок:

git diff --changed /myfile.txt

І було б надруковано щось на кшталт:

line 23
  (last commit): var = 2+2
  (current):     var = myfunction() + 2

line 149
  (last commit): return var
  (current):     return var / 7

Таким чином, я міг швидко побачити, що я робив у тому файлі з моменту останньої реєстрації.

Відповіді:


732

Якщо ви хочете побачити те, що ви ще не git addредагували:

git diff myfile.txt

або якщо ви хочете побачити вже додані зміни

git diff --cached myfile.txt

20
перевірити git add -p. Переглядайте кожну зміну, вибірково затверджуйте зміни на сцені, переривайте в будь-який час, якщо передумаєте, і навіть впорядкуйте редагувати шматок. Я ніколи git addбез цього.
Кайл Бейкер

2
як можна вийти з файлу?
Кіт Бутовський

3
@Kick Спробуйте натиснутиq
wjandrea

також, якщо ви хочете видалити дурні префікси 'a /' та 'b /' у розрізненні, ви можете встановити git config --global diff.noprefix true.
Лян

64
git diff HEAD file

покаже вам зміни, які ви додали до свого робочого дерева з останньої версії. Будуть показані всі зміни (поетапні чи не поетапні).


1
Ваше рішення працює. Але я трохи розгублений. HEAD вказує на останній номер комісії. Отже, коли ми додаємо git, індекс робочого каталогу оновлюється, а не HEAD. Отже, як це показує різницю.
Mav55

17

Щоб перевірити місцеві відмінності:

git diff myfile.txt

або ви можете скористатися різним інструментом (якщо ви хочете відновити деякі зміни):

git difftool myfile.txt

Щоб git difftoolефективніше використовувати , встановіть і використовуйте улюблений інструмент GUI, такий як Meld, DiffMerge або OpenDiff.

Примітка. Ви також можете використовувати .(замість імені файлу), щоб переглянути поточні зміни в режимі dir.

Щоб перевірити зміни в кожному рядку, використовуйте: git blameкотрий буде відображати, який рядок було зафіксовано в якій комісії.


Щоб переглянути фактичний файл перед фіксацією (де masterваша філія), запустіть:

git show master:path/my_file

15

Ви спробували -v(або --verbose) варіант для git commit? Це додає відмінності комітів у редакторі повідомлень.


Хороша відповідь. Це може надати інформацію в редакторі комісій, змушує мене робити легше. Чи є спосіб закрити інформаційну область, Changes not staged for commit:яка може зробити редактор комісій більш чистим.
Radian Jheng

15

Ще одна методика, яку слід врахувати, якщо ви хочете порівняти файл із останнім коміттом, який є більш педантичним:

git diff master myfile.txt

Перевагою цієї методики є те, що ви також можете порівняти передостаннє завдання з:

git diff master^ myfile.txt

і той перед цим:

git diff master^^ myfile.txt

Крім того, ви можете замінити '~' символом карети '^' і 'ви назва гілки' на 'майстер', якщо ви не знаходитесь на головній гілці.


14

Я думаю, що це ідеальний випадок використання, який вимагає GUI. - Хоча я повністю розумію, що це також можна досягти досить добре в командному рядку.

Особисто кожне моє вчинення я виконую з git-gui. У якому я можу зробити декілька атомних команд з окремими елементами / лініями, якщо це має сенс зробити.

Gut Gui дозволяє переглядати відмінності в добре відформатованому кольоровому інтерфейсі, досить легкий. Схоже, це теж варто оформити замовлення.


Я згоден - це також дозволяє вам редагувати повідомлення про фіксацію, переглядаючи розл.
Франсуа

Добре знати, але я хотів би дотримуватися CLI. Я використав кілька пакунків, які були в ньому, але я перейшов до строго терміналу / vim для свого робочого процесу. Спасибі, хоча.
Соус Макбос

Так, якщо ви дотримуєтесь графічного інтерфейсу, є дуже багато цікавих функцій, таких git bisectяк насправді недоступні.
NoBugs

2
Я погоджуюсь - Є багато варіантів, для яких набагато швидше і має сенс використовувати командний рядок. Однак попередній перегляд змін не є однією з них.
VitalyB

Існують також текстові інтерфейси користувача, які працюють у терміналі. Варто перевірити tig"інтерфейс текстового режиму для Git".
smido

10

На macOS перейдіть до кореневої директорії git та введіть git diff *


Так, це так, я просто перевірив це. У вас встановлений git? Будь-які повідомлення про помилки? Можливо, щодо цього можна задати нове запитання.
катанора

4

Найкращий спосіб, який я знайшов, окрім використання виділеного графічного інтерфейсу для фіксації, - це використання git difftool -d- Це відкриває ваш інструмент "diff" у режимі порівняння каталогів, порівнюючи HEAD з поточною брудною папкою.


саме те, що мені було потрібно. Спасибі
Іван Феррер Вілла

3
git difftool -d HEAD filename.txt

Це показує порівняння за допомогою вікна VI щілини в терміналі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.