Сравните старые и новые версии принудительного запроса 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 сильно упускают.