Autor Zpráva
joe
Profil
Ahoj,

poradil by mi někdo, jak se řeší v Gitu vrácení změn zpátky?

Situace: Přišel požadavek na úpravu, z masteru (živá verze) se vytvořila nová větev (ukol), kde vzniklo třeba 10 commitů. Po schválení se změny nasadily (merge ukol do master). Ve větvi master vznikly další commity nesouvisející s úpravou. Teď je na čase odebrat změny a vrátit je zpět (z master odebrat všechny změny ve větvi ukol).

Jak to řešit? :-) Hledám nějaké optimální řešení, snadný postup, atp.

Díky za tip.
juriad
Profil
git rebase -i <číslo commitu odkdy>.
Pak si můžeš vybrat co s jednotlivými commity provést.
Pozor toto přepíše celou historii větve od zmíněného commitu.
Jan Tvrdík
Profil
joe:
Já to nechápu, proč chceš zrušit ty commity ve větvi ukol?
joe
Profil
Commity vyloženě rušit nechci. Chci vrátit stav, chci tam ty staré commity samozřejmě nechat, měnit historii Gitu nechci, navazují na ně další větve.

Zkusím to lépe napsat :) Na produkci se mají nasadit změny, které budou viditelné jen týden. Pak se musí dát z produkce pryč (a třeba rovnou zahodit).

Do masteru se dá větev ukol (obsahuje třeba 10 commitů). Ve větvi master přibydou další commity. Po týdnu chci dát úpravy z větve ukol pryč (commity přidané po nasazení větve ukol chci samozřejmě ponechat :-))

To mám postupovat tak, že na každý commit vytvořený ve větvi ukol dám revert a pojedu od nejnovějších po nejstarší?

Potřebuji udělat tedy něco jako revert branch, ne revert commit.
Keeehi
Profil
Napadá mě vytvořit novou větev z commitu těsně před tím, než byl proveden merge s tou dočasnou větví. To té nové větve překopírovat ty nové commity co příšli po mergi (git cherry-pick) a nakonec z ní udělat master.
joe
Profil
Keeehi:
Těch nových commitů je třeba 50 :-)

Teď je to relativně dobré, pokud v té větvi, kterou chci "odebrat" je do cca 10 commitů, co kdyby tam ale bylo commitů 30 nebo daleko víc? To můžu pak řešit klidně celý den...
Keeehi
Profil
To že jsem napsal překopírovat neznamená, že to budeš ručně modifikovat souboy tak, aby to odpovídlo novým commitům. Stačí si jen vybrat commity které chceš a pomocí cherry-pick se automaticky nakopírují do nové větve. Samozřejmě větší problémy vznikají když při souběžném vývoji ve více větvích vytvoříš konflikty.
Jan Tvrdík
Profil
Zkoušel si revertnout ten merge commit?
Viz http://stackoverflow.com/questions/7099833/how-to-revert-a-merge-commit-thats-already-pushed-to-remote-branch
joe
Profil
Jan Tvrdík:
Prozkoumal jsem situaci a vypadá to, že před nasazením nedošlo ke změnám, takže tam žádný merge commit nevidím :(
Jan Tvrdík
Profil
joe:
Tak příště použij git merge --no-ff a následně můžeš revertnout ten merge commit.
joe
Profil
Jan Tvrdík:
Nevím co ten příkaz znamená, ale podívám se na to a určitě se to bude hodit, díky moc :-) přes příkazovou řádku moc nemerguju, spíš přes GUI - SourceTree / GitExtensions.
Jan Tvrdík
Profil
joe:
Jinak koukám, že ještě nikdo nezmínil, že revert umí vracet i více commitů, viz druhý příklad v dokumentaci. Ale revertovat celý merge bude většinou jednodušší řešení.

Vaše odpověď

Mohlo by se hodit

Příspěvky nesouvisející s webem budou odstraněny.

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: