2015-02-20 5 views
1

Я пытаюсь скворовать последние 3 коммита с использованием autosquash опций, предоставляемых git-rebase. У меня есть следующая история:перезагрузка с автосохранением не работает должным образом

* commit 78a7e4844fa32d2ef1bb7bd9b44c4a1b9551d31a (HEAD, new) 
| Author: maxim koretskyi <[email protected]> 
| Date: Fri Feb 20 10:29:48 2015 +0200 
| 
|  squash! s3 
| 
* commit f25491cadc646baf14bd7e951245c6777230a1d7 
| Author: maxim koretskyi <[email protected]> 
| Date: Fri Feb 20 10:29:42 2015 +0200 
| 
|  squash! s2 
| 
* commit b988237356ffb59752e49049d083c558373f9486 
| Author: maxim koretskyi <[email protected]> 
| Date: Fri Feb 20 10:29:24 2015 +0200 
| 
|  squash! s1 
| 
* commit abbcdc833e5eaabe79681bd82087b4d7969e8599 (new1, ne, 9484) 
| Author: maxim koretskyi <[email protected]> 
| Date: Wed Feb 18 18:21:58 2015 +0200 
| 
|  3 

Так я хочу фиксации с сообщениями s1, s2 и s3 с префиксом squash! быть сжато. Теперь я выполняю следующую команду:

$ git rebase -i abbcdc833 --autosquash 

И так мерзавец открывает текстовый редактор со следующим содержанием:

pick b988237 squash! s1 
pick f25491c squash! s2 
pick 78a7e48 squash! s3 

Но я ожидал, что это будет так:

pick b988237 squash! s1 
squash f25491c squash! s2 
squash 78a7e48 squash! s3 

Что я делаю неправильно?

ответ

9

Из документации, но курсив мой:

Когда сообщение фиксации журнала начинается с "! Кабачки ..." (или "! FixUp ..."), и есть фиксация чье название начинается с того же самого ..., автоматически изменяет список дел rebase -i, так что фиксация , помеченная для раздавливания, появляется сразу после фиксации, которая должна быть изменена, и изменить действие перемещенного фиксации из pick to squash (или исправление). Игнорирует последующие «fixup!» Или «squash!» После первого, в случае, если вы ссылались на более раннее исправление/сквош с помощью git commit --fixup/--squash.

Ваш первый squash! имеет s3 как его ... части. Таким образом, rebase ищет коммит, который имеет s3 как его «заголовок» (это никогда не определяется в документации, но оно, как представляется, означает «однострочное описание», то есть первую строку сообщения журнала). В списке нет таких коммитов.

Переходя к второму, мы находим ту же проблему, а также третью.

Если ваша первая фиксация (с заголовком s1) сопровождалась фиксацией, чей заголовок был squash! s1, этот конкретный человек получил бы слово «squash». .

(Обратите внимание, что git commit --fixup=<id> или git commit --squash=<id> создаст такой «же названием» совершить для вас «игнорирует последующее» вещи, потому что вы можете сделать это во время работы:

git add ...; git commit -m thing1 
... edit ... 
git add ...; git commit -m thing2 
# now fix thing1 bug noticed while working on thing2 
... edit ... 
git add ...; git commit --no-edit --fixup=HEAD^ 
... edit/test some more, discover fixup was not complete 
git add ...; git commit --no-edit --fixup=HEAD 

В этом случае, второй Фиксированная линия fixup! fixup! thing1; rebase просто ищет коммит, чье «название» - thing1, снова.)

+0

спасибо большое! Ты очень помогаешь мне на пути к обучению Гит :). Я пробовал с равным сообщением, и он сделал трюк. Интересно то, что после того, как я переустанавливаю фиксацию после 'abbcd',' squash' не работает. Любая идея, почему это так? –

+0

также упоминается опция 'rebase.autosquash' с exlanation:' Если установлено значение true enable --autosquash по умолчанию. '.Означает ли это, что если этот параметр является «истинным», мне не нужно указывать '-autosquash' с' git rebase', и git автоматически ищет коммит с 'squash!'? –

+0

Чтобы соответствовать теме и автозахватам, чтобы сделать ее, однострочный текст должен быть в наборе команд, которые 'rebase -i' собирается выполнить. Подумайте об этом так: 'rebase -i' сначала делает полный список ничего, кроме команд' pick'. Затем, если автозапуск включен, скрипт rebase ищет строки, которые имеют 'squash!' И 'fixup!' Сразу после части commit-ID. Он берет эти строки и рассматривает их как «инструкции по изменению другой линии выбора». Если для изменения нет линии выбора, инструкции остаются в силе; если * есть * строка выбора для изменения, следуют инструкции. – torek