Я пытаюсь перезагрузить script, а мой script будет принимать разные пути в зависимости от того, будет ли перебаза приводить к конфликтам.
Есть ли способ определить, приведет ли перебаза к конфликтам перед выполнением rebase?
Я пытаюсь перезагрузить script, а мой script будет принимать разные пути в зависимости от того, будет ли перебаза приводить к конфликтам.
Есть ли способ определить, приведет ли перебаза к конфликтам перед выполнением rebase?
На момент написания (Git v2.6.1 v2.10.0) команда git rebase
не предлагает опцию --dry-run
. Невозможно узнать, прежде чем пытаться переустановить или не столкнетесь с конфликтами.
Однако, если вы запустите git rebase
и ударите конфликт, процесс остановится и завершится с ненулевым статусом. Что вы можете сделать, это проверить статус выхода операции переадресации и, если он отличен от нуля, запустить git rebase --abort
, чтобы отменить rebase:
git rebase ... || git rebase --abort
Я подозреваю, что git rebase ... --dry-run
невозможен по следующей причине.
Когда вы выполняете git rebase
, git откатывается к начальной точке, затем постепенно применяйте исправления для каждой фиксации, чтобы обновить ветвь. Если он столкнется с конфликтом, он остановится и дождитесь, пока вы разрешите конфликт, прежде чем продолжить. Путь, который ребалансирует после этого конфликта, зависит от того, как вы разрешаете конфликт - если вы разрешите его определенным образом, который может ввести (или устранить) более поздние конфликты.
Таким образом, git rebase ... --dry-run
сможет дать вам первый конфликт - отчеты о последующих конфликтах будут зависеть от того, как будет разрешен этот первый конфликт.
Единственный способ, которым я могу это сделать, - это git diff
между текущей позицией и последним фиксацией в ветке, в которую вы переустанавливаете. Но это не даст вам то, что вы ищете - вам действительно нужен список конфликтующих изменений между двумя точками. Возможно, есть способ сделать это с помощью git diff
, но это не обычный патч.
Вы по-прежнему можете выполнять git rebase, играть с ним, как хотите, а не восстанавливать все изменения ранее.
Предполагая, что вы сделали свою перестановку какой-либо ветки в master
, и вам это не нравится:
git reflog -20
- дает вам последние 20 позиций вашего HEAD с небольшим описаниемgit checkout <the_branch_name>
- помещает HEAD в веткуgit reset --hard <old_sha1_found_in_reflog>
- помещает HEAD и ветку в старый ref, таким образом вы можете восстановить старую ветку.Здесь есть некоторые механики:
rebase
, а другая - в манипуляциях HEAD написана в reflog
@{N}
от reflog
Итак, после rebase
ничего не теряется, вам просто нужно знать, как его найти и восстановить.
Например, вы можете поместить тег перед rebase
, чем вернуться к нему или удалить его. он уклоняется от вас на всех этапах исследования SHA1.
Если вы просто хотите увидеть, будет ли rebase успешным, но затем вы хотите "откат", вы всегда можете переместить кончик ветки назад к оригинальной фиксации. Просто пометьте или запишите оригинал SHA.
Или, может быть, проще, создайте новую временную ветвь, в которой нужно "сгенерировать" rebase:
git checkout your-branch
git checkout -b tmp
git rebase other-branch
Если он был успешным, но вы хотите "откат", your-branch
нетронутым. Просто git branch -D tmp
, и вы вернетесь туда, откуда вы начали.
Если возникли конфликты, и вы проделали определенную работу по их устранению, и теперь вы хотите сохранить переадресацию, просто переместите подсказку вашей ветки на tmp
(а затем git branch -D tmp
).