නවතම බැඳීම් (ය) Git සමඟ නව ශාඛාවකට ගෙන යන්න


4986

නව ශාඛාවකට මාස්ටර් කිරීමට මා කැපවී ඇති අවසාන කොමිෂන් සභා කිහිපයක් ගෙනයාමට මම කැමැත්තෙමි. අවාසනාවට, මගේ Git-fu තවම ශක්තිමත් නැත, උදව්වක් තිබේද?

එනම් මම කොහොමද මෙයින් යන්නේ?

master A - B - C - D - E

මේකට?

newbranch     C - D - E
             /
master A - B 

114
සටහන: මම මෙහි
ඇසුවෙමි

3
eddmann.com/posts/… මෙය ක්‍රියාත්මක වේ
සාගර් නාලියපාර

7
මෙහි අදහස් පිරිසිදු කර තිබේද? මම අසන්නේ මෙම ප්‍රශ්නයට මගේ ද්විත්ව සංචාරයේ දී, මම සෑම විටම එම අදහස් දැක්වීමෙන් අනුචලනය කරමි.
තේජාස් කාලේ

Answers:


6454

පවතින ශාඛාවකට මාරු වීම

ඔබගේ බැඳීම් පවත්නා ශාඛාවකට ගෙනයාමට ඔබට අවශ්‍ය නම් , එය මේ ආකාරයෙන් පෙනෙනු ඇත:

git checkout existingbranch
git merge master         # Bring the commits here
git checkout master
git reset --keep HEAD~3  # Move master back by 3 commits.
git checkout existingbranch

මෙම --keepවිකල්පය මඟින් ඔබට සම්බන්ධයක් නැති ලිපිගොනු වල ඇති නොගැලපෙන වෙනස්කම් ආරක්ෂා කරයි, නැතහොත් එම වෙනස්කම් නැවත ලිවීමට සිදුවුවහොත් ගබ්සා කරයි - ඒ හා සමානව git checkout. එය අහෝසි වුවහොත් , git stashඔබගේ වෙනස් කිරීම් සහ නැවත උත්සාහ කරන්න, හෝ --hardවෙනස්කම් නැති කර ගැනීමට භාවිතා කරන්න (කොමිස් අතර වෙනස් නොවූ ලිපිගොනු වලින් පවා!)

නව ශාඛාවකට මාරු වීම

මෙම ක්‍රමය ක්‍රියාත්මක වන්නේ පළමු විධානය ( git branch newbranch) සමඟ නව ශාඛාවක් නිර්මාණය කිරීමෙනි, නමුත් එයට මාරුවීම නොවේ. ඉන්පසු අපි වත්මන් ශාඛාව (මාස්ටර්) පෙරළා නව ශාඛාවට මාරුවෙමු.

git branch newbranch      # Create a new branch, containing all current commits
git reset --keep HEAD~3   # Move master back by 3 commits (Make sure you know how many commits you need to go back)
git checkout newbranch    # Go to the new branch that still has the desired commits
# Warning: after this it's not safe to do a rebase in newbranch without extra care.

නමුත් ආපසු යාමට කොපමණ කැපවීම් කළ යුතු බවට වග බලා ගන්න. විකල්පයක් ලෙස, ඒ වෙනුවට HEAD~3, ඔබට origin/masterනැවත ආපසු යාමට අවශ්‍ය කැපවීමේ හෑෂ් (හෝ යොමු වැනි ) සැපයිය හැකිය , උදා:

git reset --keep a1b2c3d4

අවවාදයයි: Git අනුවාදය 2.0 සමඟ සහ පසුව, ඔබ පසුව git rebaseමුල් ( master) ශාඛාව මත නව ශාඛාව --no-fork-pointනම්, ප්‍රධාන ශාඛාවෙන් ඔබ ගෙන ගිය කොමිස් අහිමි වීම වළක්වා ගැනීම සඳහා නැවත ගෙවීමේදී ඔබට පැහැදිලි විකල්පයක් අවශ්‍ය විය හැකිය . branch.autosetuprebase alwaysකට්ටලයක් තිබීම මෙය වඩාත් ඉඩ සලසයි. වැඩි විස්තර සඳහා ජෝන් මෙලර්ගේ පිළිතුර බලන්න.


249
විශේෂයෙන්, ඔබ අවසන් වරට තල්ලු කළ ස්ථානයට වඩා ආපසු යාමට උත්සාහ නොකරන්න , වෙනත් අයෙකු විසින් ඇදගෙන යා හැකි වෙනත් ගබඩාවකට.
ග්‍රෙග් හෙව්ගිල්

107
මෙය ක්‍රියාත්මක වන්නේ මන්දැයි ඔබට පැහැදිලි කළ හැකිදැයි සිතීම. මට නම් ඔබ නව ශාඛාවක් නිර්මාණය කරමින්, ඔබ තවමත් පවතින පැරණි ශාඛාවෙන් කොමිස් 3 ක් ඉවත් කර, ඔබ සෑදූ ශාඛාව පරීක්ෂා කරන්න. ඉතින් ඔබ ඉවත් කළ කොමිස් නව ශාඛාවේ ඉන්ද්‍රජාලිකව පෙන්වන්නේ කෙසේද?
ජොනතන් ඩුමේන්

142
On ජොනතන් ඩුමයින්: පැරණි ශාඛාවෙන් කොමිස් ඉවත් කිරීමට පෙර මම නව ශාඛාව නිර්මාණය කළ නිසා. ඔවුන් තවමත් නව ශාඛාවේ සිටී.
sykora

86
git හි ශාඛා යනු ඉතිහාසයේ සිදු වන ලකුණු පමණක් වන අතර, ක්ලෝන කිරීම, නිර්මාණය කිරීම හෝ මකා දැමීම කිසිවක් නොමැත (සලකුණු හැර)
knittl

218
තවද සටහන් කරන්න: ඔබගේ වැඩ කරන පිටපතෙහි නොගැලපෙන වෙනස්කම් සමඟ මෙය නොකරන්න! මේක මට හිරිහැර කළා! :(
ඇඩම් ටට්ල්

1039

එය ක්‍රියාත්මක වන්නේ ඇයිදැයි කල්පනා කරන අයට (මා මුලදී මෙන්):

ඔබට නැවත C වෙත යාමට අවශ්‍ය වන අතර D සහ E නව ශාඛාවට ගෙන යන්න. මුලදී එය පෙනෙන්නේ මෙන්න:

A-B-C-D-E (HEAD)
        ↑
      master

පසු git branch newBranch:

    newBranch
        ↓
A-B-C-D-E (HEAD)
        ↑
      master

පසු git reset --hard HEAD~2:

    newBranch
        ↓
A-B-C-D-E (HEAD)
    ↑
  master

ශාඛාවක් යනු දර්ශකයක් පමණක් බැවින්, මාස්ටර් අවසාන කැපවීම පෙන්වා දුන්නේය. ඔබ නව ශාඛාව සෑදූ විට , ඔබ හුදෙක් අවසාන කැපවීමට නව දර්ශකයක් සාදා ඇත. git resetඔබ භාවිතා කිරීමෙන් මාස්ටර් පොයින්ටරය කොමිස් දෙකක් ආපසු ගෙන ගියේය . නමුත් ඔබ නව ශාඛාව ගෙන නොගිය හෙයින් , එය තවමත් එය මුලින් කළ කැපවීම වෙත යොමු කරයි.


56
git push origin master --forceප්‍රධාන ගබඩාවේ දර්ශනය වීම සඳහා වෙනසක් කිරීමටද මට අවශ්‍ය විය .
ඩීනන්

9
මෙම පිළිතුර මඟින් කොමිස් නැති වීමට හේතු වේ: ඊළඟ වතාවේ ඔබ git rebase, කොමිස් 3 නිහ ly ව බැහැර කරනු ලැබේ newbranch. විස්තර සහ ආරක්ෂිත විකල්ප සඳහා මගේ පිළිතුර බලන්න .
ජෝන් මෙලර්

14
O ජෝන්, ඒක විකාරයකි. ඔබ කරන්නේ කුමක්දැයි නොදැන නැවත ප්‍රතිස්ථාපනය කිරීමෙන් බැඳීම් නැති වී යයි. ඔබට කොමිස් අහිමි වූවා නම්, මට ඔබ ගැන කණගාටුයි, නමුත් මෙම පිළිතුරෙන් ඔබගේ කැපවීම් නැති වී නැත. බව සටහන origin/masterඉහත රූප සටහනේ දිස් නොවේ. ඔබ තල්ලු කර origin/masterඉහත වෙනස්කම් සිදු කළහොත්, දේවල් විහිළුවක් වනු ඇත. නමුත් එය "ඩොක්ටර්, මම මේ දේ කරන විට රිදෙනවා". මුල් ප්‍රශ්නය ඇසූ දෙයට එය සීමාවක් නැත. මෙය පැහැර ගැනීම වෙනුවට ඔබේ තත්වය ගවේෂණය කිරීම සඳහා ඔබේම ප්‍රශ්නයක් ලිවීමට මම යෝජනා කරමි.
රයන් ලුන්ඩි

1
@ ජෝන්, ඔබේ පිළිතුරෙන් ඔබ කීවේ "මෙය නොකරන්න! git branch -t newbranch". ආපසු ගොස් පිළිතුරු නැවත කියවන්න. කිසිවෙකු එය කිරීමට යෝජනා කළේ නැත.
රයන් ලුන්ඩි

1
Y කයිරලෙසා, විශ්වාසයි, නමුත් ඔබ ප්‍රශ්නයේ රූප සටහන දෙස බැලුවහොත්, newbranchඔවුන්ගේ පවතින ප්‍රාදේශීය masterශාඛාවෙන් බැහැරව සිටීමට ඔවුන්ට අවශ්‍ය බව පැහැදිලිය . පිළිගත් පිළිතුර සිදු කිරීමෙන් පසුව, පරිශීලකයා ක්‍රියාත්මක git rebaseවීමට ආසන්න වූ විට newbranch, උඩුමහලේ ශාඛාව සැකසීමට ඔවුන්ට අමතක වූ බව git ඔවුන්ට මතක් කර දෙනු ඇත, එබැවින් ඔවුන් git branch --set-upstream-to=masterඑවකට ක්‍රියාත්මක වන git rebaseඅතර එකම ගැටළුවක් ඇත. ඒවා git branch -t newbranchද මුලින් භාවිතා කළ හැකිය .
ජෝන් මෙලර්

455

සාමාන්යයෙන්...

සිකෝරා මගින් නිරාවරණය වන ක්‍රමය මෙම නඩුවේ හොඳම විකල්පයයි. නමුත් සමහර විට එය පහසුම නොවන අතර එය සාමාන්‍ය ක්‍රමයක් නොවේ. සාමාන්‍ය ක්‍රමයක් සඳහා git cherry-pick භාවිතා කරන්න :

OP ට අවශ්‍ය දේ සාක්ෂාත් කර ගැනීම සඳහා, එය පියවර 2 කින් යුත් ක්‍රියාවලියකි:

පියවර 1 - ඔබට අවශ්‍ය ස්වාමියාගෙන් ලැබෙන සටහන a newbranch

ක්‍රියාත්මක කරන්න

git checkout master
git log

ඔබට අවශ්‍ය කොමිස් (3 කියන්න) හෑෂ් සටහන් කරන්න newbranch. මෙන්න මම භාවිතා කරන්නේ:
C commit: 9aa1233
D commit: 453ac3d
E commit:612ecb3

සටහන: ඔබට පළමු අක්ෂර හත හෝ සම්පූර්ණ කැපවීමේ හැෂ් භාවිතා කළ හැකිය

පියවර 2 - ඒවා මත තබන්න newbranch

git checkout newbranch
git cherry-pick 612ecb3
git cherry-pick 453ac3d
git cherry-pick 9aa1233

හෝ (Git 1.7.2+ මත, පරාස භාවිතා කරන්න)

git checkout newbranch
git cherry-pick 612ecb3~1..9aa1233

git cherry-pick එම බැඳීම් තුන නව ශාඛාවට අදාළ වේ.


13
ගමන් කිරීමට උත්සාහ කිරීම සඳහා op නොවේ සිට ස්වාමියා කිරීමට newbranch? ඔබ මාස්ටර් සිටියදී චෙරි-පික් නම්, ඔබ ප්‍රධාන ශාඛාවට එකතු කරනු ඇත - ඇත්ත වශයෙන්ම එයට දැනටමත් තිබූ කොමිස් එකතු කිරීම. එය ශාඛා හිස B වෙත ආපසු නොයනු ඇත. නැතහොත් මට නොලැබෙන සියුම් හා සිසිල් යමක් තිබේද?
RaveTheTadpole

6
ඔබ අළුත් විශේෂාංග ශාඛාවක් නිර්මාණය කළ යුතු විට ඔබ වැරදීමකින් මාස්ටර් නොවන ශාඛාවක් වැරදීමකින් සිදු කරන්නේ නම් මෙය ඉතා හොඳින් ක්‍රියාත්මක වේ.
ජූලියන්

5
සමහර අවස්ථාවල ප්‍රයෝජනවත් ප්‍රවේශයක් සඳහා +1. ඔබට අවශ්‍ය වන්නේ ඔබේම කොමිස් (අන් අය සමඟ අන්තර් සම්බන්ධිත) නව ශාඛාවකට ඇද ගැනීමට පමණි.
ටයිලර් වී.

8
එය වඩා හොඳ පිළිතුරකි. මේ ආකාරයෙන් ඔබට ඕනෑම ශාඛාවකට කොමිස් ගෙන යා හැකිය.
skywinder

8
චෙරි අහුලා ගැනීමේ අනුපිළිවෙල වැදගත් ද?
kon psych

328

මෙය කිරීමට තවත් ක්‍රමයක් වන්නේ විධාන 2 ක් පමණි. ඔබගේ වර්තමාන වැඩ කරන ගස නොවෙනස්ව තබා ගනී.

git checkout -b newbranch # switch to a new branch
git branch -f master HEAD~3 # make master point to some older commit

පැරණි අනුවාදය - මම ඉගෙන ගැනීමට පෙරgit branch -f

git checkout -b newbranch # switch to a new branch
git push . +HEAD~3:master # make master point to some older commit 

කිරීමට හැකි වීම pushසඳහා .දැන ගැනීමට කදිම උපක්රමය වේ.


1
වත්මන් නාමාවලිය. මම හිතන්නේ මෙය ක්‍රියාත්මක වන්නේ ඔබ ඉහළ නාමාවලියක නම් පමණි.
aragaer

1
දේශීය තල්ලුව සිනහවක් ඇති කරයි, නමුත් පරාවර්තනය මත, එය git branch -fමෙහි වෙනස් වන්නේ කෙසේද?
jthill

2
Era ජෙරාඩ්සෙක්ස්ටන් .වත්මන් අධ්‍යක්ෂවරයාය. git හට REMOTES හෝ GIT URL වෙත තල්ලු කළ හැකිය. path to local directoryGit URLs සින්ටැක්ස් සඳහා සහය දක්වයි. හි GIT URLS කොටස බලන්න git help clone.
දුර්වල කරන්න

31
මෙය ඉහළ අගයක් නොගන්නේ මන්දැයි මම නොදනිමි. සරල ලෙස මියයන්න, සහ කුඩා නමුත් විභව අවදානමකින් තොරව git reset --hard.
ගොඩ්ස්මිත්

4
Ods ගොඩ්ස්මිත් මගේ අනුමානය නම් මිනිසුන් තරමක් සරල අපැහැදිලි විධාන දෙකකට වඩා සරල විධානයන් තුනක් කැමති බවයි. එසේම, ඉහළින්ම ඡන්දය දුන් පිළිතුරු පළමුව දර්ශනය වීමේ ස්වභාවය අනුව වැඩි දියුණු කිරීම් ලබා ගනී.
JS_Riddler

323

බොහෝ පෙර පිළිතුරු භයානක ලෙස වැරදියි!

මෙය නොකරන්න:

git branch -t newbranch
git reset --hard HEAD~3
git checkout newbranch

ඊළඟ වතාවේ ඔබ දුවන විට git rebase(හෝ git pull --rebase) එම කොමිස් 3 නිහ ly ව බැහැර කරනු ලැබේ newbranch! (පහත පැහැදිලි කිරීම බලන්න)

ඒ වෙනුවට මෙය කරන්න:

git reset --keep HEAD~3
git checkout -t -b newbranch
git cherry-pick ..HEAD@{2}
  • පළමුවෙන්ම එය නවතම කොමිස් 3 බැහැර කරයි ( --keepසමාන --hardනොවූ නමුත් ඉවතලෑමට වඩා අසමත් වනවා සේම ආරක්ෂිතයි).
  • එවිට එය ඉවත් newbranchවේ.
  • ඉන්පසු එය චෙරි-පික් 3 එම නැවත සිදු newbranchකරයි. ඔවුන් තවදුරටත් ශාඛා නමෙන්ම කරන්නේ බැවින්, එය GIT ගේ භාවිතා කරන්නේ reflog : HEAD@{2}බව සිදු කරයි HEADඑනම් මෙහෙයුම් 2 කට පෙර විස්තර කරනු පිණිස භාවිත, පෙර අප 1. ක් පරීක්ෂා newbranchසහ 2. භාවිතා git resetකරන අනාචාරයේ 3 අවලංගුකිරීමට.

අවවාදයයි: පෙරනිමියෙන් reflog සක්‍රීය කර ඇත, නමුත් ඔබ එය අතින් අක්‍රීය කර ඇත්නම් (උදා: "හිස්" git ගබඩාවක් භාවිතා කිරීමෙන්), ධාවනය කිරීමෙන් පසු ඔබට කොමිස් 3 ආපසු ලබා ගත නොහැක git reset --keep HEAD~3.

පරාවර්තනය මත රඳා නොපවතින විකල්පයක් නම්:

# newbranch will omit the 3 most recent commits.
git checkout -b newbranch HEAD~3
git branch --set-upstream-to=oldbranch
# Cherry-picks the extra commits from oldbranch.
git cherry-pick ..oldbranch
# Discards the 3 most recent commits from oldbranch.
git branch --force oldbranch oldbranch~3

(ඔබ කැමති නම් ඔබට ලිවිය හැකිය @{-1}- කලින් පරීක්ෂා කළ ශාඛාව - වෙනුවට oldbranch).


තාක්ෂණික පැහැදිලි කිරීම

git rebaseපළමු උදාහරණයෙන් පසුව කොමිස් 3 බැහැර කරන්නේ ඇයි ? එයට හේතුව git rebaseකිසිදු තර්කයකින් තොරව --fork-pointපෙරනිමියෙන් විකල්පය සක්‍රීය කිරීමයි , එමඟින් උඩුගං ශාඛාව බලහත්කාරයෙන් තල්ලු කිරීමට එරෙහිව ශක්තිමත් වීමට උත්සාහ කිරීම සඳහා දේශීය reflog භාවිතා කරයි.

M1, M2, M3 යන කොමිස් අඩංගු වූ විට ඔබ සම්භවය / මාස්ටර් අතු බෙදුවා යැයි සිතමු.

M1--M2--M3  <-- origin/master
         \
          T1--T2--T3  <-- topic

නමුත් පසුව යමෙකු M2 ඉවත් කිරීමට බලහත්කාරයෙන් තල්ලු කිරීමේ සම්භවය / ස්වාමියා විසින් ඉතිහාසය නැවත ලියයි:

M1--M3'  <-- origin/master
 \
  M2--M3--T1--T2--T3  <-- topic

ඔබේ දේශීය පරාවර්තනය භාවිතා කිරීමෙන්, ඔබ git rebaseසම්භවය / ප්‍රධාන ශාඛාවේ පෙර අවතාරයකින් ඉවත් වූ බවත්, එබැවින් M2 සහ M3 කොමිස් ඇත්ත වශයෙන්ම ඔබේ මාතෘකා ශාඛාවේ කොටසක් නොවන බවත් දැක ගත හැකිය. එබැවින් M2 උඩු මහලේ ශාඛාවෙන් ඉවත් කර ඇති බැවින්, මාතෘකා ශාඛාව නැවත ප්‍රතිස්ථාපනය කිරීමෙන් පසු ඔබේ මාතෘකා ශාඛාවට එය තවදුරටත් අවශ්‍ය නොවන බව සාධාරණ ලෙස උපකල්පනය කරයි:

M1--M3'  <-- origin/master
     \
      T1'--T2'--T3'  <-- topic (rebased)

මෙම හැසිරීම අර්ථවත් වන අතර සාමාන්‍යයෙන් ප්‍රතිනිර්මාණය කිරීමේදී කළ යුතු නිවැරදි දෙය මෙයයි.

එබැවින් පහත දැක්වෙන විධානයන් අසමත් වීමට හේතුව:

git branch -t newbranch
git reset --hard HEAD~3
git checkout newbranch

එයට හේතුව ඔවුන් පරාවර්තනය වැරදි තත්වයට පත් කිරීමයි. කොමිස් newbranch3 ඇතුළත් වන සංශෝධනයකදී උඩුමහලේ ශාඛාවෙන් ඉවත් වී ඇති බව Git දකින අතර, එම කොමිස් ඉවත් කිරීම සඳහා reset --hardඋඩුමහලේ ඉතිහාසය නැවත ලියයි, එබැවින් ඊළඟ වතාවේ ඔබ git rebaseඑය ක්‍රියාත්මක කරන විට උඩුගං බලා ඉවත් කර ඇති වෙනත් ඕනෑම කැපවීමක් මෙන් ඒවා බැහැර කරයි .

නමුත් මෙම විශේෂ අවස්ථාවෙහිදී අපට අවශ්‍ය වන්නේ එම කාරණා 3 මාතෘකා ශාඛාවේ කොටසක් ලෙස සැලකීමයි. එය සාක්ෂාත් කර ගැනීම සඳහා, කොමිෂන් 3 ඇතුළත් නොවන පෙර සංශෝධනයේදී අපි උඩුමහලට බැස යා යුතුය. මා යෝජනා කළ විසඳුම් එයයි, එබැවින් ඔවුන් දෙදෙනාම ප්‍රත්‍යාවර්තකය නිවැරදි තත්වයේ තබයි.

වැඩි විස්තර සඳහා, git rebase සහ git merge-base docs --fork-pointහි අර්ථ දැක්වීම බලන්න .


15
මෙම පිළිතුර "මෙය නොකරන්න!" කිසිවෙකු කිරීමට යෝජනා නොකළ දෙයකට ඉහළින්.
රයන් ලුන්ඩි

4
බොහෝ අය ප්‍රකාශිත ඉතිහාසය නැවත ලියන්නේ නැත master. එබැවින් නැත, ඒවා භයානක ලෙස වැරදිය.
වොල්ෆ්

4
Y කයිරලෙසා, -tඔබ සඳහන් git branchකරන්නේ ඔබ git config --global branch.autosetuprebase alwaysපිහිටුවා ඇත්නම් ව්‍යංගයෙන් ය . ඔබ එසේ නොකළත්, මම දැනටමත් ඔබට පැහැදිලි කර ඇත්තෙමි, මෙම විධානයන් සිදු කිරීමෙන් පසු ඔබ ලුහුබැඳීම සකසන්නේ නම්, එම ගැටළුවම සිදුවන්නේ OP ඔවුන්ගේ ප්‍රශ්නය ලබා දීමට අදහස් කරන හෙයිනි.
ජෝන් මෙලර්

2
Ock රොක්ලී, ඔව්, එවැනි තත්වයන් නිරාකරණය කිරීමේ සාමාන්‍ය ක්‍රමය වන්නේ ආරක්ෂිත ආරම්භක ස්ථානයක සිට නැවුම් ශාඛාවක් (නිව් බ්‍රාන්ච් 2) නිර්මාණය කිරීමයි, ඉන්පසු ඔබට තබා ගැනීමට අවශ්‍ය සියලු කැපවීම් චෙරි-තෝරා ගන්න (බැඩ්නිව්බ්‍රාන්ච් සිට නව බ්‍රාන්ච් 2 දක්වා). චෙරි තේරීම මඟින් කොමිස් වලට නව හැෂ් ලබා දෙනු ඇත, එබැවින් ඔබට නව බ්‍රාන්ච් 2 ආරක්ෂිතව ප්‍රතිනිර්මාණය කිරීමට හැකි වනු ඇත (දැන් බැඩ්නිව් බ්‍රාන්ච් මකා දැමිය හැකිය).
ජෝන් මෙලර්

2
Al වොල්ෆ්, ඔබ වරදවා වටහාගෙන ඇත: git rebase නිර්මාණය කර ඇත්තේ උඩුගං බලා ඔවුන්ගේ ඉතිහාසය නැවත ලිවීමට එරෙහිව ශක්තිමත් ලෙසය. අවාසනාවකට මෙන්, එම ශක්තිමත් භාවයේ අතුරු ආබාධ සෑම කෙනෙකුටම බලපානවා, ඔවුන් හෝ ඔවුන්ගේ උඩු යටිකුරු කිරීම ඉතිහාසය නැවත ලියන්නේ නැතත්.
ජෝන් මෙලර්

150

Git stash භාවිතයෙන් වඩාත් සරල විසඳුමක්

වැරදි ශාඛාවට බැඳීම සඳහා වඩාත් සරල විසඳුමක් මෙන්න. masterවැරදි තුනක් ඇති ශාඛාවකින් ආරම්භ කිරීම :

git reset HEAD~3
git stash
git checkout newbranch
git stash pop

මෙය භාවිතා කළ යුත්තේ කවදාද?

  • ඔබේ මූලික අරමුණ නම් ආපසු පෙරළීමයි master
  • ගොනු වෙනස් කිරීම් තබා ගැනීමට ඔබට අවශ්‍යය
  • වැරදියට කළ පණිවිඩ ගැන ඔබ තැකීමක් නොකරයි
  • ඔබ තවම තල්ලු කර නැත
  • ඔබට මෙය කටපාඩම් කිරීම පහසුය
  • තාවකාලික / නව ශාඛා, බැඳීම් හැෂ් සොයා ගැනීම සහ පිටපත් කිරීම සහ වෙනත් හිසරදය වැනි සංකූලතා ඔබට අවශ්‍ය නැත

පේළි අංකය අනුව මෙය කරන්නේ කුමක්ද

  1. අවසාන කොමිස් තුන (සහ ඔවුන්ගේ පණිවිඩ) අහෝසි කරයි master, නමුත් වැඩ කරන සියලුම ලිපිගොනු නොවෙනස්ව පවතී
  2. වැඩකරන ගොනුවේ සියලු වෙනස්කම් ඉවත් කර, masterවැඩ කරන ගස හරියටම HEAD ~ 3 තත්වයට සමාන කරයි
  3. පවතින ශාඛාවකට මාරු වේ newbranch
  4. ඔබේ වැඩ කරන නාමාවලියට ගබඩා කර ඇති වෙනස්කම් යොදන අතර තොගය ඉවත් කරයි

ඔබ දැන් භාවිතා කළ හැකි git addහා git commitඔබ වරිය ලෙස. සියලුම නව කොමිස් එකතු කරනු ලැබේ newbranch.

මෙය නොකරන දේ

  • එය අහඹු තාවකාලික අතු ඔබේ ගස අවුල් නොකරයි
  • එය වැරදියට කළ පණිවිඩ ආරක්ෂා නොකරයි, එබැවින් ඔබට මෙම නව කැපවීමට නව කැපවීමේ පණිවිඩයක් එක් කිරීමට අවශ්‍ය වේ
  • යාවත්කාලීන කරන්න! ඔබගේ විධාන බෆරය හරහා අනුචලනය කිරීමට ඉහළ ඊතලය භාවිතා කර එහි කැපවීමේ පණිවිඩය සමඟ පෙර කැපවීම නැවත යෙදීමට (ස්තූතියි @ARK)

ඉලක්ක

OP කියා සිටියේ වෙනස්කම් සිදු නොවී “එම කැපවීම් සිදු කිරීමට පෙර ප්‍රධානියා වෙත ආපසු ගෙන යාම” ඉලක්කය බවත් මෙම විසඳුම එය කරන බවත්ය.

මම අහම්බෙන් ඒ masterවෙනුවට නව කැපවීම් කරන විට අවම වශයෙන් සතියකට වරක්වත් මෙය කරමි develop. සාමාන්‍යයෙන් මට ඇත්තේ රෝල්බැක් සඳහා එක් කැපවීමක් පමණි, එම අවස්ථාවේ git reset HEAD^දී 1 වන පේළිය භාවිතා කිරීම එක් බැඳීමක් පමණක් පෙරළීමට සරලම ක්‍රමයකි.

ඔබ මාස්ටර්ගේ වෙනස්කම් ඉහළට තල්ලු කළහොත් මෙය නොකරන්න

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


4
ස්තූතියි, මම මෙතැනට පැමිණීම සඳහා අතීතය / බොහෝ දේ කියවීම ගැන සතුටු වෙමි, මන්ද එය මටද පොදු භාවිත අවස්ථාවක් වේ. අපි එතරම් වෙනස්ද?
ජිම් මැක්

6
මම හිතන්නේ අපි සම්පුර්ණයෙන්ම සාමාන්‍ය පුද්ගලයෙක් වන අතර "අපොයි මම වැරදීමකින් ප්‍රගුණ කිරීමට කැපවී සිටිමි" යනු අතළොස්සක් හෝ ඊට අඩු කොමිස් ආපසු හැරවීමේ අවශ්‍යතාවය සඳහා වඩාත් පොදු භාවිත අවස්ථාවයි. වාසනාවන්ත මෙම විසඳුම ඉතා සරලයි මම දැන් එය කටපාඩම් කර ඇත්තෙමි.
ස්ලෑම්

9
මෙය පිළිගත් පිළිතුර විය යුතුය. එය සරල, තේරුම් ගැනීමට පහසු සහ මතක තබා ගැනීමට පහසුය
සිනා මදනි

1
මම හිතන්නේ නැහැ තොග ගබඩා කිරීම අවශ්‍යයි කියලා. මම එය නොමැතිව එය හොඳින් කළා.
කැම්පෝස්

1
ඔබගේ CLI (විධාන රේඛා) ඉතිහාසයේ ඔබ ඒවා සිදුවුවහොත් ඔබට පහසුවෙන් ඔබගේ බැඳීම් පණිවිඩ ආපසු ලබා ගත හැකිය. මා භාවිතා කළ git addහා git commitවිධාන දෙකම තිබීම නිසා මට කළ යුතුව තිබුණේ ඊතලයට පහර දී කිහිප වතාවක් ඇතුළු වී උත්පාතය! හැම දෙයක්ම ආපහු ආවා, නමුත් දැන් දකුණු ශාඛාවේ.
ලූක් ගෙඩියොන්

30

මෙය තාක්ෂණික අර්ථයෙන් ඒවා "චලනය" නොකරන නමුත් එය එකම බලපෑමක් ඇති කරයි:

A--B--C  (branch-foo)
 \    ^-- I wanted them here!
  \
   D--E--F--G  (branch-bar)
      ^--^--^-- Opps wrong branch!

While on branch-bar:
$ git reset --hard D # remember the SHAs for E, F, G (or E and G for a range)

A--B--C  (branch-foo)
 \
  \
   D-(E--F--G) detached
   ^-- (branch-bar)

Switch to branch-foo
$ git cherry-pick E..G

A--B--C--E'--F'--G' (branch-foo)
 \   E--F--G detached (This can be ignored)
  \ /
   D--H--I (branch-bar)

Now you won't need to worry about the detached branch because it is basically
like they are in the trash can waiting for the day it gets garbage collected.
Eventually some time in the far future it will look like:

A--B--C--E'--F'--G'--L--M--N--... (branch-foo)
 \
  \
   D--H--I--J--K--.... (branch-bar)

1
ඔබට rebaseඑකම දේ සඳහා භාවිතා කළ නොහැකිද?
බර්ගි

ඔව්, rebaseඉහත අවස්ථාවෙහිදී ඔබට වෙන්වූ ශාඛාව මත විකල්පයක් ලෙස භාවිතා කළ හැකිය .
සුකිමා

24

ඉතිහාසය නැවත ලිවීමකින් තොරව මෙය සිදු කිරීම සඳහා (එනම් ඔබ දැනටමත් කොමිස් තල්ලු කර ඇත්නම්):

git checkout master
git revert <commitID(s)>
git checkout -b new-branch
git cherry-pick <commitID(s)>

එවිට අතු දෙකම බලයකින් තොරව තල්ලු කළ හැකිය!


නමුත් පසුව ඔබ ආපසු හැරවීමේ අවස්ථාව සමඟ කටයුතු කළ යුතු අතර, එය ඔබගේ තත්වය අනුව බොහෝ උපක්‍රමශීලී විය හැකිය. ඔබ ශාඛාව මත බැඳීමක් ආපසු හරවා යැවුවහොත්, එම ක්‍රියාවන් සිදුවී ඇති බව Git තවමත් දකිනු ඇත, එබැවින් එය අහෝසි කිරීම සඳහා, ඔබ ආපසු හැරවීම කළ යුතුය. මෙය පුද්ගලයන් කිහිප දෙනෙකු පුළුස්සා දමයි, විශේෂයෙන් ඔවුන් ඒකාබද්ධ කිරීමක් ආපසු හරවා ශාඛාව නැවත ඒකාබද්ධ කිරීමට උත්සාහ කරන විට, එය දැනටමත් එම ශාඛාව ඒකාබද්ධ කර ඇති බව Git විශ්වාස කරන බව සොයා ගැනීම පමණි (එය සම්පූර්ණයෙන්ම සත්‍යයකි).
මාකෝටෝ

1
ඒ නිසයි මම චෙරි-පික්චර්ස් අවසානයේ නව ශාඛාවකට තෝරා ගන්නේ. ඒ ආකාරයෙන් git ඒවා ඔබගේ ගැටලුව විසඳන නව කොමිස් ලෙස දකී.
teh_senaus

මෙය මුලින් පෙනෙනවාට වඩා භයානක ය, මන්ද ඔබ මෙම රාජ්‍යයේ ඇඟවුම් සැබවින්ම තේරුම් නොගෙන ගබඩාවේ ඉතිහාසයේ තත්වය වෙනස් කරන බැවිනි.
මාකෝටෝ

5
මම ඔබේ තර්කය අනුගමනය නොකරමි - මෙම පිළිතුරේ කාරණය වන්නේ ඔබ ඉතිහාසය වෙනස් නොකිරීම, හුදෙක් නව කොමිස් එකතු කිරීම (එමඟින් වෙනස්කම් නැවත සිදු කිරීම effectively ලදායී ලෙස අහෝසි කිරීමයි). මෙම නව කොමිස් සාමාන්‍ය පරිදි තල්ලු කර ඒකාබද්ධ කළ හැකිය.
teh_senaus

13

මෙම තත්වය තිබුනේ නම්:

Branch one: A B C D E F     J   L M  
                       \ (Merge)
Branch two:             G I   K     N

මම ඉටු කළා:

git branch newbranch 
git reset --hard HEAD~8 
git checkout newbranch

මම හිතුවා ඒ කැපවීම මම හෙඩ් වෙයි කියලා, නමුත් එල් එල් දැන් ඒක ...

ඉතිහාසයේ නිවැරදි ස්ථානයට ගොඩ බැසීමට වග බලා ගැනීම, කැපවීමේ හැෂ් සමඟ වැඩ කිරීම පහසුය

git branch newbranch 
git reset --hard #########
git checkout newbranch

9

මම කොහොමද මෙයින් යන්නේ?

A - B - C - D - E 
                |
                master

මේකට?

A - B - C - D - E 
    |           |
    master      newbranch

විධාන දෙකක් සමඟ

  • git branch -m master newbranch

දීම

A - B - C - D - E 
                |
                newbranch

හා

  • git ශාඛා මාස්ටර් බී

දීම

A - B - C - D - E
    |           |
    master      newbranch

ඔව්, මෙය ක්‍රියාත්මක වන අතර එය පහසුය. Sourcetree GUI යනු git shell හි සිදු කරන ලද වෙනස්කම් පිළිබඳව ටිකක් ව්‍යාකූල වේ, නමුත් එය ලබා ගැනීමෙන් පසුව එය නැවත හරි.
ලාර්ස් කේ.

ඔව්, ඒවා ප්‍රශ්නයේ මෙන් ය. පළමු රූප සටහන් දෙක ප්‍රශ්නයේ ඇති අයට සමාන වීමට අදහස් කර ඇති අතර, පිළිතුරෙහි නිදර්ශනය සඳහා මා කැමති ආකාරයට නැවත ඇඳීම. මූලික වශයෙන් ප්‍රධාන ශාඛාව නව ශාඛාවක් ලෙස නම් කර ඔබට අවශ්‍ය තැන නව ප්‍රධාන ශාඛාවක් සාදන්න.
අයිවන්

මෙය නිවැරදි පිළිතුර යැයි මම විශ්වාස කරමි.
ලෙනාඩෝ හෙරේරා

4

ඔබ ඔබගේ සියලු ගමන් කිරීමට අවශ්ය නම් unpushed වෙත අනාචාරයේ නව ශාඛාව , ඔබ කළ යුත්තේ,

  1. නිර්මාණය වූ මෙම නව ශාඛාව වත්මන් එකක්:git branch new-branch-name

  2. ඔබේ නව ශාඛාව තල්ලු කරන්න :git push origin new-branch-name

  3. යා ඔබේ පැරණි (වත්මන්) ශාඛා පසුගිය තල්ලු / ස්ථාවර රාජ්ය:git reset --hard origin/old-branch-name

සමහර අය ද, වෙනත් ඇති upstreamsකරනවාට වඩා origin, ඔවුන් සුදුසු භාවිතා කළ යුතුupstream


3

1) නව ශාඛාවක් සාදන්න, එය ඔබගේ සියලු වෙනස්කම් නව_ ශාඛාවට ගෙන යයි.

git checkout -b new_branch

2) ඉන්පසු පැරණි ශාඛාවට ආපසු යන්න.

git checkout master

3) git rebase කරන්න

git rebase -i <short-hash-of-B-commit>

4) එවිට විවෘත කළ සංස්කාරකයේ අවසාන බැඳීම් තොරතුරු 3 අඩංගු වේ.

...
pick <C's hash> C
pick <D's hash> D
pick <E's hash> E
...

5) වෙනස් pickකිරීමට dropසියලු දෙනා අනාචාරයේ 3. ඉන්පසු සංස්කාරකය සුරකින්න සහ වසා දමන්න.

...
drop <C's hash> C
drop <D's hash> D
drop <E's hash> E
...

6) දැන් අන්තිම කොමිස් 3 වත්මන් ශාඛාවෙන් ඉවත් කරනු ලැබේ ( master). දැන් +ශාඛාවේ නමට පෙර ලකුණක් සහිතව ශාඛාව බලහත්කාරයෙන් තල්ලු කරන්න .

git push origin +master

2

ඔබට මෙය කළ හැක්කේ මා භාවිතා කළ සරල පියවර 3 ක් පමණි.

1) ඔබට නවතම යාවත්කාලීනයක් කිරීමට අවශ්‍ය නව ශාඛාවක් සාදන්න.

git branch <branch name>

2) නව ශාඛාවක් සඳහා කැපවීම සඳහා මෑත කාලීන බැඳීම් හැඳුනුම්පත සොයා ගන්න.

git log

3) වඩාත් මෑත කාලීන බැඳීම් ලැයිස්තුව ඉහළින් සිදුවන බව එම හැඳුනුම්පත් සටහන පිටපත් කරන්න. එවිට ඔබට ඔබගේ කැපවීම සොයාගත හැකිය. ඔබ මෙය පණිවිඩය හරහා ද සොයා ගනී.

git cherry-pick d34bcef232f6c...

ඔබට කැපවීමේ හැඳුනුම්පතක් ලබා දිය හැකිය.

git cherry-pick d34bcef...86d2aec

දැන් ඔයාගේ වැඩේ ඉවරයි. ඔබ නිවැරදි හැඳුනුම්පත සහ නිවැරදි ශාඛාව තෝරා ගත්තේ නම් ඔබ සාර්ථක වනු ඇත. එබැවින් මීට පෙර මෙය ප්‍රවේශම් වන්න. තවත් ගැටළුවක් ඇතිවිය හැකිය.

දැන් ඔබට ඔබේ කේතය තල්ලු කළ හැකිය

git push


0

මෙය කිරීමට තවත් ක්‍රමයක්:

[1] ප්රතිනම්කෙරුම් masterශාඛා ඔබේ newbranch(ඔබ මත යැයි උපකල්පනය masterශාඛා):

git branch -m newbranch

[2]master ඔබ කැමති කැපවීමෙන් ශාඛාවක් සාදන්න :

git checkout -b master <seven_char_commit_id>

උදා: git checkout -b මාස්ටර් a34bc22

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.