Kako mogu gurnuti fiksnu obvezu u udaljeno Git spremište?

Kada sam radio na izvornom kodu, napravio sam svoju uobičajenu stvar, a zatim sam kliknuo na udaljeno spremište. Ali onda sam primijetio da sam zaboravio organizirati uvoz u izvorni kod. Stoga naredbu promjene mijenjam kako bih zamijenio prethodnu predaju:

 > git commit --amend 

Nažalost, urezivanje se ne može vratiti u spremište. Odbija se kako slijedi:

 > git push origin To //my.remote.repo.com/stuff.git/ ! [rejected] master -> master (non-fast forward) error: failed to push some refs to '//my.remote.repo.com/stuff.git/' 

Što trebam učiniti? (Mogu pristupiti udaljenom spremištu.)

475
31 окт. Spoike set 31. listopada 2008-10-31 13:23 '08 u 13:23 2008-10-31 13:23
@ 13 odgovora

Zapravo sam jednom kliknuo na repozitorij --force i .git i dobio sam prokletstvo od Linusa BIG TIME . Općenito, to će stvoriti mnogo problema za druge ljude. Jednostavan odgovor je: "Nemoj to raditi."

Vidim da drugi daju recept za to, pa ih neću ponavljati ovdje. Ali evo nagovještaja da se oporavim od situacije nakon što ste ispravili fiksaciju s --force (ili + master).

  • Pronađite stari unos koji ste mu pridonijeli (nazovite ga old , a mi ćemo odabrati novu naredbu koju ste stvorili promjenom new ).
  • Stvorite spajanje između old i new pisanjem new stabla, na primjer, git checkout new git merge -s ours old .
  • Kombinirajte to sa svojim majstorom pomoću git merge master
  • Ažurirajte čarobnjaka rezultatom git push . HEAD:master git push . HEAD:master
  • Ispišite rezultat.

Tada će ljudi koji nisu bili dovoljno uspješni temeljiti svoj rad na fiksaciji koju ste uništili, ispraviti i prisiliti na guranje (koje ste jako loš dječak ), vidjet ćete rezultat spajanja i vidjeti da koristite new preko old . Njihovi kasniji spojevi neće vidjeti sukobe između old i new , koji su nastali kao posljedica promjena, tako da ne moraju trpjeti.

371
11 янв. odgovor je dao gitster 11 jan. 2009-01-11 10:36 '09 u 10:36 AM 2009-01-11 10:36

Vidjet ćete Git sigurnosnu značajku. Git odbija ažurirati udaljenu granu grane jer vaša grana zaglavlja nije izravni potomak trenutnog popravka zaglavlja grane koji kliknete.

Ako to nije bio slučaj, onda dvoje ljudi koji su otprilike u isto vrijeme gurali u isto spremište ne bi znali da je u isto vrijeme došlo do novog počinjenja, a onaj koji je gurnuo posljednji bi izgubio posao. prethodni potiskivač bez da je itko od njih svjestan toga.

Ako znate da ste jedina osoba koja je kliknula, a želite pritisnuti fiksni popravak ili pritisnuti popravak koji je stavio veto na granu, možete "prisiliti" Git da ažurira udaljenu granu pomoću prekidača -f .

 git push -f origin master 

Čak i ovo možda neće raditi jer Git omogućuje udaljenim repozitorijima da odustanu od brzih klikova na udaljenom kraju koristeći konfiguracijsku receive.denynonfastforwards . U tom slučaju, razlog odbijanja će izgledati ovako (imajte na umu dio "udaljenog neuspjeha"):

border=0
  ! [remote rejected] master -> master (non-fast forward) 

Da biste to zaobišli, morate promijeniti konfiguraciju udaljenog repozitorija ili, kao prljavi hack, možete izbrisati i ponovo stvoriti granu na sljedeći način:

 git push origin :master git push origin master 

Općenito, posljednji parametar git push koristi format <local_ref>:<remote_ref> , gdje je local_ref naziv grane u lokalnom spremištu, a remote_ref naziv grane u udaljenom spremištu. Ovaj par naredbi koristi dvije kratice. :master je null local_ref, što znači nametanje nulte grane na udaljenoj strani master , tj. brisanje udaljene grane. Naziv podružnice bez : znači da se lokalna grana s navedenim nazivom preusmjerava na udaljenu granu s istim imenom. master u ovoj situaciji je skraćenica od master:master .

218
01 нояб. Odgovor dao Charles Bailey 01. studenog. 2008-11-01 00:58 '08 u 0:58 am 2008-11-01 00:58

