LINUX.ORG.RU

Почему в Git один и тот же комммит показывает разные изменения?

 ,


0

3

Что-то я затупил. Имею репозитарий:

git clone https://invent.kde.org/utilities/konsole.git

Нахожу в нем следующий коммит, который содержит изменение для файла /src/Profile.cpp:
commit 9ea9d62785193ec06a8f37090dd6e7940626e1b8
Author: Jekyll Wu <adaptee@gmail.com>
Date:   Mon Oct 10 16:23:22 2011 +0800

    Reimplement the feature of "show/hide the size widget after resising"
    
    This is a follow up of commit b40a006d which closees BUG 169054.
    It turns out the old code already has most parts of similar logic.
    So remove duplicated logic in the code.

diff --git a/src/Profile.cpp b/src/Profile.cpp
index 06ef51960..d9706d17b 100644
--- a/src/Profile.cpp
+++ b/src/Profile.cpp
@@ -76,7 +76,7 @@ const Profile::PropertyInfo Profile::DefaultPropertyNames[] =
...skipping...
+    , { BoldIntense, "BoldIntense", APPEARANCE_GROUP, QVariant::Bool }

     // Keyboard
     , { KeyBindings , "KeyBindings" , KEYBOARD_GROUP , QVariant::String }
@@ -179,6 +180,7 @@ FallbackProfile::FallbackProfile()

     setProperty(DefaultEncoding,QString(QTextCodec::codecForLocale()->name()));
     setProperty(AntiAliasFonts,true);
+    setProperty(BoldIntense,true);

     // default taken from KDE 3
     setProperty(WordCharacters,":@-./_~?&=%+#");

Я переключаюсь на него:
git checkout 9ea9d62785193ec06a8f37090dd6e7940626e1b8

И снова смотрю изменения файла /src/Profile.cpp для этого же коммита:
commit 9ea9d62785193ec06a8f37090dd6e7940626e1b8 (HEAD)
Author: Jekyll Wu <adaptee@gmail.com>
Date:   Mon Oct 10 16:23:22 2011 +0800

    Reimplement the feature of "show/hide the size widget after resising"

    This is a follow up of commit b40a006d which closees BUG 169054.
    It turns out the old code already has most parts of similar logic.
    So remove duplicated logic in the code.

diff --git a/src/Profile.cpp b/src/Profile.cpp
index 06ef51960..d9706d17b 100644
--- a/src/Profile.cpp
+++ b/src/Profile.cpp
@@ -76,7 +76,7 @@ const Profile::PropertyInfo Profile::DefaultPropertyNames[] =
     , { LocalTabTitleFormat , "tabtitle" , 0 , QVariant::String }
     , { RemoteTabTitleFormat , "RemoteTabTitleFormat" , GENERAL_GROUP , QVariant::String }
     , { ShowMenuBar , "ShowMenuBar" , GENERAL_GROUP , QVariant::Bool }
-    , { ShowSizeWidget , "ShowSizeWidget" , GENERAL_GROUP , QVariant::Bool }
+    , { ShowTerminalSizeHint , "ShowTerminalSizeHint" , GENERAL_GROUP , QVariant::Bool }
     , { SaveGeometryOnExit , "SaveGeometryOnExit" , GENERAL_GROUP , QVariant::Bool }
     , { TabBarMode , "TabBarMode" , GENERAL_GROUP , QVariant::Int }
     , { TabBarPosition , "TabBarPosition" , GENERAL_GROUP , QVariant::Int }
@@ -161,7 +161,7 @@ FallbackProfile::FallbackProfile()
     setProperty(TabBarPosition,TabBarBottom);
     setProperty(NewTabBehavior,PutNewTabAtTheEnd);
     setProperty(ShowMenuBar,true);
-    setProperty(ShowSizeWidget,true);
+    setProperty(ShowTerminalSizeHint,true);
     setProperty(SaveGeometryOnExit,true);
     setProperty(StartInCurrentSessionDir,true);
     setProperty(ShowNewAndCloseTabButtons,false);

