Kaip padaryti „git fetch“ ir „git sujungimą“ iš nuotolinio stebėjimo filialo (pvz., „Git pull“)

Aš sukūriau keletą nuotolinio sekimo filialų git, bet aš niekada negaliu sujungti jų į vietinį filialą, kai juos atnaujinau su git fetch.

Pvz., Tarkime, kad turiu nuotolinį filialą, vadinamą „kitu filialu“. Aš ją įdiegiau lokaliai kaip stebėjimo šaką naudojant

 git branch --track an-other-branch origin/an-other-branch 

Kol kas taip gerai. Tačiau, jei šis filialas yra atnaujinamas (paprastai naudojant judantį įrenginį ir dirbant su šiuo įrenginiu) ir noriu jį atnaujinti originalioje mašinoje, man kyla problemų dėl įkėlimo / sujungimo:

 git fetch origin an-other-branch git merge origin/an-other-branch 

Kai tai darau, gaunu pranešimą „Jau pats moderniausias“ ir niekas nesusijęs.

Tačiau a

 git pull origin an-other-branch 

visada jį atnaujina, kaip tikitės.

Taip pat veikia git dif

 git diff origin/an-other-branch 

rodo, kad yra skirtumų, todėl manau, kad turiu neteisingą sintaksę.

Ką daryti neteisingai?

EDIT [2010-04-09]: aš keletą kartų patikrinau, ir aš tikrai ne kitoje šakoje. Jei mano git atneša ir tada git sujungia (kaip parodyta aukščiau), daryk tą patį kaip git traukimas? Gausiu darbo eigą, rodantį git būsenos rezultatus ir tt

101
08 апр. nustatė kaybenleroll 08 Bal. 2010-04-08 21:45 '10, 21:45, 2010-04-08 21:45
@ 5 atsakymai

Jūs negaunate filialo, gausite visą konsolę:

 git fetch origin git merge origin/an-other-branch 
153
08 апр. atsakymą pateikė Gareth 08 balandžio. 2010-04-08 22:08 '10 10:08 val. 2010-04-08 22:08

Vieno filialo pasirinkimas: fetch / merge vs pull

Žmonės dažnai pataria atskirti „mėginių ėmimą“ nuo „susijungimo“. Vietoj to, jie sako:

  git pull remoteR branchB 

atlikite šiuos veiksmus:

  git fetch remoteR git merge remoteR branchB 

Tai, ką jie nemini, yra ta, kad tokia parsisiuntimo komanda išskirs visus filialus iš nuotolinio atpirkimo, o ne tai, ką traukia komanda. Jei nuotolinio repo filialai yra tūkstančiai, bet nenorite jų matyti, galite paleisti šią neaiškią komandą:

  git fetch remoteR refs/heads/branchB:refs/remotes/remoteR/branchB git branch -a # to verify git branch -t branchB remoteR/branchB 

Žinoma, juokinga prisiminti, todėl, jei tikrai norite išvengti visų filialų atrankos, geriau keisti .git/config , kaip aprašyta „ProGit“.

Eh?

Geriausias šio klausimo paaiškinimas ProGit, Git Internals 9-5 skyriuje yra Refspec ( arba per github ). Stebėtinai sunku rasti „Google“.

border=0

Pirma, turime paaiškinti kai kuriuos terminus. Norėdami stebėti nuotolinius filialus, paprastai žinomos 3 skirtingos šakos:

  • Atsakydama į nuotolinį repo: refs/heads/branchB kitoje repo
  • Nuotolinio stebėjimo stebėjimas: refs/remotes/remoteR/branchB jūsų repo
  • Savo skyrių: refs/heads/branchB jūsų repo viduje

Nuotolinio stebėjimo stebėjimas ( refs/remotes ) yra tik skaitomas. Jūs jų nekeičiate tiesiogiai. Jūs pakeisite savo filialą, tada spustelėsite atitinkamą nuotolinio atpirkimo atšaką. Rezultatas neatspindi jūsų refs/remotes tol, kol nebus atliktas atitinkamas ištraukimas ar pasirinkimas. Šį skirtumą sunku suprasti iš git man puslapių, daugiausia dėl to, kad vietinis filialas ( refs/heads/branchB ) vadinamas nuotolinio stebėjimo „seka“ filialu, kai .git/config apibrėžia branch.branchB.remote = remoteR .

Pagalvokite apie „ref“ kaip „C ++“ rodiklius. Fiziškai tai yra failai, kuriuose yra SHA virškinimo, bet dažniausiai jie yra tik nukreipiantys į įsipareigojimo medį. git fetch “ prideda daug mazgų prie jūsų įsipareigojimo medžio, bet kaip git nusprendžia, kuriuos rodykles judėti yra šiek tiek sudėtingesnis.

Kaip minėta kitame atsakyme , taip pat

  git pull remoteR branchB 

taip pat

  git fetch remoteR branchB 

refs/remotes/branches/branchB judės, o paskutinis, žinoma, negali būti perkeliamas į refs/heads/branchB . Tačiau abu judėjo FETCH_HEAD . (Galite keisti bet kurį iš šių failų .git/ pamatyti, kai jie keičiasi.) Ir diegiant MERGE_ORIG ir tt, git merge bus susijęs su FETCH_HEAD

66
18 янв. atsakymas pateikiamas cdunn2001 18 sausio. 2011-01-18 02:32 '11 at 2:32 2011-01-18 02:32

Ar tikrai jungiatės prie vietinio an-other-branch ?

 git fetch origin an-other-branch git checkout an-other-branch git merge origin/an-other-branch 

kitas paaiškinimas :

visi filialo, kurį bandote sujungti, pakeitimai jau buvo sujungti su šiuo metu esančiu filialu.
Konkrečiai kalbant, tai reiškia, kad filialas, kurį bandote sujungti, yra jūsų dabartinio filialo tėvas.

jei esate prieš nuotolinį repo su vienu užraktu, tai yra nuotolinis atpirkimas, kuris yra pasenęs, o ne jūs.

Bet jūsų atveju, jei git pull darbus, tai reiškia, kad esate ne dešinėje.

9
08 апр. Atsakymas pateikiamas VonC 08 balandžio. 2010-04-08 21:52 '10, 09:52 PM 2010-04-08 21:52

„Git pull“ iš tikrųjų yra kombinuotas įrankis: jis atlieka „git“ parsisiuntimą (gaunant pakeitimus) ir „git“ sujungimą (sujungiant juos su dabartine kopija)

Ar tikrai esate tinkamas filialas?

2
08 апр. atsakymas pateikiamas RDL 08 balandžio. 2010-04-08 21:54 '10, 21:54, 2010-04-08 21:54

tai yra komandos:

 git fetch origin git merge origin/somebranch somebranch 

jei tai padarysite antroje eilutėje:

 git merge origin somebranch 

jis bandys sujungti vietinį vedlį į esamą filialą.

Klausimas, kurį suprantu, buvo pasirinktas jau vietoje ir dabar norite sujungti savo filialą su paskutiniu tos pačios dalies filialu.

1
21 июля '13 в 20:50 2013-07-21 20:50 atsakymą pateikė vartotojo1524957 liepos 21 d. , 13:20, 2013-07-21 20:50

Kiti klausimai apie „ žymes „ arba „ Klauskite“