GitHub запит на виклик, який показує комітети, які вже є у цільовій галузі


136

Я намагаюся переглянути запит на притягнення на GitHub до гілки, яка не є головним. Цільова гілка опинилася за головним, і запит на витяг показав коміти від master, тож я об'єднав master і пересунув його до GitHub, але коміти і розходження для них все ще з’являються у запиті на витяг після оновлення. Я подвійно перевірив, що відділення на GitHub має команду від майстра. Чому вони все ще з'являються у запиті на виклик?

Я також перевірив запит на витяг локально, і він відображає лише об'єднані коміти.


Чи впливає це на поведінку злиття PR?
Nathan Hinchey

Ні, просто різниця на Github.
лобаті

Хто-небудь знає, чи влаштовує Gitlab влаштована така сама поведінка?
Джефф Веллінг

2
Я пропоную всім зв'язатися з GitHub, щоб висловити свою зацікавленість у зміні такої поведінки ( support.github.com/contact ). Якщо вони не почують від нас, вони не дізнаються, наскільки це важливо, і так буде назавжди.
steinybot

Відповіді:


107

Схоже, запит на витяг не відслідковує зміни цільової гілки (я зв’язався із службою підтримки GitHub і 18 листопада 2014 року отримав відповідь про те, що це задумано).

Однак ви можете отримати його, щоб показати вам оновлені зміни, виконавши наступне:

http://githuburl/org/repo/compare/targetbranch...currentbranch

Замінити githuburl, org, repo, targetbranch, і currentbranchв разі необхідності.

Або як зазначено у своїй відповіді hexsprite, ви також можете змусити її оновити, натиснувши Editна PR і тимчасово змінивши базу на іншу гілку та назад. Це створює попередження:

Ви впевнені, що хочете змінити базу?

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

І залишить дві записи журналу в PR:

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


4
Так, я деякий час повернувся до служби підтримки і отримав таку ж відповідь. Вони не оптимізують цю ситуацію. Це трохи засмучує. Наш спосіб подолати це - просто переосмислити і змусити натиснути, або закрити витяг і створити новий.
lobati

4
Ця відповідь не виправляє проблему, а просто дозволяє користувачеві бачити справжню розбіжність.
Безстрашний

4
Питання було "Чому вони все ще з'являються у запиті на виклик?". Це відповідає на це питання.
Адам Міллерчіп

3
Ознайомтесь з моїм коментарем для гарного вирішення. Ви можете просто скористатися кнопкою редагування PR, щоб перейти до іншої гілки, а потім повернутися до вихідної базової гілки, і вона перерахує розл.
hexsprite

11
Чи є запит дорогого github, щоб змінити це?
vossad01

87

Ось хороший спосіб вирішення. Використовуйте Editкнопку під час перегляду PR в GitHub, щоб змінити базову гілку на щось інше, ніж master. Потім переключіть його назад, masterі тепер він буде правильно відображати лише зміни з останніх комітетів.


4
Я здивований, що більше людей не визнають цього рішення. Я підозрюю, що оригінальний запит на витягнення застарілих був би чудово, але мені не сподобалось, що GitHub показує всі застарілі файли, тому я використав це, і він зберігає коментар і показує лише фактичні зміни, які мають бути об'єднані . Дякую!
taranaki

2
Не працювали для мене.
Шашанк

Блін це працює!
Анураг Хазра

Через три роки, і це все ще чудове рішення. І подивіться, хтось просто прокоментував кілька годин тому теж ^^^
Рікардо Сапорта

32

Підводячи підсумок, GitHub не перезавантажує історію фіксацій автоматично в запитах на виклик. Найпростіші рішення:

Рішення 1: База даних

Припустимо, ви хочете об'єднатись masterіз feature-01:

git fetch origin
git checkout feature-01
git rebase origin/master
git push --force

Якщо ви працюєте на вилці, можливо, вам доведеться замінити originвище upstream. Див. Як я оновлюю роздрібний сховище GitHub? щоб дізнатися більше про відстеження віддалених гілок оригінального сховища.

Рішення 2: Створіть новий запит на тягу

Припустимо, що ви хочете об'єднати вступ masterіз feature-01:

git checkout feature-01
git checkout -b feature-01-rebased
git push -u origin feature-01-rebased

Тепер відкрийте запит на витягнення feature-01-rebasedі закрийте той, для якого feature-01.