И эти изменения совершенно другие. Хотя хеш и описание коммита - те же самые. Как так то? Какие изменения на самом деле были то?

★★★★★

Второй правильный

https://invent.kde.org/utilities/konsole/-/commit/9ea9d62785193ec06a8f37090dd6e7940626e1b8

«…skipping…» – это почерк /bin/more и /bin/less

P.S.: от more и less больше неудобств, чем пользы. Терминал должен быть достаточно мощным, чтобы справиться с огромным выводом, навигацией по нему и поиску.

kaldeon
()
Последнее исправление: kaldeon (всего исправлений: 3)
Ответ на: комментарий от anonymous

Ну да, всё, понимание чего тебе недоступно - шизофрения без смысла.

А так, подобное делает любой адекватный пользователь. Ты книжку по гиту-то почитай, а лучше референс.

anonymous
()
Ответ на: комментарий от urxvt

он вытаскивает коммит из истории ветки. и получает на выходе мусор а не консистентную ветку, внеся правки в которую никогда не сможет смержить

когда нормальные люди чекаутят ветку получают ее последнее состояние

anonymous
()
Ответ на: комментарий от anonymous
$ git merge --no-ff f8c3d5143
...
 7 files changed, 31 insertions(+), 39 deletions(-)
$ git hist
*   09ec418cd [urxvt urxvt] 2025-01-24 12:14:40 +0200 | Merge commit 'f8c3d5143' into bar (HEAD -> bar)
...



Ты глубоко заблуждаешься. Ветка это просто ссылка (метка, label, reference) на коммит. Разницы между ними примерно никакой.

urxvt ★★★★★
()
Ответ на: комментарий от anonymous

пук

что и следовало ожидать.

назови хоть одну причину выставать на коммит 5 летней давности?

а потом расскажи как ты изменив его будешь мержить это с head а я посмеюсь

anonymous
()
Ответ на: комментарий от kaldeon

«…skipping…» – это почерк /bin/more и /bin/less

Я не пойму, в каком месте был сделан этот skipping. Это в пределах одного коммита, или за строкой «…skipping…» скрывается несколько коммитов?

Похоже, что несколько. Блин, я не помню в какой момент этот skipping возник. Что же я делал, что git написал skipping?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от anonymous

назови хоть одну причину выставать на коммит 5 летней давности?

Регулярно это делаю. Даже больше — `git bisect` это тоже делает.
Сценарий простой и популярный — нашли ошибку, похоже, что внесли ее 5 лет назад коммитом deadbeef. Чтобы проверить сценарий простой:

$ git checkout deadbeef
$ make

urxvt ★★★★★
()
Ответ на: комментарий от anonymous

назови хоть одну причину выставать на коммит 5 летней давности?

а зачем мне система контроля версий (!!!) если я не могу в любой момент времени переключиться на версию какой угодно давности и посмотреть, как оно работало?

FishHook
()
Ответ на: комментарий от anonymous

пук

что и следовало ожидать.

Да, ты обгадился.

назови хоть одну причину выставать на коммит 5 летней давности?

Сборка кода 5 летней давности. А теперь оправдания.

а потом расскажи как ты изменив его будешь мержить это с head а я посмеюсь

Сколько ты готов поставить на это?

anonymous
()
Ответ на: комментарий от FishHook

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

а не рандомные коммиты

тут вообще есть работающие программисты или мамкины хеловодщики

anonymous
()

Ты в курсе, как работает diff и что с чем ты вообще сравниваешь?

git clone https://invent.kde.org/utilities/konsole.git

mv konsole/ commit
cp -r commit/ prev_commit

cd commit
git checkout 9ea9d62785193ec06a8f37090dd6e7940626e1b8

cd ..
cd prev_commit
git checkout 9ea9d62785193ec06a8f37090dd6e7940626e1b8
git log src/profile/Profile.cpp | less
git checkout 04ca6c2764e849e4422896d786b9689d74e3811b

