Kaip „git -cherry-pick“ keičia tik tam tikrus failus?

Jei noriu sujungti į „Git“ filialą, pakeitimai, atlikti tik kai kuriose rinkmenose, buvo pakeisti tam tikroje veikloje, kuri apima kelių failų pakeitimus, kaip tai galima pasiekti?

Tarkime, kad „Git“ pavadintas „ stuff turi pakeitimus A , B , C ir D rinkmenose, bet noriu sujungti tik „ A ir „ B failų pakeitimus B Tai panaši į užduotį, skirtą „ git cherry-pick , tačiau cherry-pick žino, kaip sujungti visus įsipareigojimus, o ne rinkmenų pogrupį.

330
19 апр. Tobias Kienzler paklausė 19 balandžio. 2011-04-19 16:22 '11, 16:22, 2011-04-19 16:22
@ 9 atsakymai

Norėčiau tai padaryti su cherry-pick -n ( --no-commit ), kuri leidžia jums patikrinti (ir pakeisti) rezultatą prieš įsipareigojant:

 git cherry-pick -n <commit> # unstage modifications you don't want to keep, and remove the # modifications from the work tree as well. # this does work recursively! git checkout HEAD <path> # commit; the message will have been stored for you by cherry-pick git commit 

Jei didžioji dauguma pakeitimų nenorite, o ne patikrinkite atskirus kelius (vidurinį žingsnį), galite atstatyti viską iš naujo ir pridėti norimą informaciją:

 # unstage everything git reset HEAD # stage the modifications you do want git add <path> # make the work tree match the index # (do this from the top level of the repo) git checkout . 
402
19 апр. Jefromi atsakymas 19 d 2011-04-19 17:04 '11, 5:04 val. 2011-04-19 17:04

Kiti metodai man neveikė, nes įsipareigojimas turėjo daug pakeitimų ir prieštaravo daugeliui kitų failų. Aš atėjau teisingai

 git show SHA -- file1.txt file2.txt | git apply - 

Tiesą sakant, jis neprisiima jūsų įsipareigojimo, todėl jums gali prireikti jį atlikti

 git commit -c SHA 
68
22 апр. Atsakymas, kurį pateikė Michael Anderson Apr 22 2015-04-22 08:12 '15, 08:12 AM 2015-04-22 08:12

Galbūt šio metodo privalumas, palyginti su atsakymu į Jefromi, yra tas, kad nereikia prisiminti, kas gitų iš naujo yra teisinga :)

  # Create a branch to throw away, on which we'll do the cherry-pick: git checkout -b to-discard # Do the cherry-pick: git cherry-pick stuff # Switch back to the branch you were previously on: git checkout - # Update the working tree and the index with the versions of A and B # from the to-discard branch: git checkout to-discard -- AB # Commit those changes: git commit -m "Cherry-picked changes to A and B from [stuff]" # Delete the temporary branch: git branch -D to-discard 
34
19 апр. Atsakymas, kurį pateikė Mark Longair Apr 19 2011-04-19 16:30 11 val. 16.30 val. 2011-04-19 16:30

Paprastai -p vėliavą naudoju su kitos šakos čekiu, kuris, mano nuomone, yra paprastesnis ir sudėtingesnis nei daugelis kitų būdų, su kuriais susidūriau.

Iš esmės:

 git checkout <other_branch_name> <files/to/grab in/list/separated/by/spaces> -p 

Pavyzdys:

 git checkout mybranch config/important.yml app/models/important.rb -p 

Tada gausite dialogo >y (taip) n (ne) ir tt už kiekvieną kodo fragmentą.

-p arba „ patch veikia įvairioms git komandoms, įskaitant git stash save -p , kuri leidžia jums pasirinkti, ką norite išsaugoti nuo dabartinio darbo

Kartais naudoju šį metodą, kai padariau daug darbo, ir norėčiau ją padalyti ir padaryti jį griežtesniais įsipareigojimais, naudodamas git add -p ir pasirinkdamas, ką noriu kiekvienam pataisymui :)

28
02 марта '16 в 12:14 2016-03-02 12:14 atsakymą pateikė Tyrone Wilson kovo 02–16 d. 12:14 2016-03-02 12:14

Pasirinkus vyšną, galite rinktis iš konkrečios „fiksacijos“. Lengviausias sprendimas yra pasirinkti visus naudojamų failų pakeitimus.

  git checkout source_branch <paths>... 

