Kaip stumti fiksuotą įsipareigojimą prie nuotolinio „Git“ saugyklos?

Kai aš padariau darbą su šaltiniu, aš padariau savo įprastą dalyką, o tada spustelėjau nuotolinį saugyklą. Bet tada pastebėjau, kad pamiršau importuoti į pradinį kodą. Todėl pakeisiu komandą, kuri pakeis ankstesnį įvykį:

 > git commit --amend 

Deja, įsipareigojimas negali būti grąžintas į saugyklą. Jis atmestas taip:

 > 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/' 

Ką turėčiau daryti? (Galiu pasiekti nuotolinį saugyklą.)

475
31 окт. Spoike nustatytas spalio 31 d 2008-10-31 13:23 '08 13:23 pm 2008-10-31 13:23
@ 13 atsakymų

Iš tikrųjų vieną kartą spustelėjau --force ir .git saugyklą ir gavau prakeikimą iš Linus BIG TIME . Apskritai, tai sukurs daug problemų kitiems žmonėms. Paprastas atsakymas yra: „Negalima tai padaryti“.

Matau, kad kiti tai suteikia receptą, todėl aš čia jų ne kartoju. Tačiau čia yra užuomina susigrąžinti situaciją po to, kai paspaudėte pataisytą fiksaciją su --force (arba + master).

  • Raskite seną įsipareigojimą, kurį prisidėjote prie jo (vadiname old , ir pasirinksime naują komandą, kurią sukūrėte keisdami new ).
  • Sukurkite susijungimą tarp old ir new , rašydami new medį, pvz., „ git checkout new git merge -s ours old .
  • Sujunkite tai su savo kapitonu naudodami git merge master
  • Atnaujinkite vedlį su „ git push . HEAD:master rezultatu git push . HEAD:master git push . HEAD:master
  • Spausdinkite rezultatą.

Tada žmonės, kurie buvo nepakankami, savo darbą remdamiesi fiksavimu, kurį jūs sunaikinote, pataisėte ir verčiate stumti (kurį esate labai blogas berniukas ), pamatysite susijungimo rezultatą ir pamatysite, kad naudojate new per old . Vėlesni jų susiliejimai nematys old ir new konfliktų, kurie atsirado dėl pokyčių, todėl jiems nereikia kentėti.

371
11 янв. atsakymą pateikė gitster 11 jan. 2009-01-11 10:36 '09, 10:36 AM 2009-01-11 10:36

Matote „Git“ saugos funkciją. „Git“ atsisako atnaujinti nuotolinį filialo filialą, nes jūsų antraštės filialas nėra tiesioginis filialo antraštės, kurią spustelėjote, fiksavimas.

Jei taip nebūtų, du žmonės, kurie tuo pačiu metu stūmėjo į tą pačią saugyklą, nežinojo, kad tuo pačiu metu įvyko naujas įsipareigojimas, o tas, kuris pastumė paskutinį, būtų praradęs savo darbą. ankstesnis stūmikas, bet nė vienas iš jų apie tai nežino.

Jei žinote, kad esate vienintelis asmuo, spustelėjęs ir norite paspausti fiksuotą pataisą arba paspausdami pataisą, kuri veto filialą, galite „priversti“ Git atnaujinti nuotolinį filialą -f jungikliu.

 git push -f origin master 

Net ir tai gali neveikti, nes „Git“ leidžia nuotolinėms saugykloms atsisakyti spartų paspaudimų tolimiausiame gale naudojant „ receive.denynonfastforwards konfigūracijos receive.denynonfastforwards . Tokiu atveju atmetimo priežastis atrodys taip (atkreipkite dėmesį į „nuotolinio gedimo“ dalį):

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

Jei norite tai pasiekti, turite pakeisti nuotolinio saugyklos konfigūraciją arba, kaip purvinas įsilaužimas, galite ištrinti ir atkurti filialą taip:

 git push origin :master git push origin master 

Apskritai paskutinis „ git push parametras naudoja formatą <local_ref>:<remote_ref> , kur local_ref yra filialo pavadinimas vietinėje saugykloje, o nuotolinio saugojimo - nuotolinio saugykloje pavadinimas. Šioje komandų poroje naudojamos dvi santrumpos. :master yra null local_ref, o tai reiškia nulinės šakos įvedimą nuotolinėje master pusėje, ty nuotolinio filialo ištrynimą. Filialo pavadinimas be : reiškia, kad vietinis filialas su nurodytu pavadinimu nukreipiamas į tą patį pavadinimą turinčią filialą. master šioje situacijoje yra trumpas master:master .

218
01 нояб. Charles Bailey atsakymas, lapkričio 01 d. 2008-11-01 00:58 '08 0:58 am 2008-11-01 00:58

Greitas gandas: tai, kad niekas nepateikė paprasto atsakymo, parodo beviltišką vartotojo priešiškumą, pasireiškiantį su „Git CLI“.

Bet kokiu atveju, „akivaizdus“ būdas tai padaryti, darant prielaidą, kad nesistengėte priversti stumti, yra ištraukti jį pirmiausia. Tai sukels pakeitimus, kuriuos jūs padarėte (ir todėl nebėra), kad jis vėl pasirodytų.

Kai tik išsprendžiate bet kokius konfliktus, galite spustelėti dar kartą.

Taigi:

 git pull 

Jei gausite klaidų, galbūt kažkas negerai su vietine saugyklų konfigūracija (.git / config skyriuje turėjau neteisingą ref).

Ir po

 git push 

Jūs galite gauti papildomą fiksavimą „Trivialus sujungimo“ tema.

184
22 сент. atsakymas, kurį pateikė Tim Band rugsėjo 22 d 2009-09-22 13:46 '09, 13:46 2009-09-22 13:46

Trumpas atsakymas yra: nespauskite pataisytų viešosios atpirkimo įrašų.

Ilgas atsakymas: keletas „Git“ komandų, pvz., „Git“ git commit --amend ir git rebase , iš tikrųjų perrašo istoriją. Tai gerai, kol paskelbsite savo pakeitimus, bet kai tik tai padarysite, istorija tikrai neturėtų būti apgaulinga, nes jei kas nors jau gavo jūsų pakeitimus, tada, kai jie bando juos ištraukti, vietoj pakeitimų Įsipareigojime turėtumėte padaryti naują įsipareigojimą su pakeitimais.

Tačiau, jei tikrai norite paspausti pataisytą pranešimą, galite tai padaryti taip:

 $ git push origin +master:master 

Pagrindinis + ženklas priverčia jus paspausti, net jei jis nesukels „greito pirmyn“ fiksavimo. (Greitas persiuntimas įvyksta, kai pakeitimai, kuriuos paspaudėte, yra tiesioginiai pakeitimai, kurie jau yra viešajame repo.)

86
31 окт. atsakymą mipadi pateikė spalio 31 d 2008-10-31 17:35 '08, 17:35, 2008-10-31 17:35

Čia rasite paprastą ir švarų būdą, kaip padaryti pakeitimus po to, kai atliksite commit --amend -

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

Ką daro:

  • Atstatykite šakos šakas į tėvą.
  • Spustelėkite paskutinį įvykį.
  • Priverstinis spaudimas nuotolinio valdymo pulte. Dabar nuotolinis kompiuteris neturi paskutinio įsipareigojimo.
  • Įeikite į savo piniginę.
  • Skaitykite švariai.
  • Spustelėkite nuotolinio valdymo pultą.

Nepamirškite keisti „kilmės“ ir „šeimininko“, jei taikote tai kitam filialui ar nuotoliniam įrenginiui.

20
21 июня '15 в 17:41 2015-06-21 17:41 atsakymas pateikiamas Faiza birželio 21 d., 15 val. 17:41 2015-06-21 17:41

Tai išsprendžiau pašalindamas vietinį pataisą ir pridėdamas naujus pakeitimus iš viršaus:

 # 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 сент. Atsakymas pateikiamas bara rugsėjo 24 d 2012-09-24 18:46 '12, 18:46 PM 2012-09-24 18:46

Turėjau tą pačią problemą.

  • Paskutinis sureguliuotas fiksavimas buvo atsitiktinai sureguliuotas.
  • Daugelis pakeitimų atlikti vietoje, padaryti penkis kartus
  • Bandė spustelėti, gauti klaidą, paniką, sujungti nuotolinę prieigą, gauti daug ne mano failų, paspaudėte, nepavyko ir pan.

Kaip git-newbie, aš maniau, kad jį užbaigė FUBAR .

Sprendimas. Šiek tiek kitaip, kaip pasiūlė @bara + sukurti vietinę atsarginę dalį

 # 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 

Galbūt tai nėra greitas ir švarus sprendimas, ir aš praradau savo istoriją (1, o ne 5), bet jis išlaikė savo dienos darbą.

7
20 февр. Atsakymas duotas davisca 20 vasaris. 2014-02-20 13:24 '14, 14:24 pm 2014-02-20 13:24

