2014-01-30 6 views
4

После того, как я сыграл с пультом, я закончил с удвоением всех моих коммитов. Например. вместоGit удалить повторяющиеся коммиты

C3107 
.. 
C3 
C2 
C1 

Я получил

C3107 
C3107 
.. 
C3 
C3 
C2 
C2 
C1 
C1 

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

Есть ли способ удалить повторяющиеся коммиты и не потерять те, что я добавил?

P.S .: Если это поможет, у меня есть копия репозитория перед моими экспериментами с пультом.

Большое спасибо.

ОБНОВЛЕНИЕ Как многие из вас спросили, как это получилось: у меня есть репо R1, тогда я создал еще один R2. В моей локальной копии, которая была в курсе R1, я изменил происхождение на R2 и попытался нажать, но некоторые большие файлы были отклонены github. Так что я сделал git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename', который сделал git думаю, что репозитории разные. Затем я подтолкнул всех к R2, сделав некоторые коммиты, и решил снова вернуться к R1, изменив исходное положение и нажав. Затем я добавил еще несколько коммитов в R1.

+0

По умолчанию Git не позволяет по-настоящему дублировать фиксации, т. Е. Совершает одно и то же дерево и предыдущее. Пропустили ли вы '-allow-empty'' git commit'? –

+0

Обновлен мой вопрос с подробностями о том, как я напортачил свое репо. –

+0

У меня такая же проблема. Я подозреваю, что это было вызвано автоматическим слиянием.Я использую следующие команды для его решения (избавьтесь от фиксации слияния и сохраните коммиты до и после него, но Committer и Commit Date будут обновлены из-за создания новых коммитов): 'git checkout -b tmpBranchBeforeErrorMerge oldHashBeforeErrorMerge; git rebase --onto tmpBranchBeforeErrorMerge oldHashBeforeErrorMerge headLastestHash; git branch -b new_master; git branch -d master; git branch -D tmpBranchBeforeErrorMerge; git branch -m new_master master; git push -v -set-upstream origin master: master -f' – samm

ответ

0

конец я решил в пользу Cherrypicking.

6

С небольшим количеством магии оболочки, grepping и большой уверенностью, тогда ответ, вероятно, «да». Но я был бы слишком осторожен, чтобы полностью испортить вещи, чтобы раздавить более 3000 коммитов с помощью одной команды!

Однако вы можете сделать это (умеренно) в интерактивном режиме, используя interactive rebasing. Это немного сложно, но у вас есть хороший контроль над тем, что происходит, и вы получаете хорошую обратную связь от git.

+0

+1 за то, что он защищает все, как есть – eckes

+0

Это действительно не так сложно. Люди сквош фиксируют все время. Это то, как вы храните журнал фиксации от повторения «проверки безопасности» снова и снова, когда люди делают частые коммиты по причинам резервного копирования. – joel3000

+0

Это другой вопрос. Но так как вы здесь .. Я предлагаю либо «git add» (и использовать для этого промежуточную область), либо 'git commit -amend'. Не поддавайтесь соблазну подтолкнуть вашу резервную копию к центральному репозиторию. Это просто не нужно. –

4

мерзавец перебазироваться -i #commit идентификатор, где вы хотите начать давя #

Это вызовет интерактивный сеанс. Переключайте все, кроме первого фиксации в стеке, до fixup или squash.

pick 07520cd Caught file exists issue. # this is last commit 
fixup 3b71b9f Added README.   # fixup will squash the commit 

# Rebase b041966..3b71b9f onto b041966 
# 
# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# f, fixup = like "squash", but discard this commit's log message 
# x, exec = run command (the rest of the line) using shell 
# 
# These lines can be re-ordered; they are executed from top to bottom. 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# 
# However, if you remove everything, the rebase will be aborted. 
# 
# Note that empty commits are commented out 

У меня есть git koan (koan 8), который проходит через git rebase -i.

https://github.com/jbremson/git_koans (работа в процессе)

~

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