Při práci s Gitem zjistíte, že někdy je třeba závazky odstranit, protože způsobily chybu nebo je třeba je přepracovat.
Pokud ano poslední potvrzení je velmi přímočaré. Jednoduše spusťte:
git reset HEAD^
Tím se vyřadí poslední potvrzení, ale všechny změny souborů zůstanou beze změny.
Pokud potřebujete odstranit více než jen poslední potvrzení, můžete použít dvě metody. První používá rebase, což vám umožní odstranit jeden nebo více po sobě jdoucích závazků, druhým je cherry-pick, který vám umožní odstranit po sobě jdoucí závazky.
Příklad git logu
číslo | Hash | Zpráva o potvrzení | Autor |
---|---|---|---|
1 | 2c6a45b | (HEAD) Přidání veřejné metody pro přístup k chráněné metodě | Tom |
2 | ae45fab | Aktualizace databázového rozhraní | Dodavatel 1 |
3 | 77b9b82 | Zlepšení databázového rozhraní | dodavatel 2 |
4 | 3c9093c | Sloučení vývoje větve do hlavní | Tom |
5 | b3d92c5 | Přidání nového modulu Event CMS | Paul |
6 | 7feddbb | Přidávání třídy a souborů CMS | Tom |
7 | a809379 | Přidání projektu do Gitu | Tom |
Using Rebase
Pomocí výše uvedeného protokolu git chceme odstranit následující revize; 2 & 3 (ae45fab & 77b9b82). Jelikož se jedná o po sobě jdoucí potvrzení, můžeme použít rebase.
git rebase --onto <branch name>~<first commit number to remove> <branch name>~<first commit to be kept> <branch name>
např. K odstranění potvrzení 2 & 3 výše
git rebase --onto repair~3 repair~1 repair
Použití nástroje Cherry Pick
Krok 1: Najděte potvrzení před potvrzením chcete odebrat git log
Krok 2: Pokladna, která spáchá git checkout <commit hash>
Krok 3 : Vytvořte novou větev pomocí aktuálního potvrzení odevzdání git checkout -b <new branch>
Krok 4: Nyní je třeba přidat potvrzení po odebraném potvrzení git cherry-pick <commit hash>
Krok 5: Nyní opakujte krok 4 pro všechny další závazky, které si chcete ponechat.
Krok 6: Jakmile budou všechny závazky přidány do vaší nové pobočky a máte byl spáchán. Zkontrolujte, zda je vše ve správném stavu a zda funguje správně. Znovu zkontrolujte, zda bylo vše potvrzeno: git status
Krok 7: Přepněte na poškozenou větev git checkout <broken branch>
Krok 8: Nyní proveďte tvrdý reset na rozbité větvi ke spáchání před tím, který chcete odebrat git reset --hard <commit hash>
Krok 9: Sloučte své pevná větev do této větve git merge <branch name>
Krok 10: Posuňte sloučené změny zpět do původu. UPOZORNĚNÍ: Toto přepíše vzdálené repo! git push --force origin <branch name>
Proces můžete provést bez vytvoření nové větve nahrazením kroku 2 & 3 krokem 8 a poté neprovádět krok 7 & 9.
Příklad
Řekněme, že chceme odstranit revize 2 & 4 z repo.
-
git checkout b3d92c5
Pokladna za poslední použitelné potvrzení. -
git checkout -b repair
Vytvořte novou větev, na které budete pracovat. -
git cherry-pick 77b9b82
Spustit prostřednictvím potvrzení 3. -
git cherry-pick 2c6a45b
Spustit potvrzení 1. -
git checkout master
Master pokladny. -
git reset --hard b3d92c5
Resetovat master na poslední použitelné potvrzení. -
git merge repair
Sloučit naši novou větev do masteru. -
git push --hard origin master
Push master to the remote repo.
Závěrečná poznámka
Git rebase & cherrypick jsou nebezpečné, ale silné řešení, která by měla být použita pouze jako poslední a může být proveden pouze někým, kdo ví, co dělá. Dávejte pozor, aby obě řešení mohla mít nepříznivé účinky na ostatní uživatele, kteří pracují na stejném úložišti / pobočce.
Nakonec nezapomeňte být opatrní a hodně štěstí!