Sujungti, atnaujinti ir ištraukti „Git“ filialus nenaudodami patikrinimų

Dirbu su projektu, turinčiu du filialus: A ir B. Paprastai dirbau A skyriuje ir derinu dalykus iš B filialo.

 git merge origin/branchB 

Tačiau aš taip pat norėčiau išlaikyti vietinę B filialo kopiją, nes kartais galiu patikrinti filialą be pirmojo susijungimo su savo filialu A. Dėl to norėčiau:

 git checkout branchB git pull git checkout branchA 

Ar yra būdas tai padaryti vienoje komandoje ir nereikia perjungti šakos pirmyn ir atgal? Ar turėčiau naudoti git update-ref ? Kaip?

367
09 июля '10 в 23:32 2010-07-09 23:32 Charlesas yra nustatytas liepos 09 '10, 23:32 2010-07-09 23:32
@ 10 atsakymų

Trumpas atsakymas

Sujungdami su sparčiuoju paspaudimu galite tiesiog naudoti

 git fetch <remote> <sourceBranch>:<destinationBranch> 

Pavyzdžiai:

git fetch dokumentacijos, kuri paaiškina šią sintaksę (mano dėmesį): 

<refspec>

Parametro <refspec> formatas yra neprivalomas plius + , po kurio nurodomas šaltinio kodas ref <src> , po to - dvitaškis : po to nurodomas tikslo ref <dst> .

Nuoroda, atitinkanti <src> ištrinta, o jei <dst> nėra tuščia eilutė, vietinė nuoroda, atitinkanti ją, siunčiama naudojant <src> . Jei naudojamas papildomas plius + , vietinis ref atnaujinamas, net jei jis nesukelia greito atnaujinimo.

Taip pat žr

548
18 июля '13 в 15:06 2013-07-18 15:06 atsakymą pateikė vartotojo456814 liepos 18 d. 13 val. 15:06 2013-07-18 15:06

Ne, ne. Visų pirma norint pašalinti konfliktus, reikia patikrinti tikslinę šaką (jei „Git“ negali juos automatiškai sujungti).

Tačiau, jei susiliejimas yra greitas persiuntimas, nereikia tikrinti tikslinės šakos, nes iš tikrųjų nereikia nieko sujungti - viskas, ką jums reikia padaryti, yra atnaujinti filialą, kad nukreiptumėte į naują antraštę. Tai galite padaryti naudodami git branch -f :

 git branch -f branch-b branch-a 
border=0

branch-b bus atnaujintas, nurodant branch-a antraštę.

-f parinktis reiškia - --force , o tai reiškia, kad turėtumėte būti atsargūs. Nenaudokite, jei nesate tikri, kad susijungimas bus pagreitintas.

72
11 нояб. Atsakymas duotas Amber 11 lapkričio. 2010-11-11 20:10 '10, 20:10, 2010-11-11 20:10

Kaip sakė „Amber“, greitas susijungimas yra vienintelis atvejis, kai galite tai padaryti. Bet koks kitas susiliejimas gali tekti pereiti per visą trijų krypčių susijungimą, taikant pataisas, išsprendžiant konfliktų sprendimą - ir tai reiškia, kad turi būti failų.

Aš naudoju šiam scenarijui naudojamą scenarijų: atliekant greitą susijungimą, neliečiant darbo medžio (jei nesiliejate į HEAD). Tai truputį ilgas, nes jis yra bent šiek tiek patikimas - jis patikrina, ar susiliejimas yra greitas, tada jį įvykdo, diff --stat filialo, bet gauna tuos pačius rezultatus kaip ir jūsų - matote diff --stat santrauką, tačiau „Refog“ įrašas yra tarsi greitas persiuntimas, o ne „reset“, kurį gaunate, jei naudojate branch -f . Jei jį vadinate git-merge-ff ir git-merge-ff į bin katalogą, galite jį pavadinti kaip git komandą: git merge-ff .

26
11 нояб. Atsakymą pateikė Jefromi lapkričio 11 d. 2010-11-11 20:40 '10, 20:40, 2010-11-11 20:40

Tai galite padaryti tik tada, kai susiliejimas vyksta greitai. Jei taip nėra, tada git reikia rinktinų failų, kad jie galėtų juos sujungti!

Padarykite tai tik greitai:

19
10 июля '10 в 3:59 2010-07-10 03:59 Atsakymą pateikė Jefromi liepos 10 d. 10 d. 3:59 2010-07-10 03:59

Kitas, žinoma, gana grubus būdas yra tiesiog vėl sukurti filialą:

 git fetch remote git branch -f localbranch remote/remotebranch 

Tai sumažina pasenusią vietinę filialą ir atkuria tą patį pavadinimą, todėl naudokite atsargiai ...

10
08 июня '11 в 13:08 2011-06-08 13:08 atsakymas pateikiamas kkoehne birželio 8 d. 11 val. 13:08 2011-06-08 13:08

