Kaip vyšnios renka eilę įsipareigojimų ir susijungia į kitą šaką.

Turiu tokį saugyklos išdėstymą:

  • pagrindinė pramonė (gamyba)
  • Integracija
  • veikia

Noriu pasiekti, kad iš darbo šakos pasiektų eilę įsipareigojimų ir sujungčiau jį į integracijos šaką. Aš esu naujas, ir aš negaliu suprasti, kaip tai padaryti (pasirenkant vyšnių fiksavimo diapazonus vienoje operacijoje, o ne susijungiant), nesusiję saugyklos. Bet kokie patarimai ar mintys apie tai? Ačiū!

452
03 янв. Nustatykite Crazybyte 03 Jan 2010-01-03 12:50 '10, 12:50, 2010-01-03 12:50
@ 7 atsakymai

Kai kalbama apie keletą įsipareigojimų, vyšnių pasirinkimas nėra praktiška.

Kaip minėta toliau , Keith Kim , 1.7.1+ Git, pristatė gebėjimą vyšnioti - pasirinkti keletą įsipareigojimų (bet vis tiek turite žinoti, kokių pasekmių pasirinksite vyšną būsimam susiliejimui )

„git cherry-pick“ išmoko pasirinkti įvairius įsipareigojimus
(pavyzdžiui, „ cherry-pick A..B “ ir „ cherry-pick --stdin “), taip pat „ git revert “; tačiau jie nepalaiko geresnės „ rebase [-i] “ sekos kontrolės.

Damian ir įspėja mus:

cherry-pick A..B “ forma turi būti senesnė nei B
Jei tai neteisinga tvarka, komanda nepavyks .

Jei norite pasirinkti nuo B iki D (imtinai) diapazoną , kuris bus B^..D
Žr. „ Git filialo kūrimas iš ankstesnių įvykių diapazono “.

Kaip Jubobs minėjo komentaruose :

Tai daro prielaidą, kad B nėra šaknies fiksavimas; kitaip gausite „ unknown revision “.

Pastaba: Nuo Git 2.9.x / 2.10 (2016 m. Trečiąjį ketvirtį), galite surinkti fiksavimo diapazoną tiesiai į nenustatytų autorių teisių šaką (tuščią galvą): žr. „ Kaip padaryti, kad esamas filialas taptų našlaičiu “.


Originalus atsakymas (2010 m. Sausio mėn.)