Brzi rant: činjenica da nitko nije postavio jednostavan odgovor pokazuje očajnu neprijateljstvo korisnika, što se očituje u Git CLI.

U svakom slučaju, "očigledan" način da se to učini, pod pretpostavkom da niste pokušali prisiliti guranje, je da ga prvo izvučete. To će dovesti do promjene koju ste napravili u njoj (i, stoga, ona više nije tamo) tako da se ona ponovno pojavljuje.

Čim riješite sukobe, možete ponovno kliknuti.

Dakle:

 git pull 

Ako dobijete pogreške u povlačenju, možda nešto nije u redu s vašom lokalnom konfiguracijom spremišta (imao sam nevažeći ref u odjeljku .git / config).

I poslije

 git push 

Možete dobiti dodatnu fiksaciju s predmetom "trivijalnog spajanja".

184
22 сент. odgovor Tim Band 22. rujna 2009-09-22 13:46 '09 u 13:46 2009-09-22 13:46

Kratak odgovor glasi: nemojte pritiskati ispravljene snimke na javni repo.

Dug odgovor: nekoliko Git naredbi, kao što je git commit --amend i git rebase , zapravo ponovno prepisuju povijest. To je u redu, sve dok ne objavite svoje promjene, ali kada to učinite, doista ne biste trebali biti prevareni pričom, jer ako je netko već primio vaše promjene, onda kada ih pokušaju izvući, umjesto da mijenjaju promjene Kod urezivanja trebate napraviti novu obvezu s promjenama.

Međutim, ako doista želite pritisnuti ispravljenu poruku, možete to učiniti ovako:

 $ git push origin +master:master 

Znak vodeći + prisilit će vas da pritisnete, čak i ako to ne dovodi do fiksiranja "brzog naprijed". (Brzo prosljeđivanje se događa kada su promjene koje kliknete izravan potomak promjena već u javnom repo).

86
31 окт. odgovor je dao mipadi 31. listopada 2008-10-31 17:35 '08 u 17:35 2008-10-31 17:35

Ovdje je jednostavan i čist način da izvršite promjene nakon što ste izvršili commit --amend :

 git reset --soft HEAD^ git stash git push -f origin master git stash pop git commit -a git push origin master 

Što čini sljedeće:

  • Resetirati grane grana prema roditelju.
  • Kliknite na zadnju obvezu.
  • Prisilno pritiskanje na daljinskom upravljaču. Sada udaljeno računalo nema zadnje urezivanje.
  • Uđi u svoj novčanik.
  • Čitajte čisto.
  • Kliknite na daljinski upravljač.

Ne zaboravite promijeniti "izvor" i "majstor", ako to primijenite na drugu granu ili udaljeni uređaj.

20
21 июня '15 в 17:41 2015-06-21 17:41 odgovor je dat Faiza 21. lipnja '15 u 17:41 2015-06-21 17:41

To sam riješio odbacivanjem lokalnog popravka i dodavanjem novih izmjena pri vrhu:

 # Rewind to commit before conflicting git reset --soft HEAD~1 # Pull the remote version git pull # Add the new commit on top git add ... git commit git push 
16
24 сент. Odgovor je dat bara 24. rujna 2012-09-24 18:46 '12 u 18:46 2012-09-24 18:46

Imao sam isti problem.

  • Posljednji popravak koji je već bio pritisnut, nasumično je podešen.
  • Mnoge promjene napravljene lokalno, izvršene su pet puta
  • Pokušali ste kliknuti, dobiti pogrešku, paničariti, spojiti udaljeni pristup, dobiti mnogo ne-mojih datoteka, kliknuti, nije uspio itd.

Kao git-novost, mislio sam da je završio FUBAR .

Odluka. Malo drugačije, jer je @bara predložio + kreiranje lokalne grane sigurnosne kopije

 # Rewind to commit just before the pushed-and-amended one. # Replace <hash> with the needed hash. # --soft means: leave all the changes there, so nothing is lost. git reset --soft <hash> # Create new branch, just for a backup, still having all changes in it. # The branch was feature/1234, new one - feature/1234-gone-bad git checkout -b feature/1234-gone-bad # Commit all the changes (all the mess) not to lose it  not to carry around git commit -a -m "feature/1234 backup" # Switch back to the original branch git checkout feature/1234 # Pull the from remote (named 'origin'), thus 'repairing' our main problem git pull origin/feature/1234 # Now you have a clean-and-non-diverged branch and a backup of the local changes. # Check the needed files from the backup branch git checkout feature/1234-gone-bad -- the/path/to/file.php 

