චෙරි-පික් බහුවිධ කොමිස් ගන්නේ කෙසේද


924

මට අතු දෙකක් තිබේ. සිදු aඅනෙක් කර ඇති අතර, එක් ප්රධානියා වේ b, c, d, eහා fඋඩ a. මම ගමන් කිරීමට අවශ්ය c, d, eහා fසිදු නොමැතිව පළමු ශාඛාව විවෘත කිරීමට b. චෙරි බුද්ධත්වය භාවිතා කිරීම පහසුය: ලොව පුරාවටම පළමු ශාඛාව චෙරි-තෝරාගන්න එක් එක් cකිරීමට fහා පළමු මතට දෙවන ශාඛාව rebase. එහෙත්, එහි චෙරි-තෝරාගන්න සියලු කිසිදු ක්රමයක් c- fඑක් විධානය?

දර්ශනය පිළිබඳ දෘශ්‍ය විස්තරයක් මෙන්න (ස්තූතියි ජේජේඩී ):

රූප විස්තරය මෙහි ඇතුළත් කරන්න


3
ඔබ සඳහන් කළ ප්‍රතිප්‍රහාරය ප්‍රශ්නයට සැබවින්ම අදාළ නොවේ ද? (මම ඔබට අවශ්ය විය හැක බව ලබා bමත පදනම් විය යුතු fපසුව, නමුත් එම චෙරි-පන්දු යැවීමේදි සමග ගෑවිලාවත් නැත.)
Superole

Answers:


1382

Git 1.7.2 මඟින් චෙරි විවිධාකාර කොමිස් තෝරා ගැනීමේ හැකියාව හඳුන්වා දෙන ලදී. සිට නිදහස් සටහන් :

git cherry-pickකොමිස් පරාසයක් තෝරා ගැනීමට ඉගෙන ගත්තේය (උදා: cherry-pick A..Bසහ cherry-pick --stdin) git revert; මේවා වඩා හොඳ අනුක්‍රමික පාලනයට සහාය නොදක්වයි rebase [-i].

කැපවීමට Aකැපවීමට B( Aවඩා පැරණි තැන ) චෙරි-තෝරා ගැනීමට B, ධාවනය කරන්න:

git cherry-pick A^..B

ඔබට A නොසලකා හැරීමට අවශ්‍ය නම් , ධාවනය කරන්න:

git cherry-pick A..B

(අදහස් දැක්වීමේදී ණය ඩේමියන්, ජේ. බී. රේන්ස්බර්ගර් සහ ස්චේෆ් වෙත යයි)


254
"චෙරි-පික් ඒ..බී" ආකෘතියේ, A ට වඩා පැරණි විය යුතුය. ඒවා වැරදි පිළිවෙලක් නම් විධානය නිහ ly ව අසමත් වනු ඇත.
ඩේමියන්

300
එසේම, මෙය චෙරි-පික් ඒ නොව, ඒ දක්වා සහ බී ඇතුළු සියල්ල ඇතුළත් වේ
ජේබී රේන්ස්බර්ගර්

463
සාධාරණ වර්ගයක් ඇතුළත් කිරීමටgit cherry-pick A^..B
kiritsuku

18
ඔබ GIT 1.7.1 හෝ ඉන් පෙර ඇති සහ යාවත්කාලීන කර නොහැකි නම්, ඔබ ඉතා ඉක්මනින් ඔවුන් සඳහා ධාවනය වන චෙරි-තෝරාගන්න git cherry-pick f~3පසුව git cherry-pick f~2ආදිය දක්වා git cherry-pick fමම ඉක්මනින් සංඛ්යාව හා ලකුණු වෙනස් කළ හැකි නිසා පෙර භාවිතා ලැබෙන ඉහළ ඊතලය දැවෙන ( එය බොහෝ කොන්සෝල වල සමාන විය යුතුය).
ඩේවිඩ් මේසන්

19
මෙම වාක්‍ය ඛණ්ඩය ශාඛා නාම සමඟ ද ක්‍රියාත්මක වන බව දැන ගැනීම හොඳ විය හැකිය. git cherry-pick master..somebranchමාස්ටර් (දැනටමත් මාස්ටර් වෙත නැවත ප්‍රතිස්ථාපනය කර ඇතැයි උපකල්පනය කර ඇති බැවින්) යම්කිසි ශාඛාවක ඇති සියලුම කොමිස් තෝරාගෙන ඒවා ඔබගේ වර්තමාන ශාඛාවට යොදනු ඇත.
ටෝර් ක්ලින්බර්ග්

107