cd ..
diff prev_commit/src/Profile.cpp commit/src/Profile.cpp 

вывод diff:

79c79
<     , { ShowSizeWidget , "ShowSizeWidget" , GENERAL_GROUP , QVariant::Bool }
---
>     , { ShowTerminalSizeHint , "ShowTerminalSizeHint" , GENERAL_GROUP , QVariant::Bool }
164c164
<     setProperty(ShowSizeWidget,true);
---
>     setProperty(ShowTerminalSizeHint,true);

Домашнее задание: прочитать man по diff, прочитать gitbook. Понять, что я делал. И что делал не так ты

router ★★★★★
()
Ответ на: комментарий от anonymous

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

ну хорошо, вот мы срезали релизную ветку, накатили её на прод. Поймали баг. Что дальше? Как мне прикажите дебажить то, если у меня нет возможности перейти к коммиту ДО релизной ветки?

FishHook
()
Ответ на: комментарий от anonymous

а потом расскажи как ты изменив его будешь мержить это с head а я посмеюсь

Зачем его куда-то мержить?

назови хоть одну причину выставать на коммит 5 летней давности?

  • изучение кода конкретной версии. Той, что в ветке дистрибутива, например
  • аудит
router ★★★★★
()
Ответ на: комментарий от urxvt

Ну и плюс мне так было проще искать, как именно переименовывались файлы (в master его уже нет). И другие способы поиска предыдущего коммита конкретного файла в голову не пришли

router ★★★★★
()
Ответ на: комментарий от EXL

Не Git, а твой пейджер, less.

Вот это сюрприз, оказывается less по-дефолту встроен в git. Никогда не замечал.

less «skips» line when you scroll up or down manually. Instead use up and down arrow keys from keyboard.

Что имеется в иду? Я не понимаю: 'less «пропускает» строки когда вы мотаете вверх или вниз вручную. Вместо этого используйте клавиши вверх и вниз на клавиатуре'.

Каким образом происходит мотание вверх и вниз вручную без клавиатуры? Мышкой что ли? В какой момент «пропуск» возникает?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от router

Ну и плюс мне так было проще искать, как именно переименовывались файлы (в master его уже нет)

Ну и плюс ты не прочитал гитбук, как сам выше советовал. А уже начал понтоваться. git show 9ea9d62785193ec06a8f37090dd6e7940626e1b8 -- src/Profile.cpp

anonymous
()
Ответ на: комментарий от router

Домашнее задание: прочитать man по diff, прочитать gitbook. Понять, что я делал. И что делал не так ты

Ты, походу, вообще не понял проблемы. Подсказка: вопрос не в git, diff, коммитах и прочей шелухе.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Вот это сюрприз, оказывается less по-дефолту встроен в git. Никогда не замечал.

Что значит по дефолту встроен в Git? Откуда такие умозаключения?

Git использует тот пейджер, который он нашёл у тебя в системе. Это может быть less, more, или что-то другое: PAGER=more git log, аналогично и с редактором для написания коммитов: EDITOR=vim git commit, EDITOR=nano git commit и т. д.

Каким образом происходит мотание вверх и вниз вручную без клавиатуры? Мышкой что ли? В какой момент «пропуск» возникает?

  1. На любом длинном коммите (чтобы появился scroll):
git show
  1. Далее Shift+G или End чтобы перейти в самый конец выхлопа.

  2. Далее Scroll Up колесом мышки и там будет этот твой

...skipping...
EXL ★★★★★
()
Ответ на: комментарий от router

Я имел в виду вот что: diff показывает разницу между ДВУМЯ файлами, а git показывает разницу между двумя КОММИТАМИ. В этом выхлопе есть и куски того что показывает diff, и куски заголовочной информации о промежуточных коммитах. Все это выводится через утилиту less, которую git находит по-умолчанию, хотя я раньше думал что это просто вызов vi с отключенным интерактивным режимом. Так вот эта утилита less при каких-то условиях укорачивает отображаемый текст. Видимо, есть какое-то пороговое значение размера текста, после которого less «сжирает» середину текста. Мне посчастливилось попасть именно в это меcто: вначале идет информация об одном коммите, а продолжается спустя сотни коммитов:

commit 9ea9d62785193ec06a8f37090dd6e7940626e1b8
Author: Jekyll Wu <adaptee@gmail.com>
Date:   Mon Oct 10 16:23:22 2011 +0800

    Reimplement the feature of "show/hide the size widget after resising"
    
    This is a follow up of commit b40a006d which closees BUG 169054.
    It turns out the old code already has most parts of similar logic.
    So remove duplicated logic in the code.

diff --git a/src/Profile.cpp b/src/Profile.cpp
index 06ef51960..d9706d17b 100644
--- a/src/Profile.cpp
+++ b/src/Profile.cpp
@@ -76,7 +76,7 @@ const Profile::PropertyInfo Profile::DefaultPropertyNames[] =
...skipping...
+    , { BoldIntense, "BoldIntense", APPEARANCE_GROUP, QVariant::Bool }

     // Keyboard
     , { KeyBindings , "KeyBindings" , KEYBOARD_GROUP , QVariant::String }
@@ -179,6 +180,7 @@ FallbackProfile::FallbackProfile()

     setProperty(DefaultEncoding,QString(QTextCodec::codecForLocale()->name()));
     setProperty(AntiAliasFonts,true);
+    setProperty(BoldIntense,true);

     // default taken from KDE 3
     setProperty(WordCharacters,":@-./_~?&=%+#");

Нижняя часть этого текста - это уже другой коммит, 253a5cc8249417d04fb395c803048686fda0f83c а не 9ea9d62785193ec06a8f37090dd6e7940626e1b8.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от EXL

Далее Scroll Up колесом мышки и там будет этот твой skipping

Понятно. И отключить это дело оказывается невозможно: «важно уточнить, что skipping — это поведение, возникающее из-за попыток утилиты обработать и показать большие объёмы данных быстрее. Полностью его „отключить“ невозможно в ситуациях, где системные ограничения слишком велики, например, медленный ввод/вывод или большие файлы».

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Понятно. И отключить это дело оказывается невозможно

В less есть собственный scroll buffer который управляется кнопками (Up, Down, Pg Up, Pg Down и vim shortcuts) и он не зависит от scroll buffer твоего Terminal Emulator, который, к примеру, управляется колесом мышки.

Утилита less не предназначена для сохранения патчей, она предназначена для удобного просмотра длинных выхлопов. Если тебе нужна именно генерация патча, используй git show -p COMMIT-ID-HASH > commit.patch, либо что лучше – git format-patch -1 COMMIT-ID-HASH

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

Вопрос теперь в том, как контролировать что выхлоп был укорочен. less как-то предупреждает пользователя, что текст подрезан? Только наличием строки "...skipping..."? А в less работает поиск внутри отброшенного текста? А как отличать эту строку "...skipping..." от строки "...skipping..." которая просто может быть написана в тексте?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от unDEFER

книжка у гита может и толстая, но база - небольшая, простая и понятная.

А с нейронками все ровно точно так же, как и со всеми остальными инструментами. Они смогут тебе помочь, только если ты знаешь чего хочешь. А для этого как раз надо знать базу.

Lrrr ★★★★★
()
Ответ на: комментарий от Xintrea

мне кажется, можно интегрировать прокрутку колесом и less, но как именно – домашнее задание. Про скроллбар и less не подскажу.

Если вам less не нужен, попробуй more, он вроде попроще. Если пагинатор вообще не нужен, поставь cat.

А как отличать эту строку «…skipping…» от строки «…skipping…» которая просто может быть написана в тексте?

Никак, лол

kaldeon
()
Ответ на: комментарий от anonymous

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

а не рандомные коммиты

Ну а тег - это просто указатель на конкретный коммит.

Что ты сказать-то хотел, мамкин пирожочек?

gruy ★★★★★
()