Možda to nije brza i čista odluka, a ja sam izgubio svoju priču (1 počinio umjesto 5), ali on je zadržao svoj dnevni posao.

7
20 февр. Odgovor se daje davisca 20. veljače. 2014-02-20 13:24 '14 u 13:24 2014-02-20 13:24

Ako znate da nitko nije izvukao vašu ispravku bez izmjena, koristite --force-with-lease git push .

U programu TortoiseGit možete isto učiniti u postavkama "Push ..." "Force: May discard" i provjeriti "poznate promjene".

Sila (može odbiti poznate promjene) omogućuje udaljenom repozitoriju da preuzme sigurniju i brzu tranziciju. To može uzrokovati da udaljeno spremište izgubi predavanje; koristite ga s oprezom. To vas može spriječiti da izgubite nepoznate promjene od drugih ljudi na daljinskom upravljaču. On provjerava pokazuje li granica poslužitelja istu fiksaciju kao i grana za daljinsko praćenje (poznate promjene). Ako je tako, bit će pritisnuto napajanje. Inače će biti odbačen. Budući da git nema oznake s daljinskim praćenjem, oznake se ne mogu prepisati s ovom opcijom.

3
07 июня '16 в 3:03 2016-06-07 03:03 odgovor je dao ShawnFeatherly 07. lipnja 2006. u 3:03 2016-06-07 03:03

Evo jednostavnog i čistog načina da napravite promjene nakon što napravite git add "your files" i git commit --amend :

 git push origin master -f 

ili

 git push origin master --force 
2
18 янв. Odgovor daje Marwen Bkh 18 jan. 2016-01-18 11:29 '16 u 11:29 2016-01-18 11:29

Ako niste pritisnuli kod na udaljenoj grani (GitHub / Bitbucket), možete promijeniti poruku u naredbenom retku, kao što je prikazano u nastavku.

  git commit --amend -m "Your new message" 

Ako radite na određenoj grani, učinite sljedeće:

 git commit --amend -m "BRANCH-NAME: new message" 

Ako ste već kliknuli na kôd s pogrešnom porukom, morate biti oprezni pri promjeni poruke. nakon što promijenite poruku urezivanja i pokušate je ponovno pritisnuti, imate problema. Da biste ga učinili glatkim, slijedite ove korake.

Prije toga pročitajte cijeli odgovor.

 git commit --amend -m "BRANCH-NAME : your new message" git push -f origin BRANCH-NAME # Not a best practice. Read below why? 

Važna napomena :. Kada pritisnete gumb, možete naići na probleme s kodom koje drugi programeri rade na istoj grani. Stoga, da biste izbjegli te sukobe, morate izvući kôd iz svoje podružnice, prije nego pritisnete silu :

  git commit --amend -m "BRANCH-NAME : your new message" git pull origin BRANCH-NAME git push -f origin BRANCH-NAME 

To je najbolja praksa kod promjene poruke urezivanja, ako je već pritisnuta.

2
13 янв. Odgovor je dao Packer 13. siječnja 2015-01-13 10:20 '15 u 10:20 2015-01-13 10:20

Dobivate ovu pogrešku jer Git daljinski već ima te datoteke predavanja. Morate prisilno kliknuti na granu da bi ovo funkcioniralo:

 git push -f origin branch_name 

Također pazite da izvadite kod iz daljinskog upravljača, jer se netko iz vašeg tima može preseliti u jednu granu.

 git pull origin branch_name 

Ovo je jedan od slučajeva kada moramo prisiliti popraviti udaljenu.

1
21 янв. odgovor je dao Praveen Dhawan 21. siječnja 2016-01-21 09:35 '16 u 9:35 2016-01-21 09:35

Morao sam riješiti ovaj problem povlačenjem iz daljinskog repoa i razvrstavanjem konflikta spajanja koji su se pojavili, popraviti i zatim kliknuti. Ali osjećam da postoji bolji način.

1
31 окт. odgovor je dan Spoike 31. listopada. 2008-10-31 14:39 '08 u 2:39 pm 2008-10-31 14:39

Samo sam nastavio raditi ono što mi je Git rekao. Dakle:

  • Nije moguće kliknuti zbog popravka.
  • Pokušavam kao što sam očekivao.
  • Greška spajanja tako da to popravim ručno.
  • Stvorite novu predaju (označenu kao "spajanje") i kliknite je.
  • Čini se da radi!

Napomena. Modificirana fiksacija bila je zadnja.

1
02 дек. Odgovor je dat Rolf 02 Dec. 2016-12-02 19:29 '16 u 19:29 2016-12-02 19:29