Autor Zpráva
Taps
Profil
Zdravím, začínám s gitem. Změny v souborech jsem commitnul a poté pushnul, ale zjistil jsem že pushnutí jsem provedl do špatného umístění. Je možné pushnutí (commity) vrátit zpět ? Případně poslední kroky (commit a push) zcela resetovat.

Děkuji
Sir Tom
Profil
Taps:
Také zdravím,

vytvoř si nový repozitář, do kterého naklonuješ data z tohoto špatného umístění a tento svůj repozitář pushni do správného umístění. Commit & push by zpět nedával - je to proti logice verzovacího systému. Můžeš se ale pochopitelně vrátit do jakéhokoliv předchozího commitu.
Taps
Profil
Sir Tom:
Díky za tip, bylo by možné aby jsi mi napsal konkrétní příkazy ? Ty jsi určitě více zkušenější
Jan Tvrdík
Profil
Taps:
zjistil jsem že pushnutí jsem provedl do špatného umístění
Jako že se ti omylem pushnul do jiného vzdáleného repozitáře? Např. poslední tři pushnuté commity můžeš zrušit příkazem
git push origin HEAD~3:master --force
Ten doslova říká „Pushni do vzdáleného repositáře, který se jmenuje origin, do větve, která se jmenuje master, před-před-před-poslední commit a zcela ignoruj to, co už momentálně v tom vzdáleném repositáři je.“
Sir Tom
Profil
Taps:
Nevím, zda-li jsem pochopil přesně situaci, ale řekněme, že máš 2 projekty (pA, pB) a každý má svůj git repozitář (rA, rB). Předpokládejme, že data projektu A jsou i na repozitáři A - stejně jako projekt B je i na repozitáři B.
Nějakým stylem se ti povedlo pushnout commity pA do rB. Tím pádem už rB != pB, ale pA = rB (popř. = rA). Je toto nynější stav? Jestli ano, tak si můžeš stáhnout rB a přejít do commitu, který byl před stavem nahráním pA do rB.

Snad jsem to nenapsal moc komplikovaně...

Řešení Jan Tvrdík je také dobré, nicméně mně se nelíbí ono "rušení commitů". Co když náhodou zruším něco, co je potřeba?

Jan Tvrdík
Pushni do vzdáleného repositáře, který se jmenuje origin, do větve, která se jmenuje master, před-před-před-poslední commit a zcela ignoruj to, co už momentálně v tom vzdáleném repositáři je.
Asi off-topic, ale ty 3 commity se počítají jen mé commity, nebo i ostatních uživatelů? (Ptám se, protože takto můžu "zrušit" práci jiného uživatele (resp. ne jeho práci, ale jeho commit)).
juriad
Profil
Sir Tom:
Přečti si o tom, jak v gitu fungují větve. Jedná se jen o ukazatele na nějaký commit. Nic se neruší, všechno v gitu zůstává; git reset jen posune ten ukazatel na jiný commit; to že následující commity budou uživatelsky nepřístupné, to je jiná otázka. Pokud v HEAD vytvoříš novou větev a následně svoji resetneš 3 commity dozadu, tak ty tři comity pořádku budou přístupné přes druhou větev. Seznam všech nedávných lokací, můžeš zjistit pomocí git reflog a tedy můžeš obnovit libovolný stav.
Jan Tvrdík
Profil
Sir Tom:
ale ty 3 commity se počítají jen mé commity, nebo i ostatních uživatelů?
Git nedělá rozdíly mezi tím, kdo commity tvoří.

Co když náhodou zruším něco, co je potřeba?
Proto máš na krku hlavu, abys dával pozor, co zrušíš.

juriad:
Nic se neruší, všechno v gitu zůstává
Tak to pozor, tohle není úplně pravda. Git obsahuje garbage collector, který nepřístupné commity časem definitivně smaže. Nesprávné použití přepínače --force můžu skutečně v krajním případě vést ke ztrátě dat.
Sir Tom
Profil
juriad:
Samozřejmě, že přes větve to lze vyřešit. V tomto případě by větev sloužila de facto jako "záloha" a nikoliv jako "vývoj".

Jan Tvrdík:
Proto máš na krku hlavu, abys dával pozor, co zrušíš.
Ach ta moje hlava. :) Myslel jsem to tak, verzovací systém by už sám ze své logiky zajišťovat, aby se projekt nikdy nedostal do takového stavu, kde by byla navždy a nenávratně ztracená data.
Amunak
Profil
Sir Tom:
To on ale zajišťuje, akorát dává pokročilým uživatelům i možnosti jak to překonat, když je třeba.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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