Сравните старые и новые версии принудительного запроса GitHub.

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

Как я могу узнать, что изменилось между старой версией PR и новой версией PR?

Я думаю, я мог бы сделать git pull и git checkout $BRANCH_NAME, когда PR был сначала поднят, затем git fetch, а затем git diff $BRANCH_NAME..origin/$BRANCH_NAME после обновления PR - но это также покажет изменения, которые были введены в базовую ветвь (обычно ведущую) и вносит в PR через rebase. Можно ли удалить этот шум и просто показать, что изменилось в самом PR?

Ответы

Ответ 1

Оформить заказ this ответьте на другой вопрос, который хочет сделать что-то очень похожее на то, что вы пытаетесь достичь.

Опишите вашу ситуацию следующим образом:

newcommit -> the new pull request commit
oldcommit -> the old pull request commit
upstream -> the base branch commit the new pull request is based on

Теперь сделайте следующее:

git commit-tree newcommit^{tree} -p oldcommit -p upstream -m "message"
git show <commit id returned by previous command>

Идея заключается в том, что commit-tree будет сглаживать слияние между oldcommit и upstream, создавая дерево newcommit и, таким образом, содержащее именно код newcommit. Он вообще не изменяет вашу текущую ветку, создает новую безголовую фиксацию и дает вам свой идентификатор. Это означает, что git show будет перечислять каждую модификацию как разрешение конфликта, что является точной разницей между новым PR и старым.

Чтобы иметь возможность сделать это, вам нужно иметь предыдущий PR в вашем репозитории git где-нибудь (если был выполнен принудительный толчок, история git была перезаписана и не может быть восстановлена, если вы ее не используете ваш компьютер или у вас есть доступ к серверу reflog). Проверьте ответ VonC, чтобы узнать подробности об этом.

Предполагая, что:

  • базовая ветвь: master
  • у вас локально старая ветвь PR: $BRANCH_NAME
  • новый PR в удаленной ветке: origin/$BRANCH_NAME

Вы можете сделать следующее:

# fetch locally upstream changes (origin/$BRANCH_NAME)
git fetch
# produce the fake merge commit
git commit-tree origin/$BRANCH_NAME^{tree} \
         -p $BRANCH_NAME \
         -p `git merge-base master origin/$BRANCH_NAME` \
         -m "message"
# see "fake" conflict resolution = difference between the two PR
git show <commit id returned by previous command>

git merge-base используется для нахождения общего предка между двумя ветвями, в этом случае для поиска фиксации, на которой основан новый PR, в базовой ветке, если вы предпочитаете, что вы можете написать идентификатор commit непосредственно.

Ответ 2

  старая версия пиара

Вы можете сделать это прямо на GitHub: см. "Найти коммитера принудительного нажатия на GitHub"

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


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

Это будет доступно только в reflog удаленного репозитория, который будет включать в себя предыдущий заголовок ветвления принудительно.
Поскольку удаленное репо является GitHub, вы все еще можете вывести старый коммит, посмотрев на события push: см. "Github запоминает идентификаторы коммитов?".

Hat также покажет изменения, которые были внесены в базовую ветвь (обычно master)

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

Смотрите В чем разница между двойной точкой ".." и тройной точкой "..." в диапазонах фиксации различий в Git?

http://mythic-beasts.com/~mark/git-diff-help.png

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

      x--x--x        (old branch in reflog)
     /
 m--M0--M--M   (master)
            \
             X--X--X (new branch forced push)

Diff old_HEAD..newHEAD будет включать несколько коммитов M из базовой ветки, поскольку они являются частью пути общего предка (M0).

Таким образом, вы можете сравнить принудительно выдвинутую ветвь (при условии, что вы отслеживаете pushEvents и знаете предыдущий HEAD этой ветки).
Но вы не можете легко сравнить две ветки без общего пути предков.

Ответ 3

Я полагаю, что просто невозможно получить старые версии запросов на извлечение, как предлагается в этом билете: https://github.com/isaacs/github/issues/999 Пользователям, которые публикуют в этом репозитории, рекомендуется обращаться в службу поддержки GitHub, так что, скорее всего, поддержка GitHub уже есть. ответил, что это невозможно при создании билета.

Это основная недостающая функция из запросов на получение GitHub, которые есть у Gerrit и которые пользователи Gerrit сильно упускают.