Ako upraviť existujúce, neodoslané správy o revízii?

V správe o revízii som napísal nesprávnu vec.

Ako môžem správu zmeniť? Revízia ešte nebola odoslaná.

Riešenie

Zmena poslednej správy o revízii

git commit --amend

otvorí váš editor, ktorý vám umožní zmeniť správu o odovzdaní poslednej revízie. Okrem toho môžete správu o odovzdaní nastaviť priamo v príkazovom riadku pomocou:

Jazyk: bash -->

git commit --amend -m "New commit message"

...to však môže spôsobiť, že zadávanie viacriadkových správ o odovzdaní alebo malých opráv bude ťažkopádnejšie.

Pred týmto postupom sa uistite, že nemáte žiadne zmeny pracovnej kópie staged, inak budú tiež odovzdané. (Zmeny nezastavené sa neodovzdajú.)

Zmena správy o revízii, ktorú ste'už odoslali do vzdialenej vetvy

Ak'ste už posunuli svoju revíziu do vzdialenej vetvy, potom budete musieť vynútiť posunutie revízie pomocou:

git push   --force
# Or
git push   -f

Varning: force-pushing prepíše vzdialenú vetvu stavom vašej lokálnej vetvy. Ak sú vo vzdialenej vetve revízie, ktoré nemáte vo svojej lokálnej vetve, o tieto revízie prídete.

Upozornenie: buďte opatrní pri zmene revízií, ktoré ste už zdieľali s inými ľuďmi. Zmena revízií ich v podstate prepíše tak, aby mali iné SHA ID, čo predstavuje problém, ak majú iní ľudia kópie starých revízií, ktoré ste prepísali. Každý, kto má kópiu starej revízie, bude musieť synchronizovať svoju prácu s vašou novo prepísanou revíziou, čo môže byť niekedy ťažké, takže sa uistite, že pri pokuse o prepísanie zdieľanej histórie revízií sa koordinujete s ostatnými, alebo sa jednoducho vyhnite prepisovaniu zdieľaných revízií úplne.


Používajte interaktívne rebase

Ďalšou možnosťou je použiť interaktívne rebase. To vám umožní upraviť akúkoľvek správu, ktorú chcete aktualizovať, aj keď to nie je najnovšia správa.

Ak chcete vykonať skvasenie Git, postupujte podľa týchto krokov:

// X is the number of commits to the last commit you want to be able to edit
git rebase -i HEAD~X

Po squashovaní revízií - vyberte e/r pre úpravu správy:

Dôležitá poznámka o interaktívnom rebase

Pri použití git rebase -i HEAD~X môže byť viac ako X revízií. Git "zhromaždí" všetky revízie v poslednom rozsahu X revízií, a ak došlo k zlúčeniu niekde medzi týmto rozsahom, uvidíte aj všetky revízie, takže výsledok bude X+.

Dobrý tip:

Ak to musíte urobiť pre viac ako jednu vetvu a pri zmene obsahu by ste mohli naraziť na konflikty, nastavte git rerere a nechajte systém Git, aby tieto konflikty vyriešil automaticky za vás.


Dokumentácia

Komentáre (32)
git commit --amend -m "your new message"
Komentáre (15)

Ak revízia, ktorú chcete opraviť, nie je najnovšia:

  1. git rebase --interactive $parent_of_flawed_commit

    Ak chcete opraviť niekoľko chybných revízií, odovzdajte rodiča najstaršej z nich.

  2. Zobrazí sa editor so zoznamom všetkých revízií od tej, ktorú ste zadali.

    1. Pred všetkými revíziami, ktoré chcete opraviť, zmeňte pick na reword (alebo v starších verziách systému Git na edit).
    2. Po uložení systém Git znovu prehrá uvedené revízie.

  3. Pre každú revíziu, ktorú chcete opraviť, vás Git pustí späť do editora. Pre každú revíziu, ktorú chcete editovať, vás Git hodí do shellu. Ak ste v shelli:

    1. Zmeňte revíziu ľubovoľným spôsobom.
    2. git commit --amend
    3. git rebase --continue

Väčšinu z tejto postupnosti vám vysvetlí výstup jednotlivých príkazov, keď budete postupovať. Je to veľmi jednoduché, nemusíte si to pamätať - stačí si zapamätať, že git rebase --interactive vám umožňuje opravovať revízie bez ohľadu na to, ako dávno boli vykonané.


Všimnite si, že nebudete chcieť meniť revízie, ktoré ste už odoslali. Alebo možno chcete, ale v tom prípade budete musieť veľmi starostlivo komunikovať s každým, kto možno stiahol vaše revízie a vykonal nad nimi prácu. Ako obnoviť/resynchronizovať po tom, čo niekto tlačí rebase alebo reset do publikovanej vetvy?

Komentáre (15)