Что именно делает git rebase --skip?

107

Я только что сделал, git pull --rebase origin masterи возник конфликт.

Во-первых, этот конфликт был в файле, который я не касался, и было возвращено около 10 коммитов. Почему это происходит?

Затем я случайно набрал git rebase --skip, и он «пропустил этот патч».

Обеспокоенный тем, что я пропустил фиксацию, я проверил новую версию главной ветки и провел различие между веткой, в которой я выполнял перебазирование, и новой главной веткой. Единственные изменения, которые отображаются в различии, - это последняя фиксация, и, глядя в журнал, патч, который был «пропущен», отображается в истории фиксации.

Кто-нибудь может объяснить, что здесь происходит?

mrwooster
источник
11
Как ты случайно набрал git rebase --skip. Может быть, неправильно? :)
manojlds 02
3
Ха! Предполагалось ввести --abort, но по неизвестной причине получилось --skip. На самом деле я не думал. :)
mrwooster 02
9
история оболочки хороша в этом (чтобы заставить вас выполнить то, чего вы не хотели).
Флориан Кляйн

Ответы:

60

Он делает то, что говорит, он пропускает фиксацию. Если вы запустите rebase --abortболее поздний конфликт во время того же перебазирования, пропущенная фиксация, конечно же, будет отменена.

Если ваше изменение уже внесено в апстрим, Git не сможет применить вашу фиксацию (но обычно должен автоматически пропускать его, если патч точно такой же). Ваша собственная фиксация будет пропущена, но изменение все еще будет существовать в текущем HEAD, потому что оно уже было применено выше.

Вам действительно следует убедиться, что вы не удалили важные изменения;) (используйте журнал ссылок, чтобы вернуться в состояние до перебазирования)

вязать
источник
4
Итак, почему фиксация все еще отображается в журнале? И почему отсутствующий коммит теперь отображается в diff?
mrwooster
3
Да, конфликт уже был разрешен в апстриме ... по какой-то причине git rebase вызывает старые конфликты слияния ... еще одна вещь, которая меня смущает? ... означает ли это, что он пропустил конфликт, но применил патч, который разрешил конфликт?
mrwooster
3
Вы пропустили свою собственную фиксацию, которая имела те же изменения, что и предыдущая фиксация. Вы пропустили коммит, но изменение все же было сделано (потому что оно уже существовало в
апстриме
1
@mittal нет, я не думаю, что --skipэто выход. Пропустить полностью пропустит фиксацию, удалив все изменения, сделанные в этой фиксации.
knittl
3
@mittal: думать , git rebaseкак копирование коммитов из одной ветви на другую ветку. Поэтому, когда вы пропускаете фиксацию, исходное содержимое фиксации пропускается и патч не применяется (поэтому все изменения, внесенные в любой файл, не попадут в вашу целевую ветку). Самый простой способ - создать простой репозиторий git с двумя ветвями, несколько коммитов для каждой из них, а затем попытаться перебазировать и пропустить коммит (вы можете использовать, git rebase --interactiveчтобы указать, какие коммиты будут скопированы ( pick) или пропущены ( skip)
knittl