2016-08-29 4 views
1

Как удалить фиолетовый фиксатор и «Объединить ветвь ...». Я пытаюсь использовать «git rebase -i HEAD ~ x», но не работает.Удалить фиксацию, которая объединена с основной веткой

enter image description here

+1

'but not work.' - Где это происходит, и что такое выход? – BVengerov

+0

@BVengerов фиолетовый фиксация не появляется при запуске «git -rebase -i» – yelliver

+1

Вы попробовали 'git rebase -p -i'? ('-p' для« сохранения слияния ») – VonC

ответ

2

Вы можете сделать этот вид магии с git fast-export (после того, как вы сделали резервную копию вашей рабочей копии): Run git fast-export --no-data --all --full-tree > all_commits в рабочем копия. Затем вы открываете файл all_commits в текстовом редакторе и выполняете поиск «initial commit». Среда вокруг него должна выглядеть следующим образом:

commit refs/heads/master 
mark :110 
author Foo Bar <[email protected]> 1462192582 +0100 
committer Foo Bar <[email protected]> 1462192582 +0100 
data 14 
Initial Commit 
deleteall 
M 100644 b346ed4d2db0c8110fe3104bd155a413b878527c some/file 

commit refs/heads/master 
mark :111 
author Foo Bar <[email protected]> 1462192582 +0100 
committer Foo Bar <[email protected]> 1462192582 +0100 
data 21 
Merge branch 'master' 
from :109 
merge :110 
deleteall 
M 100644 b346ed4d2db0c8110fe3104bd155a413b878527c some/file 
M 100644 4d9af842ccf23b883b234f5ae93d71f11fa285de some/other_file 

commit refs/heads/master 
mark :112 
author Foo Bar <[email protected]> 1462192582 +0100 
committer Foo Bar <[email protected]> 1462192582 +0100 
data 14 
Did some stuff 
from :111 
deleteall 
M 100644 b346ed4d2db0c8110fe3104bd155a413b878527c some/file 
M 100644 d6a0ad80d11b9d376c23d17300ce95d724d050e7 some/other_file 

Вы вырезали, что совершить, путем удаления фиксации блока и настройка ссылок (mark места ссылка на обязательство определить его позже, и from или merge определить родители коммит):

commit refs/heads/master 
mark :111 
author Foo Bar <[email protected]> 1462192582 +0100 
committer Foo Bar <[email protected]> 1462192582 +0100 
data 21 
Merge branch 'master' 
from :109 
deleteall 
M 100644 b346ed4d2db0c8110fe3104bd155a413b878527c some/file 
M 100644 4d9af842ccf23b883b234f5ae93d71f11fa285de some/other_file 

commit refs/heads/master 
mark :112 
author Foo Bar <[email protected]> 1462192582 +0100 
committer Foo Bar <[email protected]> 1462192582 +0100 
data 14 
Did some stuff 
from :111 
deleteall 
M 100644 b346ed4d2db0c8110fe3104bd155a413b878527c some/file 
M 100644 d6a0ad80d11b9d376c23d17300ce95d724d050e7 some/other_file 

чем вы импортировать измененный поток с git fast-import --force < all_commits. После этой операции оскорбительная фиксация исчезла.

Когда что-то пошло не так, вы можете восстановить свои исходные коммиты с помощью git fast-import --force < all_commits.backup, но неплохо было бы создать резервную копию до этой операции.

+0

+1. «сделай такую ​​магию». Этот тип операции обычно не выполняется в типичном рабочем процессе и не изменяет историю (что может быть очень плохо, если другие извлекают из этой ветки). 'Git revert' обычно является более подходящим решением для« отмены »этого фиксации. – g19fanatic

+0

отлично! Это не только может удалить любую фиксацию, но также может изменить электронную почту и информацию и многое другое. Кстати, можете ли вы переустанавливать, объединять или выполнять некоторые сложные операции с помощью git fast-export? – yelliver

+0

И у моего «Initial commit» есть строка «Initial commitdeleteall» без пробела перед «deleteall», это странно? – yelliver

0

вы можете использовать

git reset --hard HEAD~1 

или

git reset --hard <sha1-commit-id> 

Если вы уже толкнул его

git push origin HEAD --force 
+0

, который фиксирует, должен ли я получить ? это фиолетовый бой? – yelliver

+0

вы можете найти его с помощью git log –

+2

Я думаю, что это не отвечает на вопрос, так как @yelliver хочет удалить только одну фиксацию из истории (если я правильно понимаю его вопрос), а 'git reset --hard' удалит все коммиты после . – lucash

0

Вы можете сделать перебазирования фиксаций, которые должны быть preser ved поверх последнего действительного фиксации. Чтобы найти фиксации, необходимо сохранить две ветви tmp_1, tmp_2. HEAD обеих этих ветвей укажет на то, что сохраняются конечные точки коммитов.

Теперь переустановите эти коммиты поверх последнего действительного фиксации. Сила переименует мастера после успешной перезагрузки.

git checkout -b tmp_1 
git checkout -b tmp_2 <sha-of-commit-after-merged-one> 
git checkout -b tmp_3 <sha-of-commit-before-merged-one> 
git rebase --onto tmp3 tmp_2 tmp_1 

После успешного Rebase,

git branch -f master tmp_3

Удалить другие отрасли.

0

Вы можете вернуть этот коммит с помощью следующей команды: мерзавец вернуться < Sha1>

Смежные вопросы