Запрос GitHub pull, показывающий фиксации, которые уже находятся в целевой ветке
Я пытаюсь просмотреть запрос на перенос на GitHub на ветку, которая не является мастером. Целевая ветвь находилась за мастером, и запрос на тягу показал, что он совершает капитан, поэтому я объединил мастер и нажал его на GitHub, но коммиты и diff для них все еще появляются в запросе на вытягивание после обновления. Я удвоил проверку, что ветка на GitHub имеет фиксации от мастера. Почему они все еще появляются в запросе на растяжение?
Я также проверил запрос на перенос локально, и он показывает только не объединенные коммиты.
Ответы
Ответ 1
Похоже, что Pull Request не отслеживает изменения в целевой ветки (я связался со службой поддержки GitHub и получил ответ 18 ноября 2014 года, в котором говорилось, что это сделано специально).
Однако вы можете получить обновленные изменения, выполнив следующие действия:
http://githuburl/org/repo/compare/targetbranch...currentbranch
При необходимости замените githuburl
, org
, repo
, targetbranch
и currentbranch
.
Или, как указал hexsprite в своем ответе, вы также можете принудительно обновить его, щелкнув Edit на PR и временно изменив базу на другую ветку и вернувшись обратно. Это производит предупреждение:
Вы уверены, что хотите сменить базу?
Некоторые коммиты из старой базовой ветки могут быть удалены из временной шкалы, а старые комментарии к обзору могут устареть.
И оставим две записи журнала в пиаре:
![enter image description here]()
Ответ 2
Вот хорошее обходное решение. Используйте кнопку Edit
при просмотре PR в GitHub, чтобы изменить базовую ветвь на нечто, отличное от master
. Затем верните его в master
, и теперь он будет корректно показывать только изменения от последних коммитов.
Ответ 3
Подводя итог, GitHub автоматически не обновляет историю фиксации в запросах на pull. Самые простые решения:
Решение 1: Rebase
Предположим, что вы хотите объединиться в master
из feature-01
:
git fetch origin
git checkout feature-01
git rebase origin/master
git push --force
Если вы работаете с вилкой, вам может потребоваться заменить origin
выше на upstream
. См. Как обновить разветвленный репозиторий GitHub?, чтобы узнать больше о отслеживании удаленных веток исходного репозитория.
Решение 2. Создайте новый запрос на растяжение
Предположим, что вы хотите объединить intro 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
Один из способов исправить это - git rebase targetbranch
в этом PR. Тогда git push --force targetbranch
, тогда Гитуб покажет правые коммиты и diff. Будьте осторожны с этим, если вы не знаете, что делаете. Возможно, сначала проверьте тестовую ветвь, чтобы сделать rebase, затем git diff targetbranch
, чтобы убедиться, что это все еще то, что вы хотите.
Ответ 5
Для всех, кто сталкивается с этим и смущает поведение GitHub Pull Request, первопричина заключается в том, что PR - это различие наконечника ветки источника с общим предком ветки источника и ветвью цели. Поэтому он будет показывать все изменения в ветки источника до общего предка и не будет учитывать любые изменения, которые могли произойти в целевой ветке.
Дополнительная информация доступна здесь: https://developer.atlassian.com/blog/2015/01/a-better-pull-request/
Общие различия на основе предков кажутся опасными. Я хочу, чтобы у GitHub была возможность сделать более стандартный трехсторонний PR файл слияния.
Ответ 6
Вам нужно добавить следующее в ваш файл ~/.gitconfig
:
[rebase]
autosquash = true
Это автоматически достигнет того же, что и этот ответ.
Я получил это отсюда.
Ответ 7
Это происходит с GitHub, когда вы фиксируете коммиты из целевой ветки.
Я использовал сквош и слияние с Github в качестве стратегии слияния по умолчанию, включая слияния из целевой ветки. Это вводит новый коммит, и GitHub не распознает, что этот сжатый коммит такой же, как тот, который уже есть в master (но с разными хэшами). Git обрабатывает его правильно, но вы снова видите все изменения в GitHub, что делает его неудобным для просмотра. Решение состоит в том, чтобы сделать регулярное слияние этих извлеченных коммитов вверх по потоку вместо сквоша и слияния. Если вы хотите объединить другую ветку с вашей зависимостью, git merge --squash
и git merge --squash
этот единственный коммит перед извлечением из мастера, как только другая ветвь фактически сделает его мастером.
Ответ 8
Я не совсем уверен в теории, стоящей за этим. Но я получил это несколько раз и смог исправить это, выполнив следующие действия.
git pull --rebase
Это приведет к извлечению и объединению изменений из исходной ветки основного репо (если вы указали на это)
Затем вы решительно нажимаете свои изменения на свой клонированный репозиторий (целевой) github
git push -f origin master
Это позволит убедиться, что ваш клон github и родительское репо находятся на одном уровне github commit, и вы не видите ненужных изменений в ветвях.
Ответ 9
Отказоустойчивый подход, если вы слишком беспокоитесь о том, чтобы что-то испортить: перейдите к файлу и вручную удалите изменения, а затем раздавите последний коммит, используя
git add . && git commit -a --allow-empty-message -m '' && git reset --soft HEAD~2 &&
git commit --edit -m"$(git log --format=%B --reverse [email protected]{1})"
У меня нет конфликтов, тебе хорошо идти!