Git - Как проверить, что git-rebase --interactive не изменил окончательное состояние проекта

Я часто использую git rebase --interactive для очистки истории. Бывает, что есть конфликты слияния, или даже если конфликтов нет, слияния все равно есть. Я всегда немного боюсь, что что-то изменилось, хотя я только изменил порядок коммитов, раздавил их и т. Д.

Раньше я держал резервную копию своего рабочего дерева, чтобы вставить новое. Затем я посмотрел в окно коммита в gitg, чтобы убедиться, что все было так же. Но это больно, и я перестал делать резервные копии.

Затем я сделал резервную копию и обнаружил, что git diff backup-branch работает.

Теперь я попробовал: (потому что я также хотел бы перестать создавать резервные ветки)

git --diff HEAD ORIG_HEAD

Но это показывает мне изменения, и когда я смотрю на файл в моем рабочем каталоге, похоже, что он не изменился.

Какая команда подходит для этого сценария?


person Community    schedule 18.05.2012    source источник


Ответы (2)


В этом случае интерактивная перестановка начинается с проверки, и по какой-то причине ORIG_HEAD устанавливается после проверки. Вы действительно хотите сравнить с фиксацией, которая была HEAD до того, как rebase выполнила эту проверку. Вы можете найти его в рефлоге:

git reflog

Найдите кассу, ближайшую к верху, и сравните ее с фиксацией в следующей строке. Если ваш рефлог выглядит так:

ec4bd97 HEAD@{0}: rebase -i (finish): returning to refs/heads/big_cat_branch
ec4bd97 HEAD@{1}: rebase -i (fixup): Divide the bug class into modules
5d62142 HEAD@{2}: rebase -i (fixup): updating HEAD
c28c562 HEAD@{3}: checkout: moving from big_cat_branch to c28c562
7f6bc0e HEAD@{4}: commit: Fix bug related to big cats.

тогда вы хотите различать вот так:

git diff HEAD 7f6bc0e

or

git diff HEAD HEAD@{4}

И вы не ожидаете никакого вывода, если интерактивная перестановка действительно что-то не изменила в вашем коде.

Было бы неплохо, если бы вы могли вытащить эту запись из журнала ссылок, но я не знаю простого способа, кроме получения фиксации, на которую указывает ORIG_HEAD (с git rev-parse ORIG_HEAD), поиска ее в журнале ссылок и просмотра следующая строка. Для этого можно написать сценарий, но найти его вручную несложно.

(Вы можете подумать, что ORIG_HEAD ^ даст вам то, что вы хотите, но это даст вам коммит, который предшествует ORIG_HEAD в истории коммитов, а не в вашем локальном рефлоге. Вам нужно последнее.)

person Rob Davis    schedule 18.05.2012
comment
Привет, в этом есть смысл. Я до сих пор не понимаю, что git reset --hard ORIG_HEAD используется для отмены перебазирования git. См. Здесь пример - person ; 19.05.2012
comment
git reset --hard ORIG_HEAD работает только для неинтерактивных перемещений. Если вы сделаете rebase -i, ORIG_HEAD сбрасывается при каждой фиксации. Чтобы сэкономить время, я обычно помечаю подсказку, которую переустанавливаю, чтобы я мог легко вернуться к ней (или сравнить ее с конечным состоянием ветки). Это ярлык для метода Роба, описанного выше. - person ellotheth; 23.05.2012

Мне лично нравится git log -p. Я показываю различия каждого коммита, включая слияния.

person Pedro Nascimento    schedule 18.05.2012