Есть ли какая-нибудь "git rebase --dry-run", которая заранее уведомит меня о конфликтах?

Я пытаюсь перебазировать скрипт, и мой скрипт будет использовать разные пути в зависимости от того, приведет ли перебазировка к каким-либо конфликтам.

Есть ли способ определить, приведет ли перебазировка к конфликтам перед выполнением перебазировки?

4 ответа

Решение

На момент написания (Git v2.6.1 v2.10.0), git rebase команда предлагает нет --dry-run вариант. Перед попыткой перебазировки невозможно узнать, столкнетесь ли вы с конфликтами.

Однако, если вы запустите git rebase и столкнуться с конфликтом, процесс остановится и выйдет с ненулевым статусом. Что вы можете сделать, это проверить состояние завершения операции rebase и, если оно не равно нулю, запустить git rebase --abort отменить ребазинг:

git rebase ... || git rebase --abort

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

Или, может быть, проще, создать новую временную ветку, в которой нужно "выполнить" ребазинг:

git checkout your-branch
git checkout -b tmp
git rebase other-branch

Если это было успешно, но вы хотите "откат" your-branch нетронутым Просто git branch -D tmp и ты вернулся туда, откуда начал.

Если были конфликты, и вы проделали некоторую работу по их устранению, и теперь вы хотите сохранить перебазирование, просто переместите подсказку своей ветки на tmp (а потом git branch -D tmp).

Я подозреваю что git rebase ... --dry-run невозможно по следующей причине.

Когда вы делаете git rebase, git будет выполнять откат до начальной точки, а затем постепенно применять исправления для каждого коммита, чтобы обновить ветку. Если он попадет в конфликт, он остановится и подождет, пока вы не разрешите конфликт, прежде чем продолжить. Путь, который выберет перебазирование после этого конфликта, зависит от того, как вы разрешите конфликт - если вы решите его определенным образом, это может привести (или устранить) более поздние конфликты.

Таким образом, git rebase ... --dry-run мог бы дать вам только первый конфликт - сообщения о последующих конфликтах будут зависеть от того, как будет разрешен этот первый конфликт.

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

Основываясь на решении @joneit:

Создать новый temp ответвление от your-branch и попробуйте переустановить эту временную ветку на new-base:

git checkout -b temp <your-branch> && git rebase <new-base>

например, чтобы проверить, есть ли ветка feature1 можно переустановить на master:

git checkout -b temp feature1 && git rebase master

Вы все еще можете сделать git rebase, поиграть с ним, как вы хотите, чем восстановить все изменения, сделанные ранее. Предполагая, что вы сделали перебазирование какой-то ветви в masterи тебе это не нравится

  1. git reflog -20 - дает вам последние 20 позиций вашей головы с небольшим описанием
  2. git checkout <the_branch_name> - размещает ГОЛОВУ на ветке
  3. git reset --hard <old_sha1_found_in_reflog> - помещает ваш HEAD и ветку на старый ref, таким образом вы можете восстановить старую ветку.

Здесь есть некоторая механика, которую нужно понять:

  1. Вы НИКОГДА не удаляете что-либо в git, а не с командами. Это сборщик мусора, который проходит и удаляет ветки без ссылок (по умолчанию 3 месяца). Таким образом, ваша ветвь, до перебазирования, все еще существует.
  2. То же самое касается перебазирования на той же ветке, это просто новое дерево, переписанное рядом со старым.
  3. Вся история rebase а твой другой на HEAD манипуляциях написан в reflog
  4. Ты можешь использовать @{N} аннотации от reflog

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

Например, вы можете поместить тег перед rebase чем вернуться к нему или удалить его. он уклоняется от всех этапов исследования SHA1.

Другие вопросы по тегам