කෙසේ හෝ මගේ master
සහ මගේ origin/master
ශාඛාව අපසරනය වී ඇත.
ඇත්ත වශයෙන්ම ඔවුන් අපසරනය වීමට මා කැමති නැත.
මෙම වෙනස්කම් දෙස බලා ඒවා ඒකාබද්ධ කරන්නේ කෙසේද?
කෙසේ හෝ මගේ master
සහ මගේ origin/master
ශාඛාව අපසරනය වී ඇත.
ඇත්ත වශයෙන්ම ඔවුන් අපසරනය වීමට මා කැමති නැත.
මෙම වෙනස්කම් දෙස බලා ඒවා ඒකාබද්ධ කරන්නේ කෙසේද?
Answers:
ඔබට පහත වෙනස්කම් සමාලෝචනය කළ හැකිය :
git log HEAD..origin/master
එය අදින්නට පෙර (ලබා ගැනීම + ඒකාබද්ධ කිරීම) ( "නිශ්චිත ශාඛාවකින් සෑම විටම ඇද ගැනීමට ඔබට git ලැබෙන්නේ කෙසේද?" ද බලන්න ).
ඔබට මෙවැනි පණිවිඩයක් ඇති විට:
"ඔබේ ශාඛාව සහ 'සම්භවය / ස්වාමියා' අපසරනය වී ඇත, # සහ පිළිවෙලින් 1 සහ 1 වෙනස් බැඳීම් ඇත."
, ඔබට යාවත්කාලීන කිරීමට අවශ්යorigin
දැයි පරීක්ෂා කරන්න . නම් origin
යාවත්කාලීන වන අතර, සමහර අනාචාරයේ තල්ලු කර ඇත origin
තවත් ණයකට ඔබ එක්කෝ කොබැඳි නැත්නම් ස්ථානීකව නොපවතියි ඔබේ ම අනාචාරයේ කළ අතර.
... o ---- o ---- A ---- B origin/master (upstream work)
\
C master (your work)
ඔබ ඒ මත උඩරට සිට ලබාගත් නවතම කාර්යය වන නිසා ඔබ කැපවීම A මත පදනම් විය.
කෙසේ වෙතත්, ඔබ නැවත මූලාරම්භයට තල්ලු කිරීමට උත්සාහ කිරීමට පෙර, වෙනත් අයෙකු බී කැපවීමට තල්ලු විය.
සංවර්ධන ඉතිහාසය වෙනම මාවත්වලට වෙනස් වී ඇත.
එවිට ඔබට ඒකාබද්ධ කිරීම හෝ නැවත ප්රතිස්ථාපනය කළ හැකිය. බලන්න Rebasing - Git අතු බෙදී: Pro Git විස්තර සඳහා.
ඒකාබද්ධ කරන්න
Git merge විධානය භාවිතා කරන්න:
$ git merge origin/master
මෙය origin/master
ඔබගේ කාර්යයේ වෙනස්කම් ඒකාබද්ධ කිරීමට හා ඒකාබද්ධ කිරීමේ බැඳීමක් ඇති කිරීමට Git ට කියයි .
ඉතිහාසයේ ප්රස්ථාරය දැන් මේ ආකාරයට පෙනේ:
... o ---- o ---- A ---- B origin/master (upstream work)
\ \
C ---- M master (your work)
නව ඒකාබද්ධ කිරීම, කැපවීම එම්, සඳහා දෙමව්පියන් දෙදෙනෙකු සිටින අතර, එක් එක් සංවර්ධනයේ එක් මාවතක් නියෝජනය කරයි.
එම් පිටුපස ඇති ඉතිහාසය දැන් රේඛීය නොවන බව සලකන්න.
නැවත සකස් කරන්න
Git rebase විධානය භාවිතා කරන්න:
$ git rebase origin/master
මෙය Git ට කියනුයේ A (ඔබේ කාර්යය) වෙනුවට ඔබ එය A මත පදනම් වූ B මත පදනම් වූවාක් මෙන් ය
.
Git හුදෙක් කැපවීම සහ නැවත සකස් කිරීමේ පියවර අතර පැහැදිලි වෙන් කිරීමක් එක් කරයි.
ඉතිහාසයේ ප්රස්ථාරය දැන් මේ ආකාරයට පෙනේ:
... o ---- o ---- A ---- B origin/master (upstream work)
\
C' master (your work)
Commit C 'යනු git rebase විධානය මඟින් නිර්මාණය කරන ලද නව කැපවීමකි.
එය C ට වඩා ආකාර දෙකකින් වෙනස් වේ:
සී පිටුපස ඇති ඉතිහාසය තවමත් රේඛීය බව සලකන්න.
රේඛීය ඉතිහාසයට පමණක් ඉඩ දීම සඳහා අපි (දැනට) තෝරාගෙන ඇත cmake.org/cmake.git
.
මෙම ප්රවේශය කලින් භාවිතා කළ CVS මත පදනම් වූ කාර්ය ප්රවාහය ආරක්ෂා කරන අතර සංක්රාන්තිය ලිහිල් කළ හැකිය.
සී අපගේ ගබඩාවට තල්ලු කිරීමේ උත්සාහයක් සාර්ථක වනු ඇත (ඔබට අවසර ඇති බව උපකල්පනය කර ඔබ ප්රතික්ෂේප කරන අතරතුර කිසිවෙකු තල්ලු කර නැත).
Git pull විධානය මඟින් මූලාරම්භය ලබා ගැනීමට සහ ඒ මත දේශීය වැඩ නැවත කිරීමට කෙටිමං ක්රමයක් සපයයි:
$ git pull --rebase
මෙය ඉහත ලබා ගැනීම සහ පියවර නැවත එක් විධානයකට ඒකාබද්ධ කරයි.
git reset --hard HEAD
ඕනෑම දේශීය සුචිගත නොකළ කැපවීමක් ඉවත් කිරීම පමණක් ඉවත් කරන අතර දේශීය හා දුරස්ථ කොමිස් අතර වෙනස්කම් සමථයකට පත් කිරීමට කිසිවක් නොකරනු ඇත . ඒකාබද්ධ කිරීමක් හෝ ප්රතිප්රහාරයක් පමණක් මඟින් කොමිස් දෙක (දේශීය එක සහ දුරස්ථ එක) එකට ගෙන එනු ඇත.
master
පෙන්වා දීමට අවශ්යයි B
.
git reset --hard origin/master
පහත දැක්වෙන පිළිතුරේ සඳහන් වන පරිදි සිග්නස්එක්ස් 1
ඉහත ප්රතිචාර කියවීමෙන් පසුව පවා මට මෙය ඇති අතර එයට හේතුව කුමක්ද යන්න පිළිබඳව මා තුළ සැකයක් පවතී. මගේ විසඳුම වූයේ එය කිරීමයි
git reset --hard origin/master
(දුරස්ථ) සම්භවය / ස්වාමියා විසින් නිරූපණය කරන පරිදි, මගේ (දේශීය) මාස්ටර්ගේ පිටපත (ඉස්කුරුප්පු කර ඇතැයි මම සිතමි) නිවැරදි ස්ථානයට යලි සකසමි.
අවවාදයයි : තවම තල්ලු කර නොමැති සියලුම වෙනස්කම් ඔබට අහිමි වනු ඇත
origin/master
.
git reflog
හෝ ඒවා දකින gitk --all
. එහෙත්, ඇත්ත වශයෙන්ම දෘ reset යළි පිහිටුවීම නැවත පිරවීමකට වඩා තවත් දෙයකි.
git pull --rebase origin/master
බොහෝ විට ඔබට උදව් කළ හැකි තනි විධානයකි.
සංස්කරණය කරන්න: සම්භවය / ස්වාමියා වෙතින් කොමිස් අදින අතර අලුතින් ඇද ගන්නා ලද ශාඛා ඉතිහාසය මත ඔබගේ වෙනස්කම් අදාළ වේ.
දුරස්ථ ශාඛාවක් ලුහුබඳින ශාඛාවක් නැවත ප්රතිස්ථාපනය කිරීමට මා උත්සාහ කළ විට මම මෙම තත්වයට පත්විය . මෙම අවස්ථාවෙහිදී, ඔබ නැවත ප්රතිස්ථාපනය කිරීමට උත්සාහ කරන්නේ නම්, ඔබේ ශාඛාව අපසරනය වී ඇති බව ඔබට පෙනී යනු ඇත.
ඔබ ස්වාමියාගෙන් අතු බෙදී ඇති my_remote_tracking_branch ශාඛාවේ සිටින බව කියමු
$ git status
# ශාඛාවේ my_remote_tracking_branch
කැපවීමට කිසිවක් නැත (වැඩ කරන නාමාවලිය පිරිසිදුයි)
දැන් ඔබ උත්සාහ කරන්නේ ස්වාමියාගෙන් මෙසේ ප්රතික්ෂේප කිරීමට ය:
git rebase master
දැන් නතර වී යම් කරදරයකින් බේරෙන්න! ඒ වෙනුවට, ඒකාබද්ධ කිරීම භාවිතා කරන්න:
git merge master
ඔව්, ඔබ ඔබේ ශාඛාවේ අමතර කොමිස් සමඟ අවසන් වනු ඇත. නමුත් ඔබ "අපසරනය නොවන" ශාඛා සඳහා සූදානම් නොවන්නේ නම්, මෙය නැවත ප්රතිස්ථාපනය කිරීමට වඩා සුමට වැඩ ප්රවාහයක් වනු ඇත. වඩාත් සවිස්තරාත්මක පැහැදිලි කිරීමක් සඳහා මෙම බ්ලොගය බලන්න .
අනෙක් අතට, ඔබේ ශාඛාව දේශීය ශාඛාවක් පමණක් නම් (එනම් තවමත් කිසිදු දුරස්ථයකට තල්ලු වී නොමැත) ඔබ අනිවාර්යයෙන්ම ප්රතිප්රහාරයක් කළ යුතුය (ඔබේ ශාඛාව මෙම අවස්ථාවේ දී අපසරනය නොවනු ඇත).
දැන් ඔබ මේ කියවන්නේ නම්, ඔබ මේ වන විටත් නිසා වේ එය නිසා එවැනි rebase කිරීමට සිදුවීම් "අපසරනය", ඔබ භාවිතා කරමින් සම්භවය සිට සිදු (ක එක්සත් ජාතීන්ගේ-අපසරනය රාජ්ය එනම්) ආපසු පසුගිය කිරීමට ලබා ගත හැක:
git reset --hard සම්භවය / my_remote_tracking_branch
rebase
නම්, ඔබ ප්රතික්ෂේප කරන ශාඛාව ප්රකාශයට පත් කර නොමැති නම් (සහ වෙනත් පුද්ගලයින් විසින් භාවිතා කරනු ලැබේ). එසේ නොමැතිනම් භාවිතා කරන්න merge
. ඔබ දැනටමත් ප්රකාශයට පත් කර ඇති (සහ භාවිතා කළ) ශාඛා නැවත ප්රතිස්ථාපනය කරන්නේ නම්, ඔබේ ශාඛාව භාවිතා කළ සෑම සංවර්ධකයෙකු හරහාම ඉතිහාසය නැවත ලිවීමේ කුමන්ත්රණයක් සම්බන්ධීකරණය කළ යුතුය.
git rebase master
...
git reset --hard origin/my_remote_tracking_branch
සැබවින්ම ක්රියාත්මක වූයේ එයයි
මගේ නඩුවේදී අපසරනය කළ පණිවිඩය ඇති කිරීමට මා කළේ එයයි : මම කළ git push
නමුත් පසුව කළ git commit --amend
පණිවිඩයට යමක් එකතු කිරීමට කළෙමි . ඊට පස්සේ මම තවත් කැපවීමක් කළා.
ඉතින් මගේ නඩුවේ සරලවම අදහස් කළේ සම්භවය / ස්වාමියා යල්පැන ඇති බවය. වෙනත් කිසිවෙකු සම්භවය / ස්වාමියා ස්පර්ශ නොකරන බව මා දැන සිටි හෙයින්, නිවැරදි කිරීම සුළුපටු ය: git push -f
( -f
බලය යනු කොතැනද )
git push -f
කලින් සිදු කර ඇති වෙනස්කම් නැවත ලිවීමට සහ ආරම්භයට තල්ලු කිරීමට. වෙන කිසිවෙකු ගබඩාවට අත නොතැබූ බව මට විශ්වාසයි.
මගේ නඩුවේදී මම වෙනස්කම් සිදු කර ඇති origin/master
අතර පසුව මා එසේ නොකළ යුතුව තිබූ බව වටහා ගතිමි :-( මෙය දේශීය වෙනස්කම් උප කුලක තිබීම නිසා මෙය සංකීර්ණ විය. එබැවින් මම "නරක" දේශීය වීමට පෙර අවසන් යහපත් කැපවීමට ගියෙමි. වෙනස්කම් (SourceTree භාවිතා කරමින්) පසුව මට "අපසරන පණිවිඩය" ලැබුණි.
දේශීයව මගේ අවුල නිරාකරණය කිරීමෙන් පසු (විස්තර මෙහි වැදගත් නොවේ) දුරස්ථ origin/master
ශාඛාව "නියමිත වේලාවට ආපසු යාමට" මට අවශ්ය වූ අතර එමඟින් එය නැවත දේශීයයා සමඟ සමපාත වේ master
. මගේ නඩුවේ විසඳුම වූයේ:
git push origin master -f
මෙම සටහන -f
(බලය) ස්විචය. මෙය origin/master
වැරදීමකින් තල්ලු කර ඇති "නරක වෙනස්කම්" මකා දැමූ අතර දැන් දේශීය හා දුරස්ථ ශාඛා සමමුහුර්ත වී ඇත.
කරුණාකර මෙය විනාශකාරී මෙහෙයුමක් බව මතක තබා ගන්න, එබැවින් දුරස්ථ මාස්ටර් "ආපසු යාම" සුදුසු යැයි ඔබට 100% විශ්වාස නම් පමණක් එය සිදු කරන්න.
You are not allowed to force push code to a protected branch on this project.
. මම මගේ දෙබලකට තල්ලු කිරීමට උත්සාහ කරමි.
මම පිළිතුරු ඕනෑ තරම් මෙහි ඇත්තේ දන්නවා, නමුත් මම හිතන්නේ git reset --soft HEAD~1
එය ඔබ අවසන් වරට වෙනස් කරගන්න උත්සාහ කරමු නිසා, සමහර අවධානය යොමු විය යුතුව දේශීය (තල්ලු නොවේ) අපසරනය රාජ්ය විසඳීම අතර නසාගන්නවා. මම හිතන්නේ මෙය අදින්නට වඩා බහුකාර්ය විසඳුමක් rebase
, මන්ද දේශීය කැපවීම සමාලෝචනය කර වෙනත් ශාඛාවකට ගෙන යා හැකි බැවිනි.
යතුර භාවිතා --soft
කරන්නේ රළු වෙනුවට ය --hard
. බැඳීම් 1 ට වඩා තිබේ නම්, විචල්යතාවයක් ක්රියාත්මක විය HEAD~x
යුතුය. ඉතින් මගේ තත්වය විසඳූ සියලු පියවර මෙන්න (මට දේශීය කැපවීම් 1 ක් සහ දුරස්ථව කොමිස් 8 ක් තිබුණි):
1) git reset --soft HEAD~1
දේශීය බැඳීම අහෝසි කිරීම. ඊළඟ පියවර සඳහා, මම SourceTree හි අතුරු මුහුණත භාවිතා කර ඇත, නමුත් පහත දැක්වෙන විධානයන් ද ක්රියාත්මක විය යුතු යැයි මම සිතමි:
2) git stash
1 සිට වෙනස්කම් වළක්වා ගැනීමට). දැන් සියලු වෙනස්කම් ආරක්ෂිත වන අතර තවදුරටත් අපසරනය නොමැත.
3) git pull
දුරස්ථ වෙනස්කම් ලබා ගැනීමට.
4) git stash pop
හෝ git stash apply
අවශ්ය නම්, අවසන් වරට සිදුකරන ලද වෙනස්කම් යෙදීම, ඉන්පසු නව බැඳීමක් අනුගමනය කිරීම. දේශීය බැඳීම්වල වෙනස්කම් කුණු කූඩයට දැමීමට අවශ්ය වූ විට 2) සමඟ මෙම පියවර අත්යවශ්ය නොවේ . එසේම, වෙනත් ශාඛාවකට බැඳීමට අවශ්ය වූ විට, අපේක්ෂිත ශාඛාවට මාරුවීමෙන් පසු මෙම පියවර සිදු කළ යුතුය.
pull --rebase
කෙසේ හෝ ස්වයංක්රීයව ගොඩගැසෙනු ඇත. stackoverflow.com/a/30209750/6309
වෙනස්කම් බැලීමට:
git difftool --dir-diff master origin/master
මෙය ශාඛා දෙක අතර වෙනස්කම් හෝ වෙනස්කම් පෙන්වනු ඇත. ඇරැක්සිස් වලදී (මගේ ප්රියතම) එය ෆෝල්ඩරයේ වෙනස ශෛලියකින් පෙන්වයි. වෙනස් කළ එක් එක් ගොනු පෙන්වයි. ගොනුවේ වෙනස්කම් පිළිබඳ විස්තර බැලීමට මට ගොනුවක් මත ක්ලික් කළ හැකිය.
මගේ නඩුවේදී මෙය සිදු වූයේ මගේ ගැටුම් නිරාකරණය නොකිරීම හේතුවෙනි.
ගැටළුව ඇති වූයේ git pull
විධානය ක්රියාත්මක කිරීමෙනි . මූලාරම්භයේ වෙනස්වීම් මගේ දේශීය රෙපෝ සමඟ ගැටුම් වලට තුඩු දුන් අතර එය මම විසඳා ගත්තෙමි. කෙසේ වෙතත්, මම ඒවා සිදු කළේ නැත. මෙම අවස්ථාවේදී විසඳුම වන්නේ වෙනස්කම් සිදු කිරීමයි ( git commit
විසඳූ ගොනුව)
ගැටුම නිරාකරණය කිරීමෙන් පසු ඔබ සමහර ලිපිගොනු වෙනස් කර ඇත්නම්, git status
විධානය මඟින් දේශීය වෙනස් කිරීම් අස්ථායී දේශීය වෙනස් කිරීම් ලෙස පෙන්වන අතර වේදිකාගත කළ දේශීය වෙනස් කිරීම් ලෙස විභේදනය ඒකාබද්ධ කරයි. පළමුව ඒකාබද්ධ කිරීමෙන් වෙනස්කම් සිදු කිරීමෙන් git commit
, පසුව සුපුරුදු පරිදි අස්ථායි වෙනස්කම් එකතු කිරීමෙන් හා සිදු කිරීමෙන් මෙය නිසි ලෙස විසඳා ගත හැකිය (උදා git commit -a
.)
අවසාන කැපවීමේ පණිවිඩය සංස්කරණය කිරීමට උත්සාහ කරන විටත්, දැනටමත් තල්ලු කර ඇති බැඳීම්වලත් භාවිතා කරමින් මට එකම පණිවිඩයක් තිබුණි: git commit --amend -m "New message"
භාවිතා කරමින් වෙනස්කම් තල්ලු කරන විට git push --force-with-lease repo_name branch_name
කිසිදු ගැටළුවක් නොවීය.
මම A ශාඛාව පදනම් කරගෙන ශාඛාවක් නිර්මාණය කරන විට මෙම ගැටළුව විසඳා ඇත
git checkout -b a
ඉන්පසු මම B ශාඛාවේ ආරම්භක ශාඛාව ආරම්භ කළෙමි
git branch -u origin/B
එවිට මට ඉහත දෝෂ පණිවිඩය ලැබුණි.
මට මෙම ගැටළුව විසඳීමට එක් ක්රමයක් වූයේ,
git checkout -b b origin/B