Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Здесь есть некоторые механики:

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

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

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

Ответ 4

Если вы просто хотите увидеть, будет ли 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).