Galite klonuoti repo ir sujungti į naują repo. Toje pačioje failų sistemoje tai sukels griežtą privalomumą, o ne daugumos duomenų kopijavimas. Baigti, traukdami rezultatus į pradinę repo.

6
11 нояб. Atsakymas pateikiamas nuoširdžiai 11 lapkričio. 2010-11-11 21:00 '10 21:00 val. 2010-11-11 21:00

Jūsų atveju galite naudoti

 git fetch origin branchB:branchB 

kuris tai, ko norite (darant prielaidą, kad susiliejimas yra greitas). Jei filialas negali būti atnaujintas, nes tam reikalingas intransityvus susiliejimas, tuomet pranešimas nebus sėkmingas.

Šioje formoje yra keletas kitų naudingų parinkčių:

 git fetch <remote> <sourceBranch>:<destinationBranch> 

Atminkite, kad <remote> gali būti vietinė saugykla , o <sourceBranch> gali būti stebėjimo filialas. Taigi, galite atnaujinti vietinį filialą, net jei jis nėra patikrintas, be prieigos prie tinklo .

Šiuo metu mano prieiga prie aukštesniojo serverio yra per lėtą VPN, todėl aš periodiškai prisijungiu, git fetch kad atnaujintumėte visas konsoles ir tada atjungčiau. Tada, jei, pvz., Pasikeitė nuotolinis kapitonas, galiu padaryti

 git fetch . remotes/origin/master:master 

saugiai atnaujinti savo vietinį kapitoną, net jei šiuo metu turiu kitą temą. Nereikia prieigos prie tinklo.

5
17 нояб. Bennett McElwee atsakymas lapkričio 17 d 2015-11-17 03:07 '15 - 03:07 2015-11-17 03:07

Įveskite git -forward-merge :

Be paskirties vietos, git-forward-merge <source> <destination> susieja šaltinį su paskirties filialu.

https://github.com/schuyler1d/git-forward-merge

Jis veikia tik automatiniu susiliejimu, jei yra konfliktų, jums reikia naudoti reguliarų susijungimą.

3
29 мая '14 в 20:15 2014-05-29 20:15 atsakymas pateikiamas lkraider gegužės 29 d., 14 val. 20:15 2014-05-29 20:15

Daugeliu atvejų (pvz., Susijungimui) galite tiesiog naudoti nuotolinį filialą neatnaujinant vietinio stebėjimo filialo. Įtraukus pranešimą į reflogą, skamba pernelyg didelė ir nebebus greita. Jei norite supaprastinti atkūrimą, į „git config“ pridėkite šiuos duomenis

 [core] logallrefupdates=true 

Tada įveskite

 git reflog show mybranch 

norėdami pamatyti paskutinę jūsų siūlų istoriją

3
20 дек. Atsakymas suteiktas Casebash 20 d. 2011-12-20 03:22 '11 at 3:22 2011-12-20 03:22

Aš parašiau apvalkalo funkciją panašiam naudojimo atvejui, kurį kasdien susiduriu projektuose. Tai iš esmės yra vietinių filialų atnaujinimo bendro filialo nuoroda, pavyzdžiui, prieš kuriant PR ir tt

Tai darant, net jei nenorite naudoti checkout , jei kiti neprieštarauja šiam apribojimui.

glmh („git pull and merge here“) automatiškai bus checkout branchB , pull paskutinis, iš naujo checkout branchA ir merge branchB .

Jame neatsižvelgiama į poreikį išsaugoti vietinį filialą, tačiau jį galite lengvai pakeisti, prieš pradedant patikrinti filialąB. Kažkas panašaus ...

 git branch ${branchA}-no-branchB ${branchA} 

Paprastiems perėjimams su greitu perėjimu šis pranešimas praleidžiamas pranešimo pranešimo pranešime.

Dėl ne tranzitinių susijungimų, jūsų filialas įtraukiamas į konflikto sprendimo valstybę (tikriausiai reikia įsikišti).

Norėdami sukonfigūruoti, pridėkite prie .bashrc arba .zshrc tt:

 glmh() { branchB=$1 [ $# -eq 0 ]  { branchB="develop" } branchA="$(git branch | grep '*' | sed 's/* //g')" git checkout ${branchB}  git pull git checkout ${branchA}  git merge ${branchB} } 

Naudoti:

 # No argument given, will assume "develop" > glmh # Pass an argument to pull and merge a specific branch > glmh your-other-branch 

Pastaba Tai nėra pakankamai veiksminga perduoti argumentus ne filialo pavadinime git merge

2
13 февр. atsakymas pateikiamas rkd 13 vasario mėn. 2016-02-13 03:03 '16 at 3:03 2016-02-13 03:03

Kiti klausimai apie žymes arba Užduoti klausimą