2015-04-08 1 views
30

Я пытаюсь перезаписать сценарий, и мой сценарий будет проходить по различным путям в зависимости от того, будет ли rebase результатом каких-либо конфликтов.Есть ли какая-то «git rebase -dry-run», которая заранее сообщит мне о конфликтах?

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

+0

Какая форма команды 'git rebase' вы используете? Используете ли вы какие-либо необязательные флаги? И какой язык сценариев вы используете? Оболочка? – Jubobs

+3

Если вы запустите 'git rebase' и попадете в конфликт слиянием, процесс остановится и завершится с ненулевым статусом. Вы можете проверить статус выхода операции переадресации, и, если он отличен от нуля, запустите 'git rebase -abort', чтобы отменить операцию. – Jubobs

+1

Вы нашли способ сделать это? – crmpicco

ответ

25

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

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

git rebase ... || git rebase --abort 
+1

И что, если rebase успешно, но я понимаю, что хочу вернуться? Например, потому что я не хочу нажимать. – bluenote10

+0

@ bluenote10 Вы можете использовать [reflog] в ветке (https://git-scm.com/docs/git-reflog), чтобы сбросить его до фиксации, чтобы указать до переустановки. – Jubobs

4

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

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

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

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

3

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

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

Есть некоторые механики, чтобы понять здесь:

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

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

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

1

Если вы просто хотите увидеть, если перебазироваться будет успешным, но тогда вы хотите, чтобы «откатить» вы можете Alway reposition the branch tip вернуться к первоначальному фиксации. Просто пометьте или запишите оригинальную SHA.

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

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

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

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