нельзя использовать git rebase -i

На вопрос: Как удалить фиксацию на GitHub?

Я не могу использовать то же решение в своем проекте.

Я хочу перейти к коммиту 30735f3d по команде:

git rebase -i HEAD~2


*   823da1cf7976466da40a5720191d09b080e046d6 Merge branch 'hotfix#1-issue
|\  
| * 71b732ef9ecbf36153ab2729cc78bc522341399e fixed: changed salary type f
|/  
*   be87e784da99fbad8b575b5433bb33a35954064c Merge branch 'dev'
|\  
| *   90b23296a3a6c2883f2c434947da4896d8afef5c Merge branch 'issue#2240' 
| |\  
|/ /  
| * 947b43b12763acbd0ca2733f0fd88e3882c086ab issue#2240:create user class
|/  
*   30735f3d4884c4156a070f75dbc5ae3608f9c312 Merge branch 'dev'
|\  
| * 88b06701fc4a66511da3096b2383c8c26ea2e203 added field salaryDefault,bo
| * d364b0b381ed099e48b614955996696dbe39bba4 added entity start salary
|/  
*   4de63ced11d978e10f5c81cc23e743fbe06ea9cc Merge branch 'dev'
|\  
| * f16c849b25028a376dbdf03b5d0aaee0b3966d74 setup persistence
|/  
* cb88a650a26905d6a911706bda609162338c57ed init

после перебазирования некоторых из вышеперечисленных коммитов, которые остаются, например. исправлено: изменен тип зарплаты f, issue#2240: создать пользовательский класс

* 12f20a44e3ea7eaf34ca62fb6a7a51f5729bcba1 fixed: changed salary type from int t
* 947b43b12763acbd0ca2733f0fd88e3882c086ab issue#2240:create user class
*   30735f3d4884c4156a070f75dbc5ae3608f9c312 Merge branch 'dev'
|\  
| * 88b06701fc4a66511da3096b2383c8c26ea2e203 added field salaryDefault,bonus,tax
| * d364b0b381ed099e48b614955996696dbe39bba4 added entity start salary
|/  
*   4de63ced11d978e10f5c81cc23e743fbe06ea9cc Merge branch 'dev'
|\  
| * f16c849b25028a376dbdf03b5d0aaee0b3966d74 setup persistence
|/  
* cb88a650a26905d6a911706bda609162338c57ed init

Но я хочу такой результат:

*   30735f3d4884c4156a070f75dbc5ae3608f9c312 Merge branch 'dev'
|\  
| * 88b06701fc4a66511da3096b2383c8c26ea2e203 added field salaryDefault,bonus,tax
| * d364b0b381ed099e48b614955996696dbe39bba4 added entity start salary
|/  
*   4de63ced11d978e10f5c81cc23e743fbe06ea9cc Merge branch 'dev'
|\  
| * f16c849b25028a376dbdf03b5d0aaee0b3966d74 setup persistence
|/  
* cb88a650a26905d6a911706bda609162338c57ed init

И теперь у меня есть только мастер ветки. Или это про --no-ff или что-то еще?


person user1162226    schedule 21.02.2012    source источник
comment
30735f это только HEAD~2 (второй первый родитель). Какой коммит вы действительно хотите удалить?   -  person knittl    schedule 22.02.2012
comment
ОК, я понимаю, но когда я использую HEAD~2, некоторые из лучших коммитов остаются, например, фиксированными: изменен тип зарплаты f , issue#2240: создать пользовательский класс   -  person user1162226    schedule 22.02.2012


Ответы (2)


Если ваш пример «результата, который вы хотите» действительно точен, сделайте git reset --hard 30735f3d4884c4156a070f75dbc5ae3608f9c312 и все готово.

person Borealid    schedule 21.02.2012
comment
Я также хочу удалить фиксацию по происхождению - person user1162226; 22.02.2012
comment
@user1162226 user1162226 По указанной вами ссылке запустите git push origin +master после сброса. - person Borealid; 22.02.2012

Если вы просто хотите изменить фиксацию, на которую указывает ветка, вам необходимо выполнить сброс.

git reset --hard 30735f3d4884c4156a070f75dbc5ae3608f9c312

Однако это отставит вас в истории по сравнению с происхождением. В результате вы не можете просто нажать. Приходится принудительно нажимать.

git push -f происхождение

Проблема с этим вот в чем. Если у других разработчиков есть локальные копии этой ветки, каждый из них должен расставить точки.

git fetch
git reset --hard origin/<branch>

Это усложнится, если у них есть локальные коммиты, которые им нужно сохранить, так как приведенная выше команда будет означать, что они их потеряют. Как правило, изменять историю, которой уже поделились с другими, не рекомендуется.

В качестве альтернативы, если это код, которым другие разработчики уже поделились с вами, вы можете использовать `git-revert', чтобы «отменить» все эти коммиты слияния после того, как вы хотите.

git revert 823da1cf7976466da40a5720191d09b080e046d6
git revert be87e784da99fbad8b575b5433bb33a35954064c

Это создаст два коммита "revert", которые отменят изменения, внесенные этими коммитами слияния. Сделайте так, чтобы ваша история выглядела так.

*   ######################################## Revert be87e78 Merge branch 'dev'
*   ######################################## Revert 823da1c Merge branch 'hotfix#1-issue
*   823da1cf7976466da40a5720191d09b080e046d6 Merge branch 'hotfix#1-issue
|\  
| * 71b732ef9ecbf36153ab2729cc78bc522341399e fixed: changed salary type f
|/  
*   be87e784da99fbad8b575b5433bb33a35954064c Merge branch 'dev'
|\  
| *   90b23296a3a6c2883f2c434947da4896d8afef5c Merge branch 'issue#2240' 
| |\  
|/ /  
| * 947b43b12763acbd0ca2733f0fd88e3882c086ab issue#2240:create user class
|/  
*   30735f3d4884c4156a070f75dbc5ae3608f9c312 Merge branch 'dev'

Это вы можете подтолкнуть, и каждый может вытащить — это будет то же состояние кода, которое существовало в 30735f3d4884c4156a070f75dbc5ae3608f9c312.

Важно

Если вы решили отменить коммиты слияния, знайте, что происходит на самом деле. Если вы хотите повторно ввести изменения из отмененных слияний, вам нужно будет отменить возвратные коммиты. Прочитайте это ответ от меня на другой вопрос, касающийся возврата и слияния коммитов.

person eddiemoya    schedule 22.04.2013