Napsal jsem špatnou věc do zprávy.
Jak mohu změnit zprávu? Tento příkaz ještě nebyl zatlačen.
git commit --amend
otevře editor, který vám umožní změnit zprávu o potvrzení posledního potvrzení. Můžete také nastavit zprávu potvrzení přímo v příkazovém řádku s:
git commit --amend -m "New commit message"
… Nicméně, toto může dělat multi-řádkové potvrzovací zprávy nebo malé opravy více těžkopádný vstoupit.
Ujistěte se, že nemáte žádné změny v pracovní kopii staged předtím, než tak učiníte, nebo se vám také dostanou. (Nestabilní změny nebudou potvrzeny.)
Pokud jste již svůj závazek posunuli do vzdálené větve, musíte nutit Push Push commit s:
git Push <remote> <branch> --force
# Or
git Push <remote> <branch> -f
Varování: vynucení síly přepíše vzdálenou větev stavem vašeho lokálního . Pokud se ve vzdálené pobočce vyskytnou provize, které ve vaší místní pobočce nemáte, ztratíte tyto příkazy bude.
Upozornění: buďte opatrní při úpravách, které jste již sdíleli s ostatními lidmi. Amending pověří v podstatě přepíše, že mají různé SHA ID, což představuje problém, pokud mají ostatní lidé kopie starého závazku, který jste přepsali. Každý, kdo má kopii starého potvrzení, bude muset synchronizovat svou práci s nově přepisovaným potvrzením, což může být někdy obtížné, takže se ujistěte, že se při pokusu o přepsání historie sdílených odevzdání koordinujete s ostatními, nebo se jen vyhnete přepsání sdílených komitací celkem.
Další možností je použít interaktivní rebase.
To vám umožňuje upravit libovolnou zprávu, kterou chcete aktualizovat, i když se nejedná o poslední zprávu.
Chcete-li udělat git squash, postupujte takto:
// X is the number of commits to the last commit you want to be able to edit
git rebase -i HEAD~X
Jakmile squash vaše pověření - zvolte e/r
pro editaci zprávy
Při použití git rebase -i HEAD~X
může být více než X
potvrzuje. Git bude "sbírat" všechny provize v posledním X
potvrzuje, a pokud došlo ke sloučení někde mezi tímto rozsahem uvidíte všechny provize stejně tak výsledek bude X +.
Pokud to musíte udělat více než jednu pobočku a při změně obsahu můžete čelit konfliktům, nastavte git rerere
a nechte git, aby tyto konflikty automaticky vyřešil.
git commit --amend -m "your new message"
Pokud potvrzení, které chcete opravit, není poslední:
git rebase --interactive $parent_of_flawed_commit
Pokud chcete opravit několik chybných provizí, předejte rodiče nejstarší z nich.
Vyjde editor s seznamem všech závazků od té, kterou jste zadali.
pick
na reword
(nebo na staré verze Git, na edit
) před jakýmikoli komitacemi, které chcete opravit.Pro každý příkaz, který chcete reword , vás Git vrátí zpět do editoru. Pro každý příkaz, který chcete editovat , vás Git vloží do prostředí Shell. Pokud se nacházíte v prostředí Shell:
git commit --amend
git rebase --continue
Většina této posloupnosti vám bude vysvětlena výstupem různých příkazů. Je to velmi snadné, nemusíte si to zapamatovat - jen nezapomeňte, že git rebase --interactive
vám umožňuje opravovat se bez ohledu na to, jak dlouho byli.
Všimněte si, že nebudete chtít změnit potvrzuje, že jste již tlačili. Nebo možná uděláte, ale v tom případě budete muset věnovat velkou pozornost komunikaci s každým, kdo si možná stáhl vaše závazky a udělal práci na nich. Jak mohu obnovit/resynchronizovat poté, co někdo stiskne rebase nebo reset na publikovanou větev?
Chcete-li změnit předchozí potvrzení, proveďte požadované změny a proveďte tyto změny a poté spusťte
git commit --amend
Otevře se soubor v textovém editoru, který představuje novou zprávu o potvrzení. Začíná být naplněn textem ze staré zprávy. Změnit zprávu potvrzení, jak chcete, soubor uložte a ukončete editor dokončete.
Chcete-li změnit předchozí potvrzení a zachovat stejnou zprávu protokolu, spusťte
git commit --amend -C HEAD
Chcete-li opravit předchozí potvrzení úplným odebráním, spusťte
git reset --hard HEAD^
Pokud chcete upravit více než jednu zprávu o potvrzení, spusťte
git rebase -i HEAD~commit_count
(Nahradit commit_count s počtem povelů, které chcete upravit.) Tento příkaz spustí editor. Označte první příkaz (ten, který chcete změnit) jako „upravit“ místo „vybrat“, poté uložte a ukončete editor. Proveďte změnu, kterou chcete provést a poté spusťte
git commit --amend
git rebase --continue
Poznámka: "Změnu, kterou chcete provést" můžete také provést v editoru, který otevřel git commit --amend
Jak již bylo zmíněno, git commit --amend
je způsob, jak přepsat poslední potvrzení. Jedna poznámka: chcete-li také přepsat soubory , příkaz by byl
git commit -a --amend -m "My new commit message"
Můžete také použít git filter-branch
.
git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD
Není to tak jednoduché jako triviální git commit --amend
, ale je to obzvláště užitečné, pokud již máte nějaké falešné zprávy po chybné zprávě.
Všimněte si, že toto se pokusí přepsat KAŽDÝ úkol mezi HEAD
a chybným potvrzením, takže byste měli zvolit příkaz msg-filter
velmi moudře ;-)
Dávám přednost tomuto způsobu.
git commit --amend -c <commit ID>
V opačném případě dojde k novému potvrzení s novým ID potvrzení
Pokud používáte nástroj Git GUI, je zde tlačítko s názvem "last last commit". Klikněte na toto tlačítko a poté se zobrazí vaše poslední soubory potvrzení a zprávy. Stačí upravit tuto zprávu a můžete ji potvrdit novou zprávou.
Nebo použijte tento příkaz z konzoly/terminálu:
git commit -a --amend -m "My new commit message"
Můžete použít Git rebasing . Například, pokud chcete změnit zpět na potvrzení bbc643cd, spusťte
$ git rebase bbc643cd^ --interactive
Ve výchozím editoru upravte příkaz „pick“ na „edit“ v řádku, jehož potvrzení chcete změnit. Proveďte své změny a poté je stáhněte
$ git add <filepattern>
Nyní můžete použít
$ git commit --amend
upravit závazek a poté
$ git rebase --continue
vrátit se zpět do předchozí hlavy.
Pokud chcete změnit pouze poslední zprávu o potvrzení, proveďte následující kroky:
git commit --amend
To vás přenese do textového exitoru a umožní vám změnit poslední zprávu.
Chcete-li změnit poslední 3 zprávy o potvrzení nebo některou z potvrzovacích zpráv až do tohoto bodu, zadejte příkaz HEAD~3
do příkazu git rebase -i
:
git rebase -i HEAD~3
Pokud musíte změnit starou zprávu o potvrzení na více pobočkách (tj. Potvrzení s chybnou zprávou je přítomno ve více pobočkách), můžete použít:
git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all
Git vytvoří dočasný adresář pro přepisování a dodatečné zálohování starých odkazů v refs/original/
.
-f
bude vynucovat provádění operace. To je nutné, pokud je dočasný adresář již přítomen, nebo pokud jsou již odkazy uložené v souboru refs/original
. Pokud tomu tak není, můžete tuto vlajku zrušit.
--
odděluje možnosti větve filtru od možností revize.
--all
zajistí, že všechny větve a tagy budou přepsány.
Díky zálohování vašich starých referencí se můžete snadno vrátit do stavu před provedením příkazu.
Řekněme, že chcete obnovit svůj master a přistupovat k němu ve větvi old_master
:
git checkout -b old_master refs/original/refs/heads/master
Použití
git commit --amend
Abychom to podrobně pochopili, vynikající post je 4. Přepisování historie gitů. To také mluví o kdy nepoužít git commit --amend
.
Máte zde několik možností. Můžete dělat
git commit --amend
pokud je to váš poslední závazek.
V opačném případě, pokud to není váš poslední závazek, můžete vytvořit interaktivní rebase,
git rebase -i [branched_from] [hash before commit]
Pak uvnitř interaktivní rebase jednoduše přidáte editaci do tohoto potvrzení. Když to přijde udělat git commit --amend
a upravit zprávu potvrzení. Pokud se chcete vrátit zpět před tímto potvrzovacím bodem, můžete také použít git reflog
a smazat tento potvrzení. Pak stačí udělat git commit
znovu.
Pokud používáte grafické uživatelské rozhraní Git, můžete poslední potvrzení, které nebylo stisknuto, změnit:
Commit/Amend Last Commit
Pokud je to vaše poslední potvrzení, jen změnit potvrzení:
git commit --amend -o -m "New commit message"
(pomocí příznaku -o
(--only
) se ujistěte, že změníte pouze zprávu o potvrzení)
Pokud se jedná o pohřbený zápis, použijte úžasnou interaktivní rebase :
git rebase -i @~9 # Show the last 9 commits in a text editor
Vyhledejte požadovaný příkaz, změňte pick
na r
(reword
) a soubor uložte a zavřete. Hotovo!
Miniaturní vim tutoriál (nebo, jak se znovu sestavit pouze s 8 stisknutí kláves) 3j
cw
r
EscZZ
):
vimtutor
h
j
k
l
odpovídají pohybovým klávesám ←↓↑→3j
posunuje o 3 řádky dolůi
pro vložení režimu vkládání - text, který zadáte, se zobrazí v souboruc
režim vkládání ukončíte a vrátíte se do normálního režimuu
vrátit zpětr
opakovatdd
, dw
, dl
smazat řádek, slovo nebo písmenocc
, cw
, cl
změnit řádek, slovo nebo písmeno, resp dd
i
)yy
, yw
, yl
kopírovat ("yank") řádek, slovo nebo dopis, respp
nebo P
vložit po nebo před aktuální pozici:w
Enter pro uložení (zápis) souboru:q!
Enter ukončit bez uložení:wq
Enter nebo ZZ
uložit a ukončitPokud text upravujete hodně, přepněte na rozložení klávesnice Dvořák, naučte se dotykový typ a naučte se vim. Stojí to za námahu? Ano.
ProTip ™: Nebojte se experimentovat s „nebezpečnými“ příkazy, které přepisují historii * - Git standardně neodstraní vaše potvrzení po dobu 90 dnů; najdete je v reflogu:
$ git reset @~3 # go back 3 commits
$ git reflog
c4f708b [email protected]{0}: reset: moving to @~3
2c52489 [email protected]{1}: commit: more changes
4a5246d [email protected]{2}: commit: make important changes
e8571e4 [email protected]{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started
* Dávejte si pozor na volby jako --hard
a --force
ačkoli - mohou vyřadit data.
* Také nezapisujte historii do všech poboček, na kterých spolupracujete.
Používám Git GUI co nejvíce, a to vám dává možnost změnit poslední potvrzení:
Také, git rebase -i Origin/master
is je pěkná mantra, která vám vždy předvede, co jste udělali na vrcholu mistra, a dá vám možnost změnit, odstranit, změnit pořadí nebo squash. Nejdřív se nemusíte držet toho hash.
Wow, takže existuje mnoho způsobů, jak toho dosáhnout.
Dalším způsobem, jak toho dosáhnout, je odstranit poslední potvrzení, ale zachovat jeho změny tak, abyste neztratili svou práci. Poté můžete provést další potvrzení s opravenou zprávou. To by vypadalo asi takto:
git reset --soft HEAD~1
git commit -m 'New and corrected commit message'
Vždycky to dělám, když zapomenu přidat soubor nebo provést změnu.
Nezapomeňte specifikovat --soft
místo --hard
, jinak ztratíte tento závazek úplně.
Pro všechny, kdo hledají GUI pro Windows/Mac, aby pomohli s editací starších zpráv (tj. Nejen s nejnovější zprávou), doporučuji SourceTree . Následující kroky jsou uvedeny níže.
U provizí, které ještě nebyly přesunuty na vzdálený server:
... Nebo ... pro provize, které již byly posunuty:
Postupujte podle kroků v této odpovědi , které jsou podobné výše, ale vyžadují další příkaz, který má být spuštěn z příkazové řádky k vynucení stisknutí větve - přečtěte si vše a použijte nezbytnou opatrnost!
Pokud chcete pouze upravit poslední použití pro potvrzení:
git commit --amend
nebo
git commit --amend -m 'one line message'
Pokud však chcete upravit několik příkazů v řadě, měli byste místo toho použít rebasing:
git rebase -i <hash of one commit before the wrong commit>
V souboru, jako je ten nahoře, napište edit/e nebo jednu z dalších možností a stiskněte Save and exit.
Teď budete na prvním špatném spáchání. Proveďte změny v souborech a budou automaticky pro vás provedeny. Typ
git commit --amend
a uložte a ukončete
git rebase --continue
chcete-li přejít na další výběr, dokud nedokončíte všechny své výběry.
Všimněte si, že tyto věci změní všechny vaše SHA hashe po tomto konkrétním potvrzení.
Pokud chcete změnit svou poslední zprávu, měli byste použít příznak --only
nebo jeho zkratku -o
s commit --amend
:
git commit --amend -o -m "New commit message"
Tím zajistíte, že nedojde k neúmyslnému zvýšení vaší angažovanosti s inscenovanými věcmi. Samozřejmě je nejlepší mít správnou konfiguraci $EDITOR
. Pak můžete nechat volbu -m
vypnutou a git předvyplní potvrzovací zprávu starou. Tímto způsobem lze snadno upravovat.
Aktualizujte svou poslední špatnou zprávu o potvrzení s novou zprávou o potvrzení v jednom řádku:
git commit --amend -m "your new commit message"
Nebo zkuste obnovit nastavení git takto:
# You can reset your head to n number of commit
# NOT a good idea for changing last commit message
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^
# it will reset you last commit. Now, you
# can re-commit it with new commit message.
git reset
vám může pomoci rozbít také jeden závazek do více provizí:
# reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (you can reset multiple commit by doing HEAD~2(no. of commits)
# Now, reset your head for splitting it to multiple commits
git reset HEAD
# add and commit your files seperately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"
git add config/
git commit -m "add all files in config directory"
Zde jste úspěšně zlomili svůj poslední závazek do dvou komitů.
V této otázce je mnoho odpovědí, ale žádný z nich v detailu nevysvětluje, jak změnit starší zprávy o potvrzení pomocí VIM. Byl jsem uvízl a snažil jsem se to udělat sám, takže zde budu detailně psát, jak jsem to udělal, zejména pro lidi, kteří nemají žádné zkušenosti s VIM!
Chtěl jsem změnit posledních pět prověrek, které jsem již tlačil na server. To je docela 'nebezpečná' příčina, pokud někdo jiný již z toho vytáhl můžete zmatky věci změnou zprávy potvrzení. Pokud však pracujete na své vlastní pobočce a jste si jisti, že ji nikdo nestáhl, můžete ji změnit takto:
Řekněme, že chcete změnit pět nejnovějších provizí, pak to zadáte v terminálu:
git rebase -i HEAD~5
* Kde 5 je počet potvrzovacích zpráv, které chcete změnit. (takže pokud chcete změnit 10. na poslední potvrzení, zadejte 10)
Tímto příkazem se dostanete do VIM, kde můžete upravit historii potvrzení. Posledních 5 potvrzení se zobrazí nahoře, jako je tento:
pick <commit hash> commit message
Namísto pick
musíte napsat reword
. Můžete to provést v VIM zadáním i
, což znamená, že přejdete do režimu INSERT. (Vidíte, že se nacházíte v režimu vkládání v dolní části aplikace Word INSERT.) Pro příkazy, které chcete změnit, zadejte reword
namísto pick
Poté je třeba tuto obrazovku uložit a ukončit, a to tak, že nejprve přejdete do režimu příkazů stisknutím tlačítka esc. (můžete zkontrolovat, že jste v příkazovém režimu, pokud zmizí slovo INSERT ve spodní části). Pak můžete zadat příkaz zadáním :
, příkaz pro uložení a ukončení je wq
. Pokud tedy zadáte :wq
, budete na správné cestě.
Pak VIM přejde přes každou zprávu, kterou chcete přepsat, zde můžete skutečně změnit zprávy o potvrzení. Uděláte to tak, že přejdete do režimu INSERT, změníte zprávu o potvrzení, přejdete do příkazového režimu a uložíte a ukončete. Udělejte to pětkrát a vy jste mimo VIM!
Pokud jste již posunuli své špatné provize, musíte je git Push --force
přepsat. Pamatujte si, že git Push --force
je docela nebezpečná věc, takže se ujistěte, že nikdo ze serveru nevytáhl, protože jste se dopustili špatných provizí!
Nyní jste změnili své zprávy!
(Jak vidíte, nejsem tak zkušený v VIM), takže pokud jsem použil špatný 'žargón', abych vysvětlil, co se děje, neváhejte a opravte mě!)
Můžete použít git-rebase-reword
Je navržen tak, aby upravoval jakýkoli závazek (nejen poslední) stejně jako commit --amend
$ git rebase-reword <commit-or-refname>
To je pojmenované po akci na rebase interaktivní změnit kompromis: “reword”. Viz tento interaktivní příspěvek a man -section interaktivní režim-
Příklady:
$ git rebase-reword b68f560
$ git rebase-reword HEAD^
Přidal jsem alias reci
, recm
pro recommit (amend)
to, teď to můžu udělat s git recm
nebo git recm -m
.
$ vim ~/.gitconfig
[alias]
......
cm = commit
reci = commit --amend
recm = commit --amend
......
Uvědomil jsem si, že jsem se dopustil překlepu. Chcete-li vrátit zpět, udělal jsem následující:
git commit --amend -m "T-1000, advanced prototype"
git Push --force
Varování: force tlačí vaše změny přepíše vzdálenou větev s vaší místní. Ujistěte se, že nebudete přepisovat nic, co chcete zachovat. Rovněž buďte opatrní ohledně síly, která tlačí pozměněný (přepsaný) závazek, pokud s vámi někdo sdílí pobočku, protože budou muset přepsat svou vlastní historii, pokud mají starou kopii tohoto závazku, který jste právě přepsali.
Mám rád následující:
git status
git add --all
git commit -am "message goes here about the change"
git pull <Origin master>
git Push <Origin master>
Pokud jste do vzdálené větve nestiskli kód ( GitHub / Bitbucket ), můžete změnit příkaz pro potvrzení na příkazovém řádku níže.
git commit --amend -m "Your new message"
Pokud pracujete na konkrétní pobočce, postupujte takto:
git commit --amend -m "BRANCH-NAME: new message"
Pokud jste již kód poslali nesprávnou zprávou a při změně zprávy musíte být opatrní. To znamená, že po změně potvrzovací zprávy a pokusu o její opětovné ukončení skončíte s problémy. Aby byl hladký, postupujte takto.
Než to uděláš, přečtěte si prosím celou odpověď.
git commit --amend -m "BRANCH-NAME : your new message"
git Push -f Origin BRANCH-NAME # Not a best practice. Read below why?
Důležitá poznámka: Když použijete sílu Push přímo, můžete skončit s problémy s kódem, které ostatní vývojáři pracují na stejné větvi. Abychom se těmto konfliktům vyhnuli, musíte před provedením force Push : vytáhnout kód z vaší pobočky.
git commit --amend -m "BRANCH-NAME : your new message"
git pull Origin BRANCH-NAME
git Push -f Origin BRANCH-NAME
Toto je nejlepší postup při změně zprávy o potvrzení, pokud již byla odeslána.