මෙය කළ හැකි සරලම ක්‍රමය වන්නේ ontoවිකල්පයයි rebase. වන වත්මන් අවසාන වීමෙන් දී ශාඛා කියා සිතන්න amybranch ලෙස හඳුන්වන අතර මෙම වෙනස් කිරීමට අවශ්ය බව, ශාඛාවක් c- fමතට.

# checkout mybranch
git checkout mybranch

# reset it to f (currently includes a)
git reset --hard f

# rebase every commit after b and transplant it onto a
git rebase --onto a b

1
ඔබට ස්තුතියි! ඔබ ද එකතු කළ හැකි ය git checkout secondbranch && git rebase mybranchපිළිතුරක් සඳහා
ටිග්

1
මෙම තත්වය තුළ මගේ හිස වටා ගමන් කිරීමට මෙම පිළිතුර මට බෙහෙවින් ඉවහල් විය. තවද: ඔබට rebaseඅන්තර්ක්‍රියාකාරී මාදිලියද භාවිතා කළ හැකිය . ස්තූතියි, har චාර්ල්ස්!
ඔලිවර්

1
මෙම ප්‍රවේශයේ ඇති සුන්දරත්වය නම්, ඔබට --interactive"චෙරි පික්" ට පෙර අනුපිළිවෙලින් සමහර කොමිස් ඉවත් කිරීමට හෝ ඒවා නැවත සකස් කිරීමට භාවිතා කළ හැකිය . +1
මයිකල් මෙරිකල්

මෙය අව්‍යාජ විධානයකි, ඔබේ හිස එතීමට ටිකක් උපක්‍රමශීලී නමුත් එය පුදුම සහගත ලෙස ක්‍රියා කරයි.
වැලෙරියෝ

1
( මෙම උදාහරණයේ දී) එක් තර්කයක් ලෙස නැවත ප්‍රතිස්ථාපනය කිරීමට ඔබට අවශ්‍ය නැති බවට වන කැපවීම ඔබ විසින් දිය යුතු ය. bඑහෙත් ඔව් මෙය මට වැඩ කර ඇත.
asontu

87

හෝ ඉල්ලූ එක් ලයිනර්:

git rebase --onto a b f

5
එහි සංක්ෂිප්තය සඳහා පමණක් නම්, මෙය හොඳම පිළිතුරයි.
නේට් චැන්ඩ්ලර්

9
ඉහළට බැඳී ඇති නමුත් f කැපවීමක් නම් (ශාඛාවකට වඩා වෙනස්ව) ඔබව වෙන් කළ
හෙඩ් තත්වයට

68

ඔබ ක අනුක්රමික එකතුවක් භාවිතා කළ හැකි git rebaseහා git branchඅනාචාරයේ පිරිසක් තවත් ශාඛා මතට අයදුම් කිරීමට. Wolfc විසින් දැනටමත් පළ කර ඇති පරිදි පළමු විධානය සත්‍ය වශයෙන්ම පිටපත් පිටපත් කරයි. කෙසේ වෙතත්, ඔබ කණ්ඩායමේ ඉහළම කැපවීම සඳහා ශාඛා නාමයක් එක් කරන තුරු වෙනස නොපෙනේ.

කරුණාකර පින්තූරය නව පටිත්තකින් විවෘත කරන්න ...

කාර්ය ප්‍රවාහය

පෙළ ස්වරූපයෙන් විධාන සාරාංශ කිරීමට:

  1. විධානය භාවිතා කර ස්වාධීන ක්‍රියාවලියක් ලෙස gitk විවෘත කරන්න : gitk --all &.
  2. දුවන්න git rebase --onto a b f.
  3. මාධ්ය F5තුළ gitk . කිසිවක් වෙනස් නොවේ. නමුත් කිසිවක් HEADසලකුණු කර නැත .
  4. දුවන්න git branch selection
  5. මාධ්ය F5තුළ gitk . එහි කැපවීම් සහිත නව ශාඛාව දිස්වේ.

මෙය කරුණු පැහැදිලි කළ යුතුය:

  • කැපවීම aයනු කණ්ඩායමේ නව මූල ගමනාන්තයයි.
  • කැපවීම bයනු කණ්ඩායමේ පළමු කැපවීමට පෙර ඇති කැපවීමයි (සුවිශේෂී).
  • කැපවීම fයනු කණ්ඩායමේ අවසාන කැපවීමයි (ඇතුළුව).

පසුව, ඔබ භාවිතා කළ හැකි git checkout feature && git reset --hard bමෙම අනාචාරයේ මැකීමට cදක්වා fසිට featureශාඛා.

මෙම පිළිතුරට අමතරව, මම බ්ලොග් සටහනක් ලිවූ අතර එය සාමාන්‍යයෙන් භාවිතා කිරීමට උපකාරී වන වෙනත් අවස්ථාවක විධාන විස්තර කරයි.


2
මයිබ්‍රාන්ච් (a..f කොමිස්) තවදුරටත් අවශ්‍ය නොවන්නේ නම් මෙය සරල කළ හැකිය: git rebase --onto a b mybranchසහ btw - එම නිර්‍මාණ git පින්තූර කරන්නේ කුමන වැඩසටහනද?
Mr_and_Mrs_D

2
CommentMr_and_Mrs_D ඔබගේ අදහස් දැක්වීමට ස්තූතියි. මම හිතන්නේ මම පින්තූර ඇඳීමට cacoo.com භාවිතා කළා .
ජේජේ

52

ප්‍රශ්නයට නිශ්චිතවම පිළිතුරු සැපයීම සඳහා ජේ. බී. රේන්ස්බර්ගර් සහ ෂාචෙෆ්ගේ අදහස් යෙදීම සඳහා ... මෙම උදාහරණයේ චෙරි-පික් පරාසයක් භාවිතා කිරීමට:

git checkout a
git cherry-pick b..f

හෝ

git checkout a
git cherry-pick c^..f

4
මම git 2.7.0.windows.1චෙරි පික් පරාසය කිරීමට උත්සාහ කරන විට සෑම දෙයක්ම හරි නමුත් මම git cherry-pick --continue | --abort | --quitනැවත චෙරි-පික් කිරීමට උත්සාහ කිරීමට පෙර කළ යුතු බව git ඔබට කොතැනකවත් නොකියයි . එබැවින් ඔබ චෙරි-පික් පරාසයේ කොමිස් නම්, ඔබ git cherry-pick --continueසූදානම් වන සෑම අවස්ථාවකම (ගැටුම් නිරාකරණය කිරීම හෝ එවැනි දේ) ලබා දී ඇති පරාසයේ කැපවීමකින් ක්‍රියාත්මක කිරීමට අවශ්‍ය වේ.
kuskmen

මම හරියටම කළා, නමුත් මාරාන්තිකයි: 'අ..බී' සොයාගත නොහැක
අමිත් කාර්නික්

මම වැරදුනේ කොහේදැයි මම නොදනිමි, නමුත් මම මගේ පැත්තේ 'git cherry-pick c ^ .. f' කරන විට, මෙයට බැඳීම් f ඇතුළත් වන නමුත් කැපවීම c නොවේ. නමුත් මම සෑම තැනකම කියවන විට, එය c සහ f ඇතුළත් වන ලෙස අර්ථ දැක්විය යුතුය. නැත්නම් මම වැරදිද?
සැමුවෙල්

Am සාමුවෙල් ඔව්, ඒක හරි. මෙම ^"ඇ පෙර සිදු" යන ඇ පසු ඇත්තටම අදහස් මෙම නඩුවේ ආ වන. මේ නිසා c^..fසමාන වේ b..f. එසේ කිරීමට උත්සාහ කරන්න git log c^..f, ඔබ කළ ආකාරයටම එෆ් හරහා කොමිස් දකිනු ඇතgit log b..f
ඇන්ඩි


21
git rev-list --reverse b..f | xargs -n 1 git cherry-pick

2
ගැටුම් නොමැති නම් පරිපූර්ණව ක්‍රියා කරයි, එසේ නොමැති නම් එය නැවත නැවැත්වීම පහසු වනු ඇති අතර එය නතර වී ඇත්තේ කොතැනදැයි සොයා ගැනීමට සහ ඉතිරි පැච් නැවත යෙදීමට ඔබට අවශ්‍ය නොවනු ඇත.
රුස්ලාන් කබලින්

6
කරුණාකර මෙය කරන්නේ කුමක්ද යන්න පැහැදිලි කරමින් අදහස් එක් කරන්න
Mr_and_Mrs_D

7
කිසිවෙකු පැහැදිලි නොකළ හෙයින් ... git rev-list මඟින් සියලුම සංශෝධන b ශාඛාවේ සිට f දක්වා (ආපසු හරවනු ලැබේ) මුද්‍රණය කරයි, එවිට එක් එක් පේළිය (බැඳීම් හැෂ්) පිළිවෙලට සම්මත වූ විට, එය චෙරි සෑම එකක්ම වත්මන් git HEAD වෙත තෝරා ගනු ඇත. එනම්git cherry-pick {hash of c}; git cherry-pick {hash of d}; ...
coderatchet

9

කැපවීමේ හැඳුනුම්පතක සිට ශාඛාවේ අග දක්වා චෙරි තෝරා ගැනීමට, ඔබට මෙය භාවිතා කළ හැකිය:

git cherry-pick commit_id^..branch_name


මෙය දැනටමත් පිළිතුරු stackoverflow.com/a/31640427/96823
tig

2
මෙම පිළිතුර ඇත්ත වශයෙන්ම වෙනස් වන අතර එය මට ප්‍රයෝජනවත් විය. එය නියම කරන්නේ ශාඛා නාමය මිස අවසාන බැඳීම SHA නොවේ.
සියුම් ට්‍රී

9

සඳහන් කළ යුතු තවත් ප්‍රභේදයක් නම්, ඔබට nශාඛාවකින් අවසන් වරට කිරීමට අවශ්‍ය නම් , ~වාක්‍ය ඛණ්ඩය ප්‍රයෝජනවත් විය හැකිය:

git cherry-pick some-branch~4..some-branch

මෙම අවස්ථාවෙහිදී, ඉහත විධානය මඟින් හැඳින්වෙන ශාඛාවකින් අවසන් කොමිස් 4 තෝරා ගනු ඇත some-branch(ඔබට ශාඛා නාමයක් වෙනුවට බැඳීම් හෑෂ් භාවිතා කළ හැකි වුවද)


3

ඇත්ත වශයෙන්ම, එය කළ හැකි සරලම ක්‍රමය විය හැක්කේ:

  1. ශාඛා දෙක අතර ඒකාබද්ධ කිරීමේ පදනම සටහන් කරන්න: MERGE_BASE=$(git merge-base branch-a branch-b)
  2. පැරණි ශාඛාව නව ශාඛාවට වේගයෙන් ඉදිරියට ගෙනයන්න
  3. 1 වන පියවරේ සිට ඒකාබද්ධ කිරීමේ පදනමේ සිට ආරම්භ වන ප්‍රති branch ලය වන ශාඛාව නැවත ප්‍රතිස්ථාපනය කරන්න, සහ අපේක්ෂා නොකරන කොමිස් අතින් ඉවත් කරන්න:

    git rebase ${SAVED_MERGE_BASE} -i
    

    විකල්පයක් ලෙස, නව කොමිස් කිහිපයක් පමණක් තිබේ නම්, පළමු පියවර මඟ හැර සරලව භාවිතා කරන්න

    git rebase HEAD^^^^^^^ -i
    

    පළමු පියවරේදී, ^ඒකාබද්ධ කිරීමේ පදනම පසුකර යාමට ප්‍රමාණවත් ලෙස භාවිතා කිරීම.

අන්තර්ක්‍රියාකාරී ප්‍රතිරෝධය තුළ ඔබ මෙවැනි දෙයක් දකිනු ඇත:

pick 3139276 commit a
pick c1b421d commit b
pick 7204ee5 commit c
pick 6ae9419 commit d
pick 0152077 commit e
pick 2656623 commit f

ඉන්පසු b පේළි ඉවත් කරන්න (සහ ඔබට අවශ්‍ය වෙනත් අය)


1
git format-patch --full-index --binary --stdout range... | git am -3

43
කරුණාකර මෙය කරන්නේ කුමක්ද යන්න පැහැදිලි කරමින් අදහස් එක් කරන්න
Mr_and_Mrs_D

0

චෙරි පික් සඳහා කුමන ප්‍රභවයන් සහ ඉලක්කගත ශාඛා සහ කොමිට් ගණනදැයි තිර පිටපතට පැවසීමෙන් ඔබට පේළි කිහිපයකින් චෙරි-පික් කිරීමට ඉඩ සලසන පිටපතක් මෙන්න:

https://gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81

ඔබේ ශාඛාවේ සිට ස්වාමියා දක්වා චෙරි-තෝරා ගැනීමට (වත්මන් ශාඛාව ප්‍රභවයක් ලෙස භාවිතා කරයි):

./gcpl.sh -m

ඔබගේ 6.19.x ශාඛාවේ සිට මාස්ටර් වෙත නවතම කොමිස් 5 චෙරි-තෝරා ගැනීමට:

./gcpl.sh -c 5 -s 6.19.x -t master

ඔබට කෙලින්ම Git සමඟ එය කළ හැකි විට මෙම ස්ක්‍රිප්ට් අවශ්‍ය වන්නේ ඇයි? ...
code_dredd

අඩු ටයිප් කිරීමක් සහ මගේ ස්ක්‍රිප්ට් ස්වයංක්‍රීයව ඔබ වෙනුවෙන් කොමිස් තෝරා ගනී, එබැවින් ඔබට චෙරි සෑම එකක්ම එහි SHA මගින් තෝරා ගැනීමට අවශ්‍ය නැත. කෙසේ හෝ වයි.එම්.වී.
නික්බෝල්ට්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.