Jei žinote, kad niekas nesiėmė jokių pataisymų be pakeitimų, naudokite „ --force-with-lease git push parinktį.

„TortoiseGit“ galite daryti tą patį „Push ...“ „Force: gali atmesti“ nustatymus ir patikrinti „žinomus pakeitimus“.

Jėga (gali atmesti žinomus pakeitimus) leidžia nuotolinei saugyklai pereiti saugiau ir greičiau. Tai gali sukelti nuotolinio saugyklos praradimą; naudokite jį atsargiai. Tai gali neleisti prarasti kitų nuotolinio valdymo pulto žmonių nežinomų pakeitimų. Ji patikrina, ar serverio filialas nurodo tą patį fiksavimą kaip nuotolinio stebėjimo filialas (žinomi pakeitimai). Jei taip, maitinimas bus paspaudžiamas. Priešingu atveju jis bus atmestas. Kadangi git neturi žymų su nuotoliniu stebėjimu, žymos negali būti perrašytos šia parinktimi.

3
07 июня '16 в 3:03 2016-06-07 03:03 atsakymą pateikė „ ShawnFeatherly “ birželio 16 d. 16 d. 03:03 2016-06-07 03:03

Štai paprastas ir švarus būdas atlikti pakeitimus po to, kai atlikote „ git add "your files" ir git commit --amend :

 git push origin master -f 

arba

 git push origin master --force 
2
18 янв. Atsakymą pateikė Marwen Bkh 18 jan. 2016-01-18 11:29 '16 at 11:29 2016-01-18 11:29

Jei nepaspaudėte kodo nuotolinio filialo (GitHub / Bitbucket), galite pakeisti komandų eilutės įsipareigojimų pranešimą, kaip parodyta žemiau.

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

Jei dirbate su konkrečiu filialu, atlikite šiuos veiksmus:

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

Jei jau paspaudėte kodą neteisingu pranešimu, pakeičiant pranešimą turite būti atsargūs. po to, kai pakeisite įsipareigojimo pranešimą ir bandysite jį dar kartą paspausti, turite problemų. Kad jis būtų sklandus, atlikite šiuos veiksmus.

Prieš tai perskaitykite visą atsakymą.

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

Svarbi pastaba :. Paspaudus stumti, galite susidurti su problemomis, su kuriomis kiti kūrėjai dirba toje pačioje šakoje. Todėl, norėdami išvengti šių konfliktų, turite ištraukti kodą iš savo šakos, prieš paspausdami jėgą :

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

Tai yra geriausia praktika, kai keičiamas įsipareigojimo pranešimas, jei jis jau buvo paspaustas.

2
13 янв. Atsakymą pateikė Packer Jan 13 2015-01-13 10:20 '15 - 10:20 2015-01-13 10:20

Šią klaidą gaunate, nes „Git“ nuotolinio valdymo pultas jau turi šiuos failus. Jei norite dirbti, privalote spustelėti ant filialo:

 git push -f origin branch_name 

Taip pat įsitikinkite, kad ištraukite kodą iš nuotolinio valdymo pulto, nes kažkas iš jūsų komandos gali pereiti į vieną filialą.

 git pull origin branch_name 

Tai yra vienas iš atvejų, kai privalome priversti fiksuoti nuotolinį.

1
21 янв. atsakymą pateikė Praveen Dhawan, sausio 21 d 2016-01-21 09:35 '16 at 9:35 2016-01-21 09:35

Turėjau išspręsti šią problemą ištraukiant iš nuotolinio atpirkimo ir išsirinkusius sujungimo konfliktus, pataisykite ir spustelėkite. Bet manau, kad yra geresnis būdas.

1
31 окт. atsakymas pateikiamas Spoike spalio 31 d. 2008-10-31 14:39 '08 at 14:39 pm 2008-10-31 14:39

Aš ką tik dariau tai, ką man pasakė Git. Taigi:

  • Nepavyko spustelėti dėl pataisymo.
  • Bandau, kaip tikėjausi.
  • Sujungti klaida todėl ją pataisau rankiniu būdu.
  • Sukurkite naują įsipareigojimą (pažymėtą „sujungti“) ir spustelėkite jį.
  • Atrodo, kad jis veikia!

Pastaba Modifikuotas fiksavimas buvo paskutinis.

1
02 дек. Atsakymas duotas Rolfo 02 d. 2016-12-02 19:29 '16 at 19:29 2016-12-02 19:29