Github Comparison View для 2 ветвей неверен?

Когда я делаю сравнение Github между master и другой ветвью A, Похоже, что Github сравнивает версию HEAD A со старой версией master без головы.

Я изучил это, и из того, что я могу сказать, похоже, что Github сравнивает ветку A с общим предком master. На самом деле это не сравнение с тем, что в настоящее время находится на уровне HEAD мастера.

Есть ли способ сравнить HEAD мастера с HEAD ветки A в Github?

Если нет, то почему? Кажется, что это функция, которую хотел бы иметь каждый разработчик. Или есть какой-то процесс, который я, возможно, пропустил? Я хотел бы иметь возможность создать запрос на извлечение непосредственно из одного из этих различий.

EDIT: Вот пример репозитория, который показывает проблему

https://github.com/bradparks/test_github_diff_view

  • Я создал новый репозиторий, содержащий один файл README.md.
  • Я установил этот файл так, чтобы он содержал одну строку v100.
  • Затем я разветвил master на новую ветку A и изменил строку на `v200'.
  • Затем я изменил значение в главной ветке на «v300», а затем сравнил две ветки, используя ссылку для сравнения.

    https://github.com/bradparks/test_github_diff_view/compare/A

    и я вижу следующий неожиданный результат. Почему он не отличается от v300 вместо v100?

    введите описание изображения здесь


person Brad Parks    schedule 14.09.2015    source источник
comment
Не могли бы вы предоставить запрос на сравнение, где, по вашему мнению, есть ошибка. (кстати, не дв)   -  person Willem Van Onsem    schedule 14.09.2015
comment
@BradPranks: я говорю об URL-адресе для получения представления сравнения (URL-адрес с запросом, что-то вроде: github.com/foo/bar?arg=val&oth=val2).   -  person Willem Van Onsem    schedule 14.09.2015
comment
@CommuSoft - спасибо за отзыв - я добавил образец репо, показывающий проблему, и добавил его к вопросу выше.   -  person Brad Parks    schedule 14.09.2015
comment
GitHub сравнивает с последним слиянием из родительской ветки. Что, если вы никогда не объединяли мастер в свою ветку, будет моментом времени, когда вы создали ветку.   -  person Powerlord    schedule 14.09.2015
comment
Хм... Интересно... то есть, чтобы объединить ветку A в master, мне сначала нужно объединить master в ветку A? Моя ветка A является функциональной веткой.   -  person Brad Parks    schedule 14.09.2015


Ответы (3)


Есть ли способ сравнить HEAD мастера с HEAD ветки A в Github?

сентябрь 2018 г.: yes: GitHub теперь явно поддерживает Сравнения различий Git с тремя и двумя точками. См. пример здесь.
keisuke упоминает в комментариях подобная инициатива на Bitbucket< /а>.

Оригинальный ответ 2015:

Нет: как указано в представлении GitHub для сравнения текущих версий веток, GitHub поддерживает только диапазон с тремя точками (...) спецификация ярлыка.
То есть:

Эта форма предназначена для просмотра изменений в ветке, содержащей и до второй, начиная с общего предка обоих.

git diff A...B эквивалентно git diff $(git-merge-base A B) B.
Вы можете опустить любой из , что будет иметь тот же эффект, что и использование вместо него HEAD.

В официальной справке GitHub эта функция упоминается как:

Чаще всего функция Compare используется для сравнения ветвей, например, когда вы запускаете новый запрос на извлечение.

В этом сценарии ветка PR начинается с master (или в любом случае должна быть перебазирована поверх master), что означает, что master HEAD является базой между master и веткой PR.

Но когда две ветви разветвляются, сравнение происходит уже не между HEADs, а между одним общим предком и одним HEAD: git diff $(git-merge-base master B) B.

Примечание: даже если вы укажете два SHA1 напрямую, как это четко задокументировано в Сравнение коммитов, которое по-прежнему выполнит git diff $(git-merge-base A B) B.
Это не выполнит различие непосредственно между двумя коммитами.

person VonC    schedule 16.09.2015
comment
Спасибо за ответ! можете ли вы уточнить, что вы подразумеваете под В этом сценарии ветвь PR начинается с мастера (или в любом случае должна быть перебазирована поверх мастера) - Вы имеете в виду, что я должен объединяться? осваивать ветку PR? Это похоже на то, что говорил Powerlord: Что, если вы никогда не объедините master в свою ветку, будет моментом времени, когда вы создали ветку. Но, как я уже упоминал, кажется, например, мне нужно объединить master с веткой A, прежде чем я смогу объединить A с master? - person Brad Parks; 17.09.2015
comment
@BradParks см. мои предыдущие ответы stackoverflow.com/a/24978606/6309 и stackoverflow.com/a/14681796/6309 - person VonC; 17.09.2015
comment
Я попробовал это, и это сработало отлично. Это похоже на то, что мне нужно было разрешить все конфликты слияния перед тем, как начать слияние, по крайней мере, с моей точки зрения ;-) Но разве это не делает представление сравнения, предоставляемое Github, почти бесполезным? Я знаю, что они в некоторой степени ограничены рабочими процессами git, но мне все же кажется, что представление сравнения вводит в заблуждение 99% людей. Я думаю, было бы почти лучше, если бы у него даже не было этой функции, учитывая, насколько она сломана. - person Brad Parks; 17.09.2015
comment
@BradParks цель действительно состоит в том, чтобы убедиться, что конфликты разрешены локально, до того, как будет предложен какой-либо PR: таким образом, слияние будет ускорено. Поскольку ветка PR находится поверх главной ветки, разница на GitHub покажет разницу между главной веткой HEAD и веткой PR HEAD. - person VonC; 17.09.2015
comment
@BradParks Я обновил свой ответ, чтобы объяснить, почему ответ Леогера не может работать: вы всегда будете отличаться от общего предка, а не от ГОЛОВЫ другой ветки. - person VonC; 19.09.2015
comment
И чтобы быть на 100% ясным, единственный способ заставить это работать - это использовать процесс, подробно описанный здесь @VonC, который включает перебазирование функциональной ветки A перед выполнением запроса на включение. - person Brad Parks; 23.09.2015
comment
GitHub недавно реализовал функцию сравнения двух точек: blog.github .com/changelog/2018-09-18-two-dot-comparison , help.github.com/articles/ . Кстати, запросы на вытягивание BitBucket по умолчанию сравниваются с двумя точками-diff, что, как вы говорите, более удобно для пользователя. См.: developer.atlassian.com/blog/2015/01. /a-better-pull-request - person keisuke; 03.10.2018
comment
@keisuke Спасибо. На самом деле я упомянул об этом в stackoverflow.com/a/52487331/6309, но забыл сообщить об этом здесь. Я соответствующим образом отредактировал ответ и включил ваш комментарий для большей наглядности. - person VonC; 03.10.2018

Есть ли способ сравнить HEAD мастера с HEAD ветки A в Github?

[EDIT: Нет, я был неправ. У меня был URL-адрес, который выглядел так, как будто он будет делать правильные вещи, и разница на странице выглядела правильно, но это был несчастный случай. Если вы действительно хотите узнать больше, проверьте историю этого ответа.]

person leoger    schedule 17.09.2015
comment
эй... спасибо за отзыв! Я попробовал это, и, похоже, у меня это не работает ... Все, что после знака #, не отправляется на сервер, и я пытался изменить URL-адрес на множество разных вещей, и все они дают один и тот же результат. Просто последняя фиксация в мастере, которая выглядит так, как будто она работает. например github.com/bradparks/test_github_diff_view/commit/ - person Brad Parks; 18.09.2015
comment
Я немного запутался. Если вы нажмете ссылку, которую я предоставил на ваш репозиторий test_github_diff_vew, вы не увидите нужный вам diff? Разница, которую я вижу, показывает -v100 и +v300. Github показывает вам и мне две разные страницы для одного и того же URL? - person leoger; 19.09.2015
comment
я вижу разницу, которую хочу, когда нажимаю на ссылку таким образом, что сначала я подумал, что это здорово. Но потом я понял, что он просто показывает последний коммит в основной ветке. Неважно, что вы поставите в конце, он всегда просто показывает последний коммит в этой ветке. Так что это не diff, это просто ссылка на один коммит на одну ветку. Например, github.com/bradparks/test_github_diff_view/commit/master - person Brad Parks; 19.09.2015
comment
Ха, ты прав! Извините, что не проверил мой ответ более тщательно. - person leoger; 21.09.2015

Еще одна мысль. Если вы хотите создать запрос на вытягивание из разницы между вашей работой и главой основной ветки (согласно операции), то вам нужно сначала перебазировать свою собственную ветку из основной ветки git rebase <master>, а затем сделать пулл запрос.

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

person MikeBeaton    schedule 27.03.2017