Pavyzdyje:

 $ git branch * master twitter_integration $ git checkout twitter_integration app/models/avatar.rb db/migrate/20090223104419_create_avatars.rb test/unit/models/avatar_test.rb test/functional/models/avatar_test.rb $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: app/models/avatar.rb # new file: db/migrate/20090223104419_create_avatars.rb # new file: test/functional/models/avatar_test.rb # new file: test/unit/models/avatar_test.rb # $ git commit -m "'Merge' avatar code from 'twitter_integration' branch" [master]: created 4d3e37b: "'Merge' avatar code from 'twitter_integration' branch" 4 files changed, 72 insertions(+), 0 deletions(-) create mode 100644 app/models/avatar.rb create mode 100644 db/migrate/20090223104419_create_avatars.rb create mode 100644 test/functional/models/avatar_test.rb create mode 100644 test/unit/models/avatar_test.rb 

Šaltiniai ir išsamus paaiškinimas http://jasonrudolph.com/blog/2009/02/25/git-tip-how-to-merge-specific-files-from-another-branch/

UPDATE:

Naudojant šį git metodą nebus MERGE failas, jis paprasčiausiai panaikins visus kitus paskirties filialo pakeitimus. Jums reikės sujungti pakeitimus rankiniu būdu:

$ git diff HEAD failo pavadinimas

14
04 дек. atsakymas pateikiamas cminatti 04 dec. 2013-12-04 16:16 '13, 16:16, 2013-12-04 16:16

Norėčiau tiesiog surinkti viską ir tada tai padaryti:

 git reset --soft HEAD^ 

Tada norėčiau atšaukti pakeitimus, kurių nenoriu, ir atlikite naują pataisymą.

7
12 авг. atsakymas duotas linksmybei 12 rug . 2014-08-12 00:20 '14 - 0:20 2014-08-12 00:20

Naudokite „ git merge --squash branch_name , tai pakeis visus pakeitimus kitoje šakoje ir parengs jums pataisą. Dabar ištrinkite visus nereikalingus pakeitimus ir palikite norimą. Ir gitai nežino, kas atsitiko.

1
30 окт. atsakymas pateikiamas netinkamas 30 okt. 2017-10-30 20:02 '17 ne 20:02 2017-10-30 20:02

Radau kitą būdą, kuris neleidžia prieštaringai susiliejant su vyšnių pasirinkimu, kurį IMO lengva prisiminti ir suprasti. Kadangi jūs iš tikrųjų nepasirinkote chartijos, bet jos dalis, pirmiausia turite ją nutraukti, o tada sukurti savo poreikius atitinkančią fiksaciją.

Pirmiausia sukurkite filialą iš įsipareigojimo, kurį norite padalyti, ir patikrinkite:

 $ git checkout COMMIT-TO-SPLIT-SHA -b temp 

Tada grąžinkite ankstesnį įsipareigojimą:

 $ git reset HEAD~1 

Tada pridėkite norimus pasirinkti failus / pakeitimus:

 $ git add FILE 

ir pataisykite:

 $ git commit -m "pick me" 

Atkreipkite dėmesį į fiksavimo maišos kodą, skambinkite „PICK-SHA“ ir grįžkite į pagrindinį filialą, pavyzdžiui, norėdami pradėti tikrinti:

 $ git checkout -f master 

ir vyšnių pasirinkimo fiksacija:

 $ git cherry-pick PICK-SHA 

Dabar galite ištrinti tempą:

 $ git branch -d temp -f 
1
16 февр. Aleksejus atsakė 16 vasario mėn. 2017-02-16 00:57 '17 prie 0:57 2017-02-16 00:57

Yra ideologiškai neteisingas, bet labai produktyvus būdas.

  • Jei norite peržiūrėti visą failo, kurį norite naudoti, turinį, naudokite git arba git show GUI.
  • Tada rankiniu būdu įdėkite jį į savo IDE / redaktorių.
  • Išsaugokite ir peržiūrėkite.

Tai yra „neteisinga“, bet vis tiek mirusi ir leidžia pritaikyti redaktoriaus pakeitimus.

-2
06 дек. Nick Olszanski atsakymas gruodis 06 2017-12-06 23:18 '17 at 11:18 2017-12-06 23:18

Kiti klausimai apie žymes arba Ask a question