4
Повторна база змінює хеші комітетів, тож чи в кінцевому підсумку вони зірвуть наявні коментарі до огляду?
haridsv

@haridsv Напевно, так.
Матеуш Піотровський

На що слід пильнувати, роблячи натискання?
Пол Бендевіс

1
@haridsv - це не мій досвід. Я часто переглядаю середину огляду і коментарі не втрачаються. Хоча я втратити історію змін в PR
Joel

@JoelBerkeley Тим часом я пережив пару оглядів, в яких автор переосмислив та зауважив, що коментарі є тактовними. Однак ми втрачаємо можливість поступово переглядати, і для великих відгуків це величезна кара для рецензентів. Зараз у нас є декілька вказівок щодо наших піарників, і одне з них - ніколи не перезавантажуватися після відкриття огляду (якщо тільки не впевнений, що ще ніхто не почав перевірку). Об’єднання добре, але наша настанова полягає в тому, щоб не змішувати зміни злиття з будь-якими іншими змінами, окрім вирішення конфлікту.
haridsv

17

У ваш ~/.gitconfigфайл потрібно додати :

[rebase]
    autosquash = true

Це автоматично досягне того ж, що і ця відповідь .

Я дістала це звідси .


2
чорт, я випадково натиснув на голосування. ця відповідь мені допомогла. дозвольте мені змінити його, будь ласка.
Гектор

@hosein Іди до цього. Ви повинні мати можливість це зробити зараз.
Матеуш Піотровський

1
Я думаю, це має бути або прийнятою відповіддю, або включеною у прийняту відповідь. Це досягає результату, який я шукав!
Рональд Рей

1
@ RonaldRey git rebasing не є універсальним рішенням, оскільки воно включає редагування історії. Якщо всі працюють на приватних вилках, які ніколи не клонують інші, то це добре, але як тільки хтось клонує ваше сховище, а ви потім редагуєте історію, ви закінчуєте різні історії.
Адам Міллерчіп

14

Для всіх, хто стикається з цим і збентежений поведінкою GitHub Pull Request, першопричиною є те, що PR є різницею кінчика гілки джерела від загального предка вихідної гілки та цільової гілки. Таким чином, він відображатиме всі зміни у вихідній гілці аж до загального предка і не враховуватиме будь-які зміни, які могли статися на цільовій гілці.

Більше інформації можна отримати тут: https://developer.atlassian.com/blog/2015/01/a-better-pull-request/

Загальні предки на основі різниць здаються небезпечними. Я хотів би, щоб у GitHub була можливість зробити більш стандартний 3-позиційний PR на основі злиття.


1
Причина, яку ви згадали, здається правильною, але я плутаюсь, тому що, як правило, кожен раз, коли майстер оновлюється, я назад зливаю зміни до своєї гілки ... git checkout my-branch -> git merge master . Запит на витяг оновлюється негайно. Чи оновлюється також загальний предок?
G.One

2
Схоже, така поведінка виникає при виконанні ребазу замість злиття
G.One

1
@ G.One, справді пізня відповідь, але так - якщо ви з’єднаєтеся з цієї головної гілки до вашої вихідної гілки, ви за визначенням оновили спільного предка. Це вчинок господаря, з якого ви злилися.
Девід К. Хесс

13

Один із способів виправити це - це git rebase targetbranchв цьому PR. Тоді git push --force targetbranchGithub покаже правильні зобов'язання та розходження. Будьте обережні з цим, якщо не знаєте, що робите. Можливо, спочатку огляньте тестову гілку, щоб зробити ребауз, а потім git diff targetbranchпереконатися, що це все-таки ви хочете.


10

Це відбувається з GitHub, коли ви сквош здійснюєте об'єднані з цільової гілки.

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

EDIT: ще одне рішення - перезагрузка та примушування. Чиста, але переписана історія


1
Дякую @achille, це справді було проблемою з мого боку. Після відключення злиття сквош це вирішується.
Ашвін777

0

Я не зовсім впевнений у теорії, що стоїть за цим. Але я це отримував кілька разів і міг це виправити, зробивши наступне.

git pull --rebase

Це дозволить отримати та об'єднати зміни з початкового відділення головного репо (якщо у вас є на це пункт)

Потім ви натискаєте свої зміни насильно до вашого клонованого сховища Github (цільового)

git push -f origin master

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



-1

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

git add .  && git commit -a --allow-empty-message -m '' && git reset --soft HEAD~2 &&
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"

У мене немає конфліктів, вам добре йти!

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