Коли я роблю a git diff
або a git log -p
, як отримати номери рядків вихідних файлів, вбудованих у вихідні дані?
Я спробував це знайти man git-diff | grep "line numbers"
і спробував погуглити, але нічого не отримав швидко.
Відповіді:
git diff
На даний момент не існує жодних варіантів, щоб номери рядків відображалися вертикально збоку git diff
.
Ця інформація доступна у заголовках (c) для кожного зміни різниці, однак вона лише у форматі unified-diff :
@@ -start,count +start,count @@
Вихідний стан файлу представлений символом -
, а новий стан представлений символом +
(вони не означають доповнення та видалення в заголовку Hunk. start
Представляє номер початкового рядка кожної версії файлу та count
кількість строк, які включені , починаючи з початкової точки.
diff --git a/osx/.gitconfig b/osx/.gitconfig
index 4fd8f04..fcd220c 100644
--- a/osx/.gitconfig
+++ b/osx/.gitconfig
@@ -11,7 +11,7 @@ <== HERE!
[color "branch"]
upstream = cyan
[color "diff"]
- meta = yellow
+ meta = cyan
plain = white dim
old = red bold
new = green bold
Верхній колонтитул
@@ -11,7 +11,7 @@
говорить, що попередня версія файлу починається з рядка 11 і включає 7 рядків:
11 [color "branch"]
12 upstream = cyan
13 [color "diff"]
14 - meta = yellow
14 + meta = cyan
15 plain = white dim
16 old = red bold
17 new = green bold
тоді як наступна версія файлу також починається з рядка 11, а також включає 7 рядків.
Як ви, напевно, можете зрозуміти, формат unified-diff не дозволяє легко з’ясувати номери рядків (принаймні, якщо ви не машина). Якщо вам дійсно потрібні номери рядків, які ви можете прочитати, вам потрібно буде використовувати інший інструмент, який відображатиме їх вам.
--unified=0
або -U0
.
git diffn
, випадаюча заміна (обгортка), git diff
яка показує номери рядків і має повну сумісність з усіма способами використання та опціями git diff
: stackoverflow.com/questions/24455377/…
Ось ще два рішення, які розширюються на коді Енді Талковського.
Простий текст:
git diff | gawk 'match($0,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
/^(---|\+\+\+|[^-+ ])/{print;next};\
{line=substr($0,2)};\
/^-/{print "-" left++ ":" line;next};\
/^[+]/{print "+" right++ ":" line;next};\
{print "(" left++ "," right++ "):"line}'
Кольоровий текст, припускаючи, що \033[66m
це формат для кольорових кодів:
git diff --color=always | \
gawk '{bare=$0;gsub("\033[[][0-9]*m","",bare)};\
match(bare,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
bare ~ /^(---|\+\+\+|[^-+ ])/{print;next};\
{line=gensub("^(\033[[][0-9]*m)?(.)","\\2\\1",1,$0)};\
bare~/^-/{print "-"left++ ":" line;next};\
bare~/^[+]/{print "+"right++ ":" line;next};\
{print "("left++","right++"):"line;next}'
Код змінює рядки, які починаються з -
і +
до -1:-
і +1:+
, відповідно, і рядки, які починаються з ні до чого
(5,6):
. Цифри - це номери рядків із відповідного файлу.
git diff
ретельно підтримує вирівнювання. Цей код зараз у мене над головою, тож чи готові ви його виправити? Іншими словами, коли один рядок говорить, +240:+
а наступний рядок говорить (241,257):
, вам потрібно додати додаткові пробіли до верхнього рядка, щоб його код підтримував належне вирівнювання та відступ до коду з нижнього рядка. Можливо, це легко можна зробити за допомогою друку?
printf
.
git diffn
. Дивіться тут: stackoverflow.com/a/61997003/4561887 . Дякую @PFudd, за вашу відповідь. Я вивчив його і використовував для навчання, потім почав з нуля і писав git diffn
. Після форматування, щоб я міг прочитати ваш код (дякую @EdMorton), я зміг навчитися з нього деяких чудових речей, які мені допомогли.
Ось сценарій, який намагається це виправити - не перевіряв його в гніві, але, здається, це нормально. Він покладається на записи, які створює git diff, і використовує awk для підтримки підрахунку рядків.
# Massage the @@ counts so they are usable
function prep1() {
cat | awk -F',' 'BEGIN { convert = 0; }
/^@@ / { convert=1; }
/^/ { if ( convert == 1 ) { print $1,$2,$3;
} else { print $0;
}
convert=0;
}'
}
# Extract all new changes added with the line count
function prep2() {
cat | awk 'BEGIN { display=0; line=0; left=0; out=1;}
/^@@ / { out=0; inc=0; line=$4; line--; display=line; left=line; }
/^[-]/ { left++; display=left; inc=0; }
/^[+]/ { line++; display=line; inc=0; }
/^[-+][-+][-+] / { out=0; inc=0; }
/^/ {
line += inc;
left += inc;
display += inc;
if ( out == 1 ) {
print display,$0;
} else {
print $0;
}
out = 1;
inc = 1;
display = line;
}'
}
git diff $1 | prep1 | prep2
Ви можете використовувати git difftool
різницю із зовнішнім редактором, який відображатиме номери рядків. Ось як це зробити за допомогою vim / vimdiff:
Встановити vimdiff як git's difftool:
git config --global diff.tool vimdiff
Налаштуйте ~/.vimrc
автоматичне відображення номерів рядків під час використання vimdiff:
if &diff
set number
endif
Запустіть git difftool, який використовуватиме vimdiff з номерами рядків:
git difftool
Швидкий спосіб - використовувати git diff -U0
. Це встановить для рядків контексту значення 0, що змусить значення @@ відповідати фактично зміненим рядкам. За замовчуванням значення @@ включають 3 рядки контексту до / після, що не зручно для людей.
Приклад:
git diff # default
@@ -10,8 +10,8 @@
Важко обчислити номери рядків змінених рядків, оскільки рядок 10 відноситься до першого рядка попереднього контексту. Фактичний номер рядка першого зміненого рядка становить 10 + 3 = 13. Щоб обчислити кількість змінених рядків, вам слід також відняти контекст до і після: 8-3-3 = 2.
git diff -U0
@@ -13,2 +13,2 @@
Як бачите, встановлення context = 0 полегшує читання значень @@ для людей. Ви бачите, що змінені рядки починаються з рядка 13, а є 2 змінені рядки.
Це не ідеально, оскільки відображає лише номер рядка для кожного блоку. Якщо ви хочете бачити номери рядків для кожного рядка, використовуйте difftool для зовнішнього редактора. Див. Https://stackoverflow.com/a/50049752
Я хотів би використовувати git difftool
з Meld як мій difftool. Це легше розглянути, ніж git diff
, має приємне паралельне порівняння графічного інтерфейсу та показує номери рядків на кожній стороні.
Я щойно писав git diffn
протягом останніх кількох днів, щоб замінити їх git diff
у командному рядку. Спробуй. Іншу мою відповідь див . Тут .
Починаючи з 24 травня 2020 року, тепер ви можете використовувати для цього сторонній інструмент git diffn
(повне розкриття інформації: я це написав). Це легка обгортка навколо git diff
, написана awk
мовою програмування на основі шаблону / дії. Ось зразок результату запуску git diffn
:
Ось демонстрація:
git diffn
:Створити цей файл:
hello_world.c:
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
Здійснити:
git add hello_world.c
git commit -m "add hello_world.c"
Змініть його на це і збережіть файл:
hello_world.c:
// Basic hello world example
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello Gabriel\n");
int i = 700;
printf("i = %i\n", i);
return 0;
}
Тепер запустіть:
git diff
Ось результат git diff
першого для цілей порівняння:
$ git diff
diff --git a/hello_world.c b/hello_world.c
index e01704a..e971b73 100644
--- a/hello_world.c
+++ b/hello_world.c
@@ -1,8 +1,12 @@
+// Basic hello world example
+
#include <stdio.h>
-int main()
+int main(int argc, char *argv[])
{
- printf("Hello World\n");
-
+ printf("Hello Gabriel\n");
+
+ int i = 700;
+ printf("i = %i\n", i);
return 0;
-}
\ No newline at end of file
+}
І скріншот, щоб показати колір. Зверніть увагу, що виділений червоним кольором розділ просто показує порожні пробіли (у цьому випадку пробіли), які можна видалити:
Тепер ось результат git diffn
. Зауважте, що всі номери рядків чудово відображаються!
-
на крайньому лівому І праворуч від екрана відображається знак, :
який допоможе вам краще бачити - чи подобається вашим очам сканувати праворуч від товстої кишки або вниз на дальньому ліворуч від екрана.+
знак у крайньому лівому куті І праворуч від :
.,
.Вихідні дані git diffn
:
$ git diffn
diff --git a/hello_world.c b/hello_world.c
index e01704a..e971b73 100644
--- a/hello_world.c
+++ b/hello_world.c
@@ -1,8 +1,12 @@
+ 1:+// Basic hello world example
+ 2:+
1, 3: #include <stdio.h>
2, 4:
- 3 :-int main()
+ 5:+int main(int argc, char *argv[])
4, 6: {
- 5 :- printf("Hello World\n");
- 6 :-
+ 7:+ printf("Hello Gabriel\n");
+ 8:+
+ 9:+ int i = 700;
+ 10:+ printf("i = %i\n", i);
7, 11: return 0;
- 8 :-}
\ No newline at end of file
+ 12:+}
І скріншот, щоб показати колір. Зверніть увагу, що двокрапки НЕ кольорові та стилізовані, щоб відповідати навколишньому тексту зліва та праворуч. Це навмисна та розроблена поведінка, яка діє як візуальний роздільник між номерами рядків, доданими ліворуч, та вихідним git diff
виведенням праворуч.
З верхньої частиниgit-diffn.sh
:
ОПИС:
git-diffn.sh
випадаюча заміна, git diff
яка також відображає рядки 'n'umbers! Використовуйте саме такgit diff
, за винятком того, що ви також побачите ці прекрасні номери рядків, щоб допомогти вам зрозуміти свої зміни.
оскільки це просто легка обгортка на основі мови awk git diff
, вона приймає ВСІ параметри та параметри, які git diff
приймає. Приклади:
git diffn HEAD~
git diffn HEAD~3..HEAD~2
працює з будь-яким із ваших git diff
налаштувань кольору, навіть якщо ви використовуєте власні кольори
Подивіться тут мою відповідь про те, як встановити власні кольори різниці, а також побачити скріншот виводу користувацького кольору з git diffn
: Як ви налаштовуєте колір заголовка різниці в git diff?
Ось кілька зразків git config
команд з моєї відповіді вище, щоб встановити власні git diff
кольори та атрибути (форматування тексту):
git config --global color.diff.meta "blue"
git config --global color.diff.old "black red strike"
git config --global color.diff.new "black green italic"
git config --global color.diff.context "yellow bold"
в git diffn
, кольоровий вихід за замовчуванням увімкнено; якщо ви хочете відключити вихідний колір, ви повинні використовувати --no-color
або --color=never
. Детальніше man git diff
див. Приклади:
git diffn --color=never HEAD~
git diffn --no-color HEAD~3..HEAD~2
gawk
. Якщо це так, спробуйте це : brew install gawk
.Варіант 1 (моя рекомендація): завантажте весь репо, а потім створіть символічне посилання на програму, щоб ви могли легко отримувати оновлення, виконуючиgit pull
з репо, коли завгодно.
По-перше, cd
туди, де ви хочете встановити це. Потім запустіть:
git clone https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
cd eRCaGuy_dotfiles/useful_scripts
mkdir -p ~/bin
ln -si "${PWD}/git-diffn.sh" ~/bin/git-diffn
Готово! Тепер просто зробіть останній крок нижче!
Варіант 2 (для тих, хто просто хоче файл 1): завантажте один раз лише один файл.
mkdir -p ~/bin
cd ~/bin
wget https://raw.githubusercontent.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/master/useful_scripts/git-diffn.sh
chmod +x git-diffn.sh
mv git-diffn.sh git-diffn
Готово! Тепер просто зробіть останній крок нижче!
Заключний крок:
Тепер закрийте і знову відкрийте термінал або перезавантажте його за допомогою . ~/.bashrc
, і все готово!
git diffn
тепер працюватиме як точна заміна git diff
!
Ви можете спробувати
git blame
на файлі. Він показує вам комітер, ідентифікатор коміту та номер рядка для кожного рядка у файлі.
git blame
просто покаже поточний стан файлу з номерами рядків.
git blame
жодним чином не відповідає на питання; Я досить збентежений прихильниками тут
git diff --unified=0 | grep -Po '^\+\+\+ ./\K.*|^@@ -[0-9]+(,[0-9]+)? \+\K[0-9]+(,[0-9]+)?(?= @@)'