git reset hard and push

Fórumok

"git reset --hard sha1" paranccsal egy korábbi állapotra álltam vissza. (local master branch 2 lépéssel korábbi verzióra visszaállítva, remote branch-el szeretném szinkronizálni)

A git push parancs viszont nem működik.

"git push origin master" command

Username for 'https://github.com': freeroute
Password for 'https://freeroute@github.com':
To https://github.com/freeroute/best-repo.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/freeroute/best-repo.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

"git push --force" command:

Username for 'https://github.com': freeroute
Password for 'https://freeroute@github.com':
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/freeroute/best-repo.git
+ 13121d9...34e43ca master -> master (forced update)

Így szinronizálva lett a local master és az origin/master.
Kérdésem, hogy ez volt a megfelelő ("git push --force") parancs?

Köszönöm,

Hozzászólások

> Kérdésem, hogy ez volt a megfelelő ("git push --force") parancs?

Attól függ, mit szerettél volna elérni :)

Igen, helyes volt, mert így a remote branch pont azt az állapotot vette fel, ami nálad, lokálban van.

Nem, nem volt helyes, mert (D)VCS-ben nem illik átírni a historyt. Nem illik, mert ha valaki más is dolgozik errefelé, akkor nála eléggé meg fogja kavarni a dolgokat. Ha csak egyszerűen reset-et nyomtál, akkor a másik emberhez az szerintem nem fog lecsorogni (mert a remoteon az nem mint későbbi commit jelenik meg), s ha figyelmetlen, ő újra fel fogja pusholni. Ha kicsit extrémebben írod át a historyt, akkor meg nagyon szép conflictokat generálhat a túloldalon.

Szóval tényleg attól függ, mit szerettél volna elérni :). Másképp nem tudtál volna a remoteon resetet mondani, de nem biztos, hogy ez egy jó lépés.

2 lépéssel korábbi állapotra szeretnék visszaállni.
Próbáltam a " git reset --soft SHA1", "git reset --mixed SHA" parancsokat is.

Mindhárom esetben a "git push" paranccsal nem engedte a szinkronizálást az origin/master ággal. Az üzenet ugyanez volt.

Ha ez bezavarhat a többi contributor felé, akkor ilyenkor ezt hogy lehet megoldani, hogy ne legyen galiba belőle?

Több megoldás is létezik arra amit szeretnél: http://christoph.ruegg.name/blog/git-howto-revert-a-commit-already-push…

1. Manuálisan visszacsinálod kézzel a változtatásokat és létrehozol egy új commitot (ezzel nem okozol fejfájást másoknak)

2. Revertelsz egy korábbi commit-ra, ebben az esetben is létre jön egy új commit (ezzel sem okozol fejfájást másoknak)

3. Átírod a commit history-t. Na ez volt az amit te csináltál. Amíg egyedül dolgozol a BRANCH-on ez nem probléma, de amint mások is elkezdik használni ezt a BRANCH-ot elég nagy galibákat tudsz okozni.
Ezt inkább a legvégső esetben használd, mondjuk akkor ha tényleg szeretnél egy commit-ot teljesen eltávolítani a history-ból, mert mondjuk egy jelszót véletlen commitoltál.

Eddig úgy tudtam, hogy a "git revert" akkor használjuk, ha a legutóbbi változtatást szeretnénk visszavonni.

"Sometimes you may want to undo a whole commit with all changes. Instead of going through all the changes manually, you can simply tell git to revert a commit, which does not even have to be the last one. Reverting a commit means to create a new commit that undoes all changes that were made in the bad commit."

Ezek szerint bármelyik sha1 pillanatképre vissza lehet állni vele?

Köszönöm a hozzászólásokat, jól jött a segítség.

A git revert bármelyik commit általi változtatást visszacsinálja. Nem tünteti el, nem teszi meg nem történtté. Visszacsinálja:

"... Reverting a commit means to create a new commit that undoes all changes that were made in the bad commit."

Ezek szerint bármelyik sha1 pillanatképre vissza lehet állni vele?"

A pont általad idézett dokumentáció szerint nem :)

"Ha ez bezavarhat a többi contributor felé, akkor ilyenkor ezt hogy lehet megoldani, hogy ne legyen galiba belőle?"

1. Egy commit törlése és egy commit változtatásainak visszacsinálása két alapvetően különböző dolog. Utóbbira lásd

git revert

; a master branch esetén az jobb választás lett volna.
2. Kommunikálni kell. A history átírása általánosságban nem ördögtől való, ha szervezett keretek között történik. Pl. a Git projekt repositoryjában is néhány naponta újraírják a history egy részét, igaz csak az integrációs és feature brancheket.

Bár azt csinálta, amit szerettél volna, nem mondanám helyesnek.

A '

git push origin master

' parancs explicit megadja, hogy hova és mit akarsz push-olni. A '

git push --force

' parancsban ezt nem mondod meg, így ez függ helyi aktuális branch-tól és több konfig változó értékétől is. Lásd a három "When ..." kezdetű bekezdést.