Есть ли какая-нибудь "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
и тебе это не нравится
git reflog -20
- дает вам последние 20 позиций вашей головы с небольшим описаниемgit checkout <the_branch_name>
- размещает ГОЛОВУ на веткеgit reset --hard <old_sha1_found_in_reflog>
- помещает ваш HEAD и ветку на старый ref, таким образом вы можете восстановить старую ветку.
Здесь есть некоторая механика, которую нужно понять:
- Вы НИКОГДА не удаляете что-либо в git, а не с командами. Это сборщик мусора, который проходит и удаляет ветки без ссылок (по умолчанию 3 месяца). Таким образом, ваша ветвь, до перебазирования, все еще существует.
- То же самое касается перебазирования на той же ветке, это просто новое дерево, переписанное рядом со старым.
- Вся история
rebase
а твой другой на HEAD манипуляциях написан вreflog
- Ты можешь использовать
@{N}
аннотации отreflog
Итак, ничего не потеряно после rebase
Вы просто должны знать, как найти и восстановить его.
Например, вы можете поместить тег перед rebase
чем вернуться к нему или удалить его. он уклоняется от всех этапов исследования SHA1.