rebase --onto būtų geriau, jei rebase --onto nurodytą fiksavimo diapazoną per savo integracijos šaką, kaip aprašė Charles Bailey .
(taip pat žr. „Tai, kaip jūs perkeliate temos filialą, pagrįstą vienu filialu į kitą“, „ git rebase --onto puslapyje, kad pamatytumėte praktinį „ git rebase --onto

Jei jūsų dabartinė filialas yra integracija:

aptartas čia ir jame bus kažkas panašaus: 

Jei norite naudoti pleistrų metodą, tuomet „git format-patch | git am“ ir „git cherry“ yra jūsų parinktys.
Šiuo metu „ git cherry-pick priima tik vieną įvykį, bet jei norite pasirinkti diapazoną nuo B iki D , kuris bus „ B^..D

588
03 янв. atsakymas pateikiamas VonC 03 jan. 2010-01-03 13:08 '10, 13:08, 2010-01-03 13:08

Kaip ir git v1.7.2 atveju, vyšnios gali priimti įvairius įsipareigojimus:

git cherry-pick sužinojo, kaip pasirinkti įvairius įsipareigojimus (pvz., cherry-pick A..B ir cherry-pick --stdin ), taigi git revert ; tačiau jie nepalaiko geresnės rebase [-i] sekos kontrolės.

109
08 сент. Atsakymas, kurį pateikė Keith Kim Sep 08 2010-09-08 06:57 '10, 6:57, 2010-09-08 06:57

Ar tikrai nenorite sujungti filialų? Jei darbo skyriuje yra kokių nors naujausių įsipareigojimų, kurių jums nereikia, galite tiesiog sukurti naują filialą su HEAD į reikiamą tašką.

Dabar, jei tikrai norite, kad vyšnios pasirinktų visą eilę įsipareigojimų, dėl kažkokios priežasties elegantiškas būdas tai padaryti yra tiesiog ištraukti patchsetą ir pritaikyti jį naujam integracijos padaliniui:

 git format-patch A..B git checkout integration git am *.patch 

Tai iš esmės tai, ką git -rebase daro vistiek, bet nereikia žaisti žaidimų. Jei norite sujungti, galite pridėti --3way į git-am . Įsitikinkite, kad nėra kitų * .patch failų, esančių kataloge, kuriame tai darote, jei laikotės nurodymų ...

21
04 янв. atsakymas yra djs 04 jan. 2010-01-04 12:32 '10, 12:32, 2010-01-04 12:32

Patogumo sumetimais „VonC“ kodą įdėjau į trumpą „bash“ scenarijų, git-multi-cherry-pick

 #!/bin/bash if [ -z $1 ]; then echo "Equivalent to running git-cherry-pick on each of the commits in the range specified."; echo ""; echo "Usage: $0 start^..end"; echo ""; exit 1; fi git rev-list --reverse --topo-order $1 | while read rev do git cherry-pick $rev || break done 

Šiuo metu tai naudoju, kai atkuriu projekto istoriją, kurioje trečiosios šalies kodas ir nustatymai buvo sujungti į tą patį svn kamieną. Dabar, kai noriu geriau suprasti nustatymus ateityje, pasidalinu pagrindiniu trečiosios šalies kodu, trečiųjų šalių moduliais ir nustatymais savo git šakose. git-cherry-pick yra naudinga šioje situacijoje, nes turiu du medžius vienoje saugykloje, bet be bendro protėvio.

7
31 марта '10 в 17:20 2010-03-31 17:20 atsakymą davė Adam Franco kovo 31 d. 10 d. 17:20 2010-03-31 17:20

Visos šios parinktys paragins išspręsti sujungimo konfliktus. Jei sujungsite komandoje padarytus pakeitimus, sunku išspręsti sujungimo konfliktus su kūrėjais ir tęsti. Tačiau „git“ sujungimas atliks sujungimą su vienu šūviu, bet negalite perduoti pakeitimų kaip argumento. mes turime naudoti komandas „git diff“ ir „git apply“, kad įvykdytume sukimosi intervalą. Pastebėjau, kad „git taikymas“ nepavyks, jei taisymo failas turi daug skirtingų failų, todėl kiekvienam failui reikia sukurti pleistrą ir tada taikyti. Atminkite, kad scenarijus negalės ištrinti šaltinių filialuose ištrintų failų. Tai retas atvejis, galite ištrinti tokius failus iš tikslinės šakos. „Git apply“ išėjimo būsena nėra lygi nuliui, jei ji negali taikyti pleistro, tačiau, jei naudojate parametrą -3way, jis grįš į 3 pusių sujungimą, ir jums nereikės nerimauti dėl šio gedimo.

Žemiau yra scenarijus.

 enter code here #!/bin/bash # This script will merge the diff between two git revisions to checked out branch # Make sure to cd to git source area and checkout the target branch # Make sure that checked out branch is clean run "git reset --hard HEAD" START=$1 END=$2 echo Start version: $START echo End version: $END mkdir -p ~/temp echo > /tmp/status #get files git --no-pager diff --name-only ${START}..${END} > ~/temp/files echo > ~/temp/error.log # merge every file for file in `cat ~/temp/files` do git --no-pager diff --binary ${START}..${END} $file > ~/temp/git-diff if [ $? -ne 0 ] then # Diff usually fail if the file got deleted echo Skipping the merge: git diff command failed for $file >> ~/temp/error.log echo Skipping the merge: git diff command failed for $file echo "STATUS: FAILED $file" >> /tmp/status echo "STATUS: FAILED $file" # skip the merge for this file and continue the merge for others rm -f ~/temp/git-diff continue fi git apply --ignore-space-change --ignore-whitespace --3way --allow-binary-replacement ~/temp/git-diff if [ $? -ne 0 ] then # apply failed, but it will fall back to 3-way merge, you can ignore this failure echo "git apply command filed for $file" fi echo STATUS=`git status -s $file` if [ ! "$STATUS" ] then # status is null if the merged diffs are already present in the target file echo "STATUS:NOT_MERGED $file" echo "STATUS: NOT_MERGED $file$" >> /tmp/status else # 3 way merge is successful echo STATUS: $STATUS echo "STATUS: $STATUS" >> /tmp/status fi done echo GIT merge failed for below listed files cat ~/temp/error.log echo "Git merge status per file is available in /tmp/status" 
2
07 сент. atsakymas, kurį pateikė Yoganand Bijapur, rugsėjo 7 d 2016-09-07 09:48 '16 at 9:48 2016-09-07 09:48

Kitas variantas būtų sujungti su mūsų strategija su fiksacija prieš diapazoną, o tada į „normalų“ sujungimą su paskutiniu to intervalo fiksavimu (arba filialu, kai jis yra paskutinis). Tarkime, kad kapitonas atlieka tik 2345 ir 3456, kurie turėtų būti sujungti į šios funkcijos filialą:

 kapitonas: 1234 2345 3456 4567

funkcijų skyriuose:

 „git“ sujungimas-s mūsų 4567 git merge 2345
0
16 авг. Koos Vriezeno atsakymas, pateiktas rugpjūčio 16 d. 2015-08-16 15:47 '15 15:47 2015-08-16 15:47

Tarkime, jūs turite 2 filialus,

„branchA“: apima įsipareigojimus, kuriuos norite kopijuoti (nuo „ASSA“ iki „įsipareigojimų“)

„branchB“: filialas, kurį norite įsipareigoti perkelti iš „branchA“

1)

  git checkout <branchA> 

2) gauti identifikatorių „ASSA“ ir „įsipareigojimus“

3)

 git checkout <branchB> 

4)

 git cherry-pick <commitA>^..<commitB> 

5) Jei turite konfliktą, išspręskite ją ir įveskite

 git cherry-pick --continue 

tęsti vyšnių rinkimo procesą.

0
01 авг. atsakymas pateikiamas KostasA 01 rug . 2017-08-01 17:29 '17, 17:29 pm 2017-08-01 17:29

Kiti klausimai apie žymas arba Ask a Question