Запрос на слияние в git заставляет восходящую ветвь идти впереди источника - PullRequest
0 голосов
/ 25 августа 2018

Терминологии:

  1. Местная ветвь называется master
  2. хранилище на github называется origin / master
  3. И корневой репозиторий, из которого я разветвлен, называется upstream / master.

Теперь предположим, что My origin / master на один коммит впереди upstream / master

Итак, я создаю запрос на извлечение для upstream / master и предположим, что владелец репозитория upstream принимает запрос на извлечение и объединяет его.

Это создает фиксацию +1 в репозитории upstream с сообщением «Запрос на извлечение объединен с githubuser / branchname». Так что теперь на github он показывает «Эта ветвь (origin / master) на 1 коммит вперед, на 1 коммит позади upstream / master.» Хотя на самом деле код в этих ветвях практически одинаков, и они должны быть даже.

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

Есть ли способ продвинуться вверх по течению без дополнительной фиксации вверх по течению. Просто объединить запрос на включение, чтобы ветки upstream / master и origin / master были четными?

1 Ответ

0 голосов
/ 26 августа 2018

Суть проблемы лежит внутри GitHub. (Я сейчас подробно расскажу.) Ответ на ваш вопрос: и нет, и да :

Есть ли способ продвинуться вверх по течению без дополнительной фиксации вверх по течению. Просто объединить запрос на включение, чтобы ветки upstream / master и origin / master были четными?

Здесь участвуют четыре группы людей:

  1. Те, которые программируют сам GitHub. Они управляют тем, что отображается в веб-браузере, т. Е. Той зеленой кнопкой, которую вы видите на странице с надписью «Объединить этот запрос извлечения», с небольшой стрелкой вниз по краю, которая, если щелкнуть по ней, позволяет выбрать один из трех типов: сливаться.

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

  2. Те, у кого есть административный доступ к хранилищу в восходящем направлении. Они могут git push прямиком в верхний репозиторий. Это означает, что они могут использовать командную строку Git (вообще не GitHub) для выполнения желаемого действия, а затем запустить git push, чтобы обновить хранилище на GitHub.

  3. Те, у кого есть доступ для записи, но , а не административный доступ, к вышестоящему репозиторию через предоставленный GitHub интерфейс. Они не могут делать то, что вы хотите - по крайней мере, до тех пор, пока люди из группы 1 не добавят это в качестве опции.

  4. Те, у кого нет прав на запись (предположительно, включая вас): они не могут этого сделать.

Теперь, что касается этих кликающих кнопок GitHub - или, скорее, кнопки единственного числа, с тремя режимами: три предлагаемых режима обозначены следующим образом:

  • Объединить.

    Вы можете подумать, что это сработает, но это не так, потому что он работает в эквиваленте git checkout <em>branch</em> && git merge --no-ff -m <em>message</em> <em>hash</em>. branch достаточно очевиден, а часть message равна Merge pull request #<em>number</em> from <em>repository</em>. Часть hash сложнее: это идентификатор хеша, найденный в refs/pull/<em>number</em>/head. Это идентификатор коммита конкретного коммита , который вы отправили, посредством вашего нажатия "кликающих и запрашивающих" кликающих кнопок.

    Если бы GitHub использовал эквивалент git checkout <em>branch</em> && git merge --ff-only <em>hash</em> с теми же branch и hash, вы бы получили то, что хотели. Конечно, не будет коммита, содержащего текст Merge pull request .... Но это было бы хорошо. (Это новый режим, который я хотел бы добавить. Они могли бы назвать его Объединить без дополнительной фиксации или Быстрая перемотка вперед , возможно.)

  • Перебазировать и объединить .

    Это добавляет коммиты pull-request - их может быть больше одного - которые в данный момент не находятся в ветви, к ветви. Он работает в эквиваленте git checkout <em>branch</em> && git rebase --force-rebase <em>hash</em> (возможно, с --merge или --strategy merge). Конечным результатом является то, что коммиты из запроса извлечения копируются , не объединяются, в новые коммиты с новыми и разными хэш-идентификаторами. Запрос на слияние завершен без добавления коммита слияния, поэтому сообщение Merged pull request ... отсутствует.

    Вы можете подумать, что в случае, когда копируемый коммит или коммит уже находятся в правильном положении, т. Е. Только за кончиком ветви перед нажатием кнопки, GitHub не будет копировать коммиты, а вместо этого просто использовали бы их как есть, как это произошло бы, если бы они выполняли эквивалент git rebase без --force-rebase или --no-ff. Но это не так. Есть ли какая-то хорошая (внутренняя причина для GitHub) причина этого, я не знаю.

  • Сквош и слияние.

    Это дOES эквивалент git checkout <em>branch</em> && git merge --no-commit --squash <em>hash</em> && git commit -m <em>message</em>.(--no-commit здесь избыточен: --squash подразумевает --no-commit. Это ненужная особенность реализации Git командной строки git merge --squash, поскольку, если вы действительно хотите --no-commit, вы могли быпросто укажите его.)

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

Сводка

Те, у кого есть доступ на запись в вышестоящий репозиторий, могут перенести ваш запрос на извлечение в репозиторий Git на компьютере, которым они управляют, объединить его вручную и нажатьвернитесь к исходному хранилищу на GitHub.Это то, на что Тобиас К. ссылается в комментарии .Это дало бы то, что вы хотите.

Если бы GitHub добавил режим слияния, который я хотел бы добавить, пользователи, которые в настоящее время объединяют ваш запрос на извлечение с кнопкой слияния Web-UI, смогут сделать это водин шаг, без привлечения собственных компьютеров и команд командной строки Git.Но без этого дополнительного режима они не могут.

То, что они на самом деле сейчас используют, это режим Rebase and merge .Из-за этого мы можем сказать:

Так что теперь на github он показывает " Эта ветвь (origin / master) на 1 коммит вперед, 1 на коммит upstream / master. "

Если бы они использовали режим Merge , вы бы увидели себя одним коммитом позади, а не одним коммитом впереди.Это было бы более дружественным для вас, но в некоторых отношениях менее приятным для себя (и, возможно, других пользователей их хранилища).Когда они используют Перебазировать и объединить , они копируют все ваши коммиты, поэтому, если вы были k коммитами раньше, вы внезапно будете k впереди и k позади: k , который вы впереди, ваш коммит, с вашими хэш-идентификаторами и k , за которыми вы находитесь, являются их копиями ваших коммитов с их хэш-идентификаторами.

Восстановление из вашего апстрима * Перебазировать и объединить

Обратите внимание, что вы можете восстановиться после этого, выполнив на своем компьютере следующее:

git fetch upstream
git checkout $branch
git rebase upstream/$branch
git push --force-with-lease origin $branch

(где $branch представляет имя вашей ветви).fetch получает свои копии ваших коммитов.checkout позиционирует вас для перебазирования, которое выполняет rebase. 1 git push отправляет новые коммиты на ваш форк (если их еще нет), а затем просит GitHub изменить вашИдея форка о $branch указывать на последний такой скопированный коммит, успешно (как если бы --force), даже если этот отбрасывает некоторые коммиты, но терпит неудачу (--force-with-lease), если коммиты отбрасываютсяне совсем то, что ожидалось.


1 Вы можете сделать это за один шаг, так как git rebase позволяет проверить ветку перед началом ребазинга, но я думаю, что это понятнеесюда.Чтобы сделать это за один шаг, используйте git rebase origin/$branch $branch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...