Git හි නිශ්චිත බැඳීමක් ඒකාබද්ධ කරන්නේ කෙසේද


1064

මම GitHub හි ගබඩාවකින් ශාඛාවක් ලබාගෙන මට විශේෂිත යමක් කර ඇත්තෙමි. දැන් මට පෙනී ගියේ මුල් ගබඩාවේ හොඳ අංගයක් ඇති බවය HEAD.

මට එය ඒකාබද්ධ කිරීමට අවශ්‍ය වන්නේ පෙර කළ කැපවීම් නොමැතිව පමණි. මම කළ යුත්තේ කුමක් ද? සියලු කොමිස් ඒකාබද්ධ කරන්නේ කෙසේදැයි මම දනිමි:

git branch -b a-good-feature
git pull repository master
git checkout master
git merge a-good-feature
git commit -a
git push

ගිතූබ් සම්බන්ධව ඔබ මෙය කිරීමට උත්සාහ කරන්නේ නම්, මෙම ලිපිය ඔබව ඒ හරහා යොමු කරනු ඇත. markosullivan.ca/how-to-handle-a-pull-request-from-github
johndpope

Answers:


1200

' git cherry-pick' මෙන්න ඔබේ පිළිතුර විය යුතුය.

පවත්නා බැඳීමකින් හඳුන්වා දුන් වෙනස යොදන්න.

මෙම ලිපියේ චෙරි අච්චාරු කිරීමේ ප්‍රතිවිපාක ගැන bdonlan ගේ පිළිතුර කියවීමට අමතක නොකරන්න :
“සියලුම කොමිස් ශාඛාවකින් අදින්න, නිශ්චිත කොමිස් වෙනත් තැනකට තල්ලු කරන්න” , එහිදී:

A-----B------C
 \
  \
   D

බවට පත්වේ:

A-----B------C
 \
  \
   D-----C'

මෙම බැඳීමෙහි ඇති ගැටළුව නම්, සියළුම ඉතිහාසය ඔවුන් ඉදිරියේ ඇතුළත් කිරීමට බැඳීම් සලකා බලයි

C ට වෙනස් SHA-1හැඳුනුම්පතක් ඇති තැන.
ඒ හා සමානව, චෙරි එක් ශාඛාවක සිට තවත් ශාඛාවකට බැඳීමක් තෝරා ගැනීම මූලික වශයෙන් පැච් එකක් ජනනය කිරීම, පසුව එය යෙදීමෙන් ඉතිහාසය ද ඒ ආකාරයෙන්ම අහිමි වේ.

මෙම බැඳීම් හැඳුනුම්පත් වෙනස් කිරීම වෙනත් දේ අතර git ඒකාබද්ධ කිරීමේ ක්‍රියාකාරිත්වය බිඳ දමයි.
වැදගත්ම දෙය නම්, එය ක්‍රියාකාරී පරායත්තතාවයන් නොසලකා හැරීමයි - C ඇත්ත වශයෙන්ම B හි අර්ථ දක්වා ඇති ශ්‍රිතයක් භාවිතා කළේ නම්, ඔබ කිසි විටෙකත් නොදනී .


1
id openid000: “වඩා සියුම් අතු”: ඇත්ත වශයෙන්ම bdonlan ඔහුගේ පිළිතුරෙන් යෝජනා කළේ එයයි.
VonC

8
සටහන: "git rebase" ද SHA-1 වෙනස් කරයි. "Git rebase vs. git merge ( stackoverflow.com/questions/804115/git-rebase-vs-git-merge ) සහ" git workflow "( stackoverflow.com/questions/457927/… )" git rebase "නීත්‍යානුකූලයි.
VonC

1
“සිහින් ධාන්ය අතු”, “චෙරි-පික්” සහ “නැවත සකස් කිරීම” අතර, එවිට ඔබට git සමඟ ශාඛා තුළ කේත කළමනාකරණය කිරීමේ සියලු හැකියාවන් ඇත.
VonC

OnVonC “සිහින් ධාන්ය අතු” ඔව්. මට ශාඛා දෙකක් තිබූ අතර එක් ශාඛාවක විශේෂිත දෘශ්‍යකරණ මොඩියුලයකට වැඩි දියුණු කිරීම් කර ඇත. මෙම මොඩියුලය අනෙක් සියලුම කේත වලින් ස්වාධීන වූ බැවින් චෙරි-පික් මෙම වෙනස්කම් වෙනත්
ශාඛාවලටද

1
නමුත් ඔබ ඒකාබද්ධ කරන විට, බැඳීම් ඉතිහාසයේ C සහ C යන දෙකම පවතිනු ඇති බව සලකන්න.
රාහුල් ෂා

760

ඔබගේ වර්තමාන ශාඛාවට තනි කැපවීමක් යෙදීම සඳහා ඔබට git cherry-pick භාවිතා කළ හැකිය.

උදාහරණයක්: git cherry-pick d42c389f


69
චෙරි අච්චාරු කිරීම පිළිබඳ ඔබගේ කලින් තනතුර සඳහා +1 ( stackoverflow.com/questions/880957/… ). ඉහත උපුටා ගැනීම මගේම පිළිතුරෙන් පිටපත් කිරීමට මම නිදහස ලබා ගතිමි.
VonC

4
බොහෝ විට git cherry-pick d42cහෝ git cherry-pick d42c3 වැඩ කරනු ඇත. Git දක්ෂයි. ;)
ගුනීසස්

2
මාරාන්තික: නරක සංශෝධනය
අයිවන් නයිඩා

3
මම මේ විධානය ක්‍රියාත්මක කළ අතර එය ක්‍රියාත්මක වූ බව පෙනේ, නමුත් මම git status කරන විට, එය පවසන්නේ "කැපවීමට කිසිවක් නැත, වැඩ කරන ගස පිරිසිදුයි" යන්නයි. මම මගේ බිට්බකට් වෙබ් පිටුවේ කොමිට්ස් පිටුව නැවුම් කළ විට එය නොපෙන්වයි. නමුත් මම git ලොග් ක්‍රියාත්මක කරන විට එය දිස්වේ. නවීකරණය කරන ලද කේතය මට පෙනේ. මට අමතර පියවරයන් ගත යුතු දැයි යමෙකුට පැහැදිලි කළ හැකිද?
රේ

2
අවාසනාවට මෙය ප්‍රශ්නයට පිළිතුරු සපයන්නේ නැත: එය සැබවින්ම ඒකාබද්ධ කිරීමක් නිර්මාණය නොකරයි. මුතුන්මිත්තන් පෙන්වා නැත d42c389f. සමහර විට OP ඒකාබද්ධ කිරීමක් නිර්මාණය කිරීම ගැන තැකීමක් නොකළ නමුත් සමහර විට වෙනස වැදගත් වේ.
LarsH

30

අපි උදාහරණයක් ගෙන තේරුම් ගැනීමට උත්සාහ කරමු:

මට ශාඛාවක් ඇත, මාස්ටර් කියන්න , X <commit-id> වෙත යොමු කරමින්, මට Y <sha1> වෙත යොමු වන නව ශාඛාවක් ඇත.

කොහෙද Y <සිදු-id> = <ස්වාමියා> ශාඛා අනාචාරයේ - අනාචාරයේ කිහිපයක්

දැන් Y ශාඛාව සඳහා මාස්ටර් ශාඛාව සහ නව ශාඛාව අතර ඇති පරතරය වසා දැමිය යුතු යැයි කියන්න. අපට අනුගමනය කළ හැකි ක්‍රියා පටිපාටිය පහත දැක්වේ:

පියවර 1:

git checkout -b local origin/new

ප්‍රාදේශීය යනු ශාඛා නාමයයි. ඕනෑම නමක් ලබා දිය හැකිය.

පියවර 2:

  git merge origin/master --no-ff --stat -v --log=300

මාස්ටර් ශාඛාවේ සිට නව ශාඛාව දක්වා වූ කොමිස් ඒකාබද්ධ කරන්න සහ ඒකාබද්ධ කරන සැබෑ කොමිස් වලින් <n> එක්-පේළියේ විස්තර සහිතව ඒකාබද්ධ පණිවිඩ ලොග් පණිවිඩයක් සාදන්න.

Git ඒකාබද්ධ කිරීම පිළිබඳ වැඩි විස්තර සහ පරාමිතීන් සඳහා කරුණාකර යොමු වන්න:

git merge --help

ඔබට විශේෂිත බැඳීමක් ඒකාබද්ධ කිරීමට අවශ්‍ය නම්, ඔබට මෙය භාවිතා කළ හැකිය:

git cherry-pick <commit-id>

Yඔබේ 3 වන වාක්‍යයේ අර්ථ දැක්වීම ඔබ වෙනස් කළාද? "මට Y වෙත යොමු කරන නව ශාඛාවක් ඇත" එදිරිව "දැන් Y ශාඛාව සඳහා කියන්න", ශබ්දය Y කැපවීමක් ලෙස භාවිතා කර පසුව එය ශාඛාවක් බවට පත්විය
Purefan

මට ඒකාබද්ධ කිරීමට අවශ්‍ය ශාඛාවක යම් නිශ්චිත ස්ථානයක සිට මට එය කළ හැක්කේ කෙසේද
කුල්බුෂාන් සිං

4

මගේ භාවිතයේදී අපට CI සංයුක්ත තැටියක් අවශ්‍ය විය. සංවර්ධිත හා ප්‍රධාන ශාඛා සමඟ අපි git ප්‍රවාහය භාවිතා කළෙමු. සංවර්ධකයින්ට සෘජුවම වෙනස් වීමට හෝ විශේෂාංග ශාඛාවකින් ඉල්ලීමක් හරහා ඒකාබද්ධ වීමට සංවර්ධකයින්ට නිදහස තිබේ. කෙසේ වෙතත්, ප්‍රගුණ කිරීම සඳහා අපි ජෙන්කින්ස් හරහා ස්වයංක්‍රීයව සංවර්ධන ශාඛාවෙන් ස්ථාවර කොමිස් පමණක් ඒකාබද්ධ කරමු.

මෙම අවස්ථාවේ දී චෙරි-පික් කිරීම හොඳ විකල්පයක් නොවේ. කෙසේ වෙතත්, අපි කැපවීමේ හැඳුනුම්පතෙන් දේශීය ශාඛාවක් නිර්මාණය කර, එම ප්‍රාදේශීය ශාඛාව ප්‍රගුණ කිරීම හා එම්වීඑන් පිරිසිදු සත්‍යාපනය සිදු කිරීම සඳහා ඒකාබද්ධ කරමු (අපි මේවන් භාවිතා කරමු). සාර්ථක නම්, දේශීය චෙක් out ට් = සත්‍ය විකල්පය සහ pushChanges = අසත්‍යය සමඟ මේවන් මුදා හැරීමේ ප්ලගිනය භාවිතා කරමින් නිෂ්පාදන අනුවාදය කෞතුක භාණ්ඩ නෙක්සස් වෙත මුදා හරින්න. අවසාන වශයෙන් සෑම දෙයක්ම සාර්ථක වූ විට වෙනස්කම් හා ටැගය ආරම්භයට තල්ලු කරන්න.

නියැදි කේත ස්නිපටයක්:

අතින් සිදු කළ හොත් ඔබ ස්වාමියා යැයි උපකල්පනය කිරීම. කෙසේ වෙතත්, ජෙන්කින්ස් මත, ඔබ රෙපෝව පරීක්ෂා කරන විට ඔබ සුපුරුදු ශාඛාවේ සිටිනු ඇත (වින්‍යාසගත කර ඇත්නම් මාස්ටර්).

git pull  // Just to pull any changes.
git branch local-<commitd-id> <commit-id>  // Create a branch from the given commit-id
git merge local-<commit-id>  // Merge that local branch to master.
mvn clean verify   // Verify if the code is build able
mvn <any args> release:clean release:prepare release:perform // Release artifacts
git push origin/master  // Push the local changes performed above to origin.
git push origin <tag>  // Push the tag to origin

මෙය ඔබට නිර්භීත ඒකාබද්ධ කිරීමක් හෝ ගැටුම් නිරයක් සමඟ පූර්ණ පාලනයක් ලබා දෙනු ඇත.

වඩා හොඳ විකල්පයක් තිබේ නම් උපදෙස් දීමට නිදහස් වන්න.


4

වත්මන් ශාඛාවට නිශ්චිත බැඳීමකින් වෙනස්කම් ක්‍රියාත්මක කරන්නේ කෙසේද යන්න ප්‍රමුඛ පිළිතුරු විස්තර කරයි . "ඒකාබද්ධ කරන්නේ කෙසේද" යන්නෙන් ඔබ අදහස් කරන්නේ එය නම්, ඔවුන් යෝජනා කරන පරිදි චෙරි-පික් භාවිතා කරන්න.

නමුත් ඔබට ඇත්ත වශයෙන්ම ඒකාබද්ධ කිරීමක් අවශ්‍ය නම් , එනම් ඔබට දෙමව්පියන් දෙදෙනෙකු සමඟ නව බැඳීමක් අවශ්‍යය - වර්තමාන ශාඛාවේ දැනට පවතින කැපවීම සහ වෙනස්කම් ක්‍රියාත්මක කිරීමට ඔබට අවශ්‍ය කැපවීම - එවිට චෙරි පික් එකක් එය ඉටු නොකරනු ඇත.

සත්‍ය ඒකාබද්ධ කිරීමේ ඉතිහාසය තිබීම යෝග්‍ය විය හැකිය, නිදසුනක් ලෙස, නවතම ටැගය (භාවිතා කිරීම git describe) මත පදනම්ව අනුවාද නූල් ස්වයංක්‍රීයව සැකසීමට ඔබේ ගොඩනැගීමේ ක්‍රියාවලිය git පරම්පරාවෙන් ප්‍රයෝජන ගන්නේ නම් .

චෙරි-පික් වෙනුවට ඔබට සත්‍යයක් කළ හැකි git merge --no-commitඅතර පසුව ඔබට අවශ්‍ය නොවන වෙනස්කම් ඉවත් කිරීම සඳහා දර්ශකය අතින් සකස් කරන්න.

ඔබ ශාඛාවක සිටින අතර ශාඛාවේ Aකෙළවරේ ඇති බැඳීම ඒකාබද්ධ කිරීමට ඔබට අවශ්‍ය යැයි සිතමු B:

git checkout A
git merge --no-commit B

දැන් ඔබ දෙමව්පියන් දෙදෙනෙකු සමඟ බැඳීමක් ඇති කිරීමට සූදානම්ව සිටින අතර, වර්තමාන ඉඟිය Aසහ B. කෙසේ වෙතත්, ඔබට B ශාඛාවේ කලින් කළ වෙනස්කම් ඇතුළුව ඔබට අවශ්‍ය ප්‍රමාණයට වඩා වැඩි වෙනස්කම් ප්‍රමාණයක් යෙදිය හැකිය. ඔබට මෙම අනවශ්‍ය වෙනස්කම් අහෝසි කිරීමට අවශ්‍යය.

(වැඩකරන නාමාවලියෙහි තත්වය සහ දර්ශකය ඒකාබද්ධ වීමට පෙර තිබූ ආකාරයට නැවත සැකසීමට පහසු ක්‍රමයක් තිබිය හැකිය, එවිට ඔබට පිරිසිදු ස්ලයිට් එකක් ඇති අතර එමඟින් ඔබට අවශ්‍ය කැපවීම මුලින්ම තෝරා ගත හැකිය. නමුත්. මම පිරිසිදු වදින සසප අපේක්ෂක සාක්ෂාත් කරන ආකාරය දන්නේ නැහැ. git checkout HEADහා git reset HEADදෙකම මෙම ක්රමය අරමුණ පරාජය, මුසුව රාජ්ය ඉවත් කරනු ඇත.)

එබැවින් අනවශ්‍ය වෙනස්කම් අතින් අහෝසි කරන්න. උදාහරණයක් ලෙස, ඔබට හැකි විය

git revert --no-commit 012ea56

එක් එක් අනවශ්‍ය කැපවීම සඳහා 012ea56.

ඔබ දේවල් සකස් කිරීම අවසන් කළ පසු, ඔබේ කැපවීම සාදන්න:

git commit -m "Merge in commit 823749a from B which tweaked the timeout code"

දැන් ඔබට ඇත්තේ ඔබට අවශ්‍ය වෙනස පමණක් වන අතර, ඔබ බී වෙතින් තාක්‍ෂණිකව ඒකාබද්ධ වූ බව මුතුන් මිත්තන්ගේ ගස පෙන්වයි.


3

මම චෙරි පික් කිරීමට පුරුදුව සිටියෙමි, නමුත් වරින් වර මට අද්භූත ගැටළු කිහිපයක් ඇති බව මට පෙනී ගියේය. මයික්‍රොසොෆ්ට් හි අවුරුදු 25 ක ප්‍රවීණයෙකු වන රේමන්ඩ් චෙන්ගේ බ්ලොග් අඩවියක් මට හමු විය, එය චෙරි තෝරාගැනීම සමහර අවස්ථාවල ගැටළු ඇති කළ හැකි අවස්ථා කිහිපයක් විස්තර කරයි.

මාපට ඇඟිල්ලේ එක් රීතියක් නම්, ඔබ චෙරි එක් ශාඛාවකින් තවත් ශාඛාවකට තෝරා ගන්නේ නම්, පසුව එම ශාඛා අතර ඒකාබද්ධ වන්නේ නම්, ඔබ ඉක්මනින් හෝ පසුව ගැටළු වලට මුහුණ දෙනු ඇත.

මෙම මාතෘකාව පිළිබඳ රේමන්ඩ් චෙන්ගේ බ්ලොග් වෙත යොමු කිරීමක් මෙන්න: https://devblogs.microsoft.com/oldnewthing/20180312-00/?p=98215

රේමන්ඩ්ගේ බ්ලොග් අඩවිය සමඟ මට ඇති එකම ගැටළුව ඔහු සම්පූර්ණ ක්‍රියාකාරී උදාහරණයක් ලබා නොදීමයි. එබැවින් මම මෙහි එකක් ලබා දීමට උත්සාහ කරමි.

ඉහත ප්‍රශ්නය අසන්නේ හොඳ විශේෂාංග සහිත ශාඛාවක් තුළ හෙඩ් විසින් පෙන්වා දී ඇති කැපවීම පමණක් ස්වාමියා වෙත ඒකාබද්ධ කරන්නේ කෙසේද යන්නයි .

එය සිදු කරන්නේ කෙසේද යන්න මෙන්න:

  1. ස්වාමියා සහ හොඳ විශේෂාංග සහිත ශාඛා අතර පොදු මුතුන් මිත්තෙකු සොයා ගන්න .
  2. එම මුතුන් මිත්තාගෙන් නව ශාඛාවක් සාදන්න, අපි මෙම නව ශාඛා පැච් ලෙස හඳුන්වමු .
  3. චෙරි මෙම නව පැච් ශාඛාවට එක් හෝ වැඩි ගණනක් තෝරා ගනී .
  4. බවට ලප ශාඛා ඒකාබද්ධ දෙකම මෙම ස්වාමියා හා A-හොඳ ලක්ෂණයක් ශාඛා.
  5. මෙම ස්වාමියා ශාඛා දැන් අනාචාරයේ අඩංගු වනු ඇත, දෙකම ස්වාමියා හා A-හොඳ ලක්ෂණයක් ශාඛා ද තවදුරටත් ඉහල යනවාත් මත පසුව සිදු වන්නේ නම් ඕනෑම අනාගත ගැටලු විසඳනු නව පොදු පිය, ඇත.

මෙන්න එම විධානයන් සඳහා උදාහරණයක්:

git checkout master...a-good-feature  [checkout the common ancestor]
git checkout -b patch
git cherry-pick a-good-feature  [this is not only the branch name, but also the commit we want]
git checkout master
git merge patch
git checkout a-good-feature
git merge -s ours patch

හොඳ විශේෂාංග සහිත ශාඛාවකට ඒකාබද්ධ වූ අවසාන පේළිය “ -අ අපේ ” ඒකාබද්ධ කිරීමේ උපාය මාර්ගය භාවිතා කළ බව සඳහන් කිරීම වටී . මෙයට හේතුව වන්නේ නව පොදු මුතුන් මිත්තෙකු වෙත යොමු වන හොඳ විශේෂාංග ශාඛාවක් තුළ අප කැපවීමක් ඇති කළ යුතු අතර කේතය දැනටමත් එම ශාඛාවේ ඇති බැවින් කිසිදු අවස්ථාවක් නොමැති බව තහවුරු කර ගැනීමට අපට අවශ්‍යය ඒකාබද්ධ කිරීමේ ගැටුමක. ඔබ ඒකාබද්ධ කරන බැඳීම් (ය) වඩාත්ම මෑත නොවේ නම් මෙය වඩාත් වැදගත් වේ.

අර්ධ ඒකාබද්ධ කිරීම් අවට සිදුවීම් සහ විස්තර ඉතා ගැඹුරු විය හැකි බැවින්, වැරැද්ද කුමක් විය හැකිද, එය වළක්වා ගන්නේ කෙසේද සහ මෙය ක්‍රියාත්මක වන්නේ ඇයිද යන්න පිළිබඳ පූර්ණ අවබෝධයක් ලබා ගැනීම සඳහා රේමන්ඩ් චෙන්ගේ බ්ලොග් අඩවියේ කොටස් 10 ම කියවීමට මම නිර්දේශ කරමි.


සිත්ගන්නා නිදර්ශනය. ඉහළට.
VonC

1

e27af03X ශාඛාවේ සිට මාස්ටර් දක්වා බැඳීම ඒකාබද්ධ කිරීමට ඔබට අවශ්‍ය යැයි කියමු .

git checkout master
git cherry-pick e27af03
git push
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.