2013-03-19 2 views
0

Представьте меня есть следующая история GIT:изменение истории мерзавец, чтобы включать модифицированный код

a ----- b ----- c 
       HEAD 

где голова на с.

Теперь я нашел ошибку в (a), которая, очевидно, теперь находится в (b) и (c). То, что я теперь хочу сделать, - это изменить код (исправить ошибку) в (a) и хотите обновить то же самое в (b) и (c). Как мне это сделать с git?

Благодаря

+4

Это может быть лучше исправить код и создать новый (г) совершать с этим исправлением против переписывания истории в зависимости от типа ошибки. –

+0

Но если я хочу провести тестирование на моей главной ветке, мне придется вручную редактировать код каждый раз, когда я выхожу (b) или (c) – 0xhacker

+0

За что вы хотите проверить старые коммиты? – Hauleth

ответ

4

Из вашего вопроса, кажется, что вы хотите, чтобы история выглядеть там никогда не была ошибка.
Вы могли бы сделать что-то вроде этого:

  • исправить ошибку в новый, регулярные фиксации. Мы назовем это фиксацией d.
  • Используйте интерактивную скидку: git rebase -i <hash-of-commit-before-a>.
    В появившемся окне редактора вы увидите коммиты a, b, c, d на каждой новой строке с командой (pick) перед ними.
  • Переупорядочить строки так, чтобы строка с новым фиксатором была права после строки, представляющей фиксацию a (должна быть вторая строка).
  • Измените команду infront новой фиксации на squash (вместо pick, которая по умолчанию).
    Это приведет к тому, что ваш новый коммит, d, будет объединен с первым фиксатором, a.

Обратите внимание, что если вы перетащили эти коммиты на другое репо, перезагрузка - плохая идея. В двух словах это связано с тем, что вы на самом деле создаете новые коммиты (с новыми хэшами), а не просто переупорядочиваете существующие. Если кто-то другой вытащил ваш код и основал работу над оригинальными коммитами, когда он снова вытащит, у него будут дубликаты, и ему придется вручную исправить это. См. The perils of rebasing для лучшего объяснения.

2
git rebase -i HEAD~3 

#An editor window will now open showing 3 commits. Replace 'pick' with 'e', save exit. 
#git will now give you a chance to edit last 3 commits. Edit the files to fix the bug, then 

git add -u 
git commit -m"New message" 
git rebase --continue 

#This will repeat 3 times. After that, you will have a new set of last 3 commits (with new sha1 of course). 

BTW после этого момента вы не будете в состоянии сделать «толчок», если ваши 3 совершает уже в пульте дистанционного управления (происхождения). Вам необходимо будет:

git push -f 

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

git stash # save your changes. 
git reset --hard HEAD~3 
git pull 
git stash pop 
+2

Имейте в виду, я решил, что одним из «других» будет бросить ботинок в тех, кто вызвал ситуацию. – millimoose

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