ඇද ගන්නා ලද වෙනස්කම් වලට පක්ෂව git ඒකාබද්ධ කිරීමේ ගැටුමක් විසඳන්නේ කෙසේද?
මූලික වශයෙන් මට ගැටුම්වලින් තොර සියලු වෙනස්කම් ටික වේලාවක් නොගෙන වැඩ කරන ගසකින් ඉවත් කළ යුතුය git mergetool
. ඇදගෙන යාමේදී මෙය සිදු කිරීම වඩාත් සුදුසුය, පසුව නොවේ.
ඇද ගන්නා ලද වෙනස්කම් වලට පක්ෂව git ඒකාබද්ධ කිරීමේ ගැටුමක් විසඳන්නේ කෙසේද?
මූලික වශයෙන් මට ගැටුම්වලින් තොර සියලු වෙනස්කම් ටික වේලාවක් නොගෙන වැඩ කරන ගසකින් ඉවත් කළ යුතුය git mergetool
. ඇදගෙන යාමේදී මෙය සිදු කිරීම වඩාත් සුදුසුය, පසුව නොවේ.
Answers:
git pull -s recursive -X theirs <remoterepo or other repo>
නැතහොත්, පෙරනිමි ගබඩාව සඳහා:
git pull -X theirs
ඔබ දැනටමත් ගැටුම්කාරී තත්වයක සිටී නම් ...
git checkout --theirs path/to/file
-s recursive
මෙහි අතිරික්තයක් ඇති බව සලකන්න , එය පෙරනිමි ඒකාබද්ධ කිරීමේ උපාය මාර්ගය බැවින්. එබැවින් ඔබට එය සරල කළ හැකිය git pull -X theirs
, එය මූලික වශයෙන් සමාන වේ git pull --strategy-option theirs
.
MERGING
ප්රාන්තයට පැමිණෙමි . මට පසුව git merge --abort
නැවත උත්සාහ කළ හැකිය , නමුත් සෑම අවස්ථාවකම මම ඒකාබද්ධ වීමක් සමඟ අවසන් වෙමි. … මම දන්නවා ප්රතිප්රහාරයක් මගේ උඩුමහලට තල්ලු කළත්, සමහර විට එය මෙයට හේතු විය හැකිද?
git checkout --theirs path/to/file
. නැවත භාවිතා කිරීමේදී එය භාවිතා කළ අතර අනපේක්ෂිත ප්රති .ල ලැබුණි. ලේඛනයේ ඇති පැහැදිලි කිරීම: git rebase සහ git pull --rebase අතරතුර, අපගේ සහ ඒවා හුවමාරු වූ බවක් පෙනෙන්නට ඇති බව සලකන්න; --ours විසින් ශාඛාවේ සිට අනුවාදයන් නැවත ප්රතිස්ථාපනය කරනු ලබන අතර, - ඔවුන් විසින් ප්රතිනිර්මාණය කරනු ලබන ඔබේ වැඩ කටයුතු කරගෙන යන ශාඛාවෙන් අනුවාදය ලබා දේ.
git checkout --theirs/--ours path
man පිටුව ඒ සඳහා ක්රියා කරන පවසයි unmerged මාර්ග . එබැවින් මාර්ගයේ කිසිදු ගැටුමක් නොතිබුනේ නම්, එය දැනටමත් ඒකාබද්ධ වී ඇති බැවින් මෙම විධානය කිසිවක් නොකරනු ඇත. ඔබට සම්පූර්ණ උප ෆෝල්ඩරයක 'ඔවුන්ගේ' අනුවාදය අවශ්ය විට මෙය ගැටළු ඇති විය හැක. එබැවින් එවැනි අවස්ථාවකදී git checkout MERGE_HEAD path
කැපවීම හැෂ් කිරීම හෝ භාවිතා කිරීම ආරක්ෂිත වේ .
git pull -X theirs
ගැටුම් තිබේ නම් ඒකාබද්ධ කිරීමේ බැඳීමක් නිර්මාණය කරයි (උදා: වෙනත් බැඳීමක් දුරස්ථයට දිව ගියහොත් git push -f
). ඒකාබද්ධ කිරීමේ කොමිස් ඔබට අවශ්ය නැතිනම්, ඒ වෙනුවට ධාවනය කරන්න git fetch && git reset --hard origin/master
.
ඔබට පුනරාවර්තන "ඔවුන්ගේ" උපාය විකල්පය භාවිතා කළ හැකිය :
git merge --strategy-option theirs
සිට මිනිසා :
ours
This option forces conflicting hunks to be auto-resolved cleanly by
favoring our version. Changes from the other tree that do not
conflict with our side are reflected to the merge result.
This should not be confused with the ours merge strategy, which does
not even look at what the other tree contains at all. It discards
everything the other tree did, declaring our history contains all that
happened in it.
theirs
This is opposite of ours.
සටහන: මිනිසා පිටුව ලෙස "අප හා" ඒකාබද්ධය පවසයි උපාය-විකල්පය ඇති "අපේ" ඒකාබද්ධ වඩා ඉතා වෙනස් උපාය .
git checkout --theirs
තනි පරස්පර ගොනුව මත ක්රියාත්මක කිරීමට
git checkout <ref to theirs> -- the/conflicted.file
. ඉන්පසු git add
ඒවායේ වෙනස්කම්.
ඔබ දැනටමත් ගැටුම්කාරී තත්වයක සිටී නම්, ඔබට ඒවා සියල්ලම පිළිගැනීමට අවශ්ය නම්:
git checkout --theirs .
git add .
ඔබට ප්රතිවිරුද්ධ දේ කිරීමට අවශ්ය නම්:
git checkout --ours .
git add .
මෙය ඉතා දරුණු ය, එබැවින් ඔබට එය කිරීමට පෙර මේ සියල්ල අතුගා දැමීමට අවශ්ය බවට වග බලා ගන්න.
.
ඔබට පරික්ෂා කිරීමට අවශ්ය තිත වෙනුවට ගොනුව (ය) භාවිතා නොකරන්න . අඩු "දැඩි" සහ හරියටම ඔබට කිරීමට අවශ්ය දේ, අනුමාන වශයෙන්.
git add -u
අනුවාද පාලනයට යටත් නොවන ගොනු මඟ හැරීමට ඒ වෙනුවට භාවිතා කරන්න .
හරි, මම දැන් සිටි තත්වය සිතන්න:
ඔබ උත්සාහ කරන්නේ merge
, හෝ සමහර විට cherry-pick
, ඔබ සමඟ නතර වී ඇත
$ git cherry-pick 1023e24
error: could not apply 1023e24... [Commit Message]
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
දැන්, ඔබ ගැටුම් සහිත ගොනුව දකින අතර ඔබේ වෙනස්කම් තබා ගැනීමට ඔබට අවශ්ය නැත. ඉහත මගේ නඩුවේදී, මගේ IDE ස්වයංක්රීයව එකතු කළ නව රේඛාවකින් ගොනුව ගැටී ඇත. ඔබගේ වෙනස්කම් අහෝසි කර ඒවා පිළිගැනීමට පහසුම ක්රමය නම්:
git checkout --theirs path/to/the/conflicted_file.php
git add path/to/the/conflicted_file.php
මෙහි සංවාදය (ඔබගේ අනුවාදය සමඟ එන අනුවාදය නැවත ලිවීමට) වේ
git checkout --ours path/to/the/conflicted_file.php
git add path/to/the/conflicted_file.php
පුදුමයට කරුණක් නම්, මට මෙම පිළිතුර අන්තර්ජාලයේ ඉතා පහසුවෙන් සොයාගත නොහැකි විය.
git status
අතර checkout
සහ එකක් සිදු කරන්නේ නම් add
, ගොනුව තවමත් "දෙකම වෙනස් කරන ලද" ලෙස පෙන්වන බව සලකන්න .
git reset --hard
පසුව git pull [remote server name] [branch name] -Xtheirs
(ඒකාබද්ධ කිරීම අහෝසි කර නව දේවල් මගේ දේවල් මතට ඇද දමයි) - මෙය ඔබට අවශ්ය දැයි විශ්වාස නැත.
මෙම git pull -X theirs
පිළිතුරු කැත ඒකාබද්ධ සිදු හෝ නිකුත් විසින් නිර්මාණය විය හැක
දෝෂය: පහත දැක්වෙන ලිපිගොනු වල ඔබගේ දේශීය වෙනස්කම් ඒකාබද්ධ කිරීමෙන් නැවත ලියනු ලැබේ:
ඔබට රෙපෝ වෙතින් ලිපිගොනු වල කිසියම් දේශීය වෙනස් කිරීමක් නොසලකා හැරීමට අවශ්ය නම්, උදාහරණයක් ලෙස සෑම විටම සම්භවයක් ඇති කැඩපතක් විය යුතු සේවාදායකයකු මත, මෙය ක්රියාත්මක කරන්න ( master
ඔබට අවශ්ය ශාඛාව වෙනුවට ආදේශ කරන්න):
git fetch && git reset --hard origin/master
එය ක්රියාත්මක වන්නේ කෙසේද? git fetch
කරන්නේ git pull
නමුත් ඒකාබද්ධ තොරව . එවිට git reset --hard
ඔබගේ වැඩ කරන ගස අන්තිම බැඳීමට ගැලපේ. රෙපෝ හි ඇති ගොනු සඳහා ඔබගේ සියලුම දේශීය වෙනස්කම් ඉවතලනු ඇත , නමුත් නව දේශීය ලිපිගොනු තනි වනු ඇත.
git fetch && git reset --hard {remote}/{branch}
මගේ ගැටලුව විසඳුවේ එයයි. ශාඛාවක “ඔවුන්ගේ” තත්වයට පක්ෂව මගේම වෙනස්කම් මුළුමනින්ම ඉවත් කිරීමට මට අවශ්ය විය, නමුත් git pull -X theirs
ගෙන ගිය / නැවත නම් කරන ලද සමහර ලිපිගොනු වල හුස්ම හිරවී ඇත. ස්තූතියි!
Git ඒකාබද්ධ කිරීමෙන් පසු, ඔබට ගැටුම් ඇති වුවහොත් ඔබට හෝ ඔබේ හෝ ඒවාට අවශ්ය නම්
git checkout --theirs .
git checkout --ours .
විශේෂිත ශාඛාවක අනුවාදය සමඟ ඇති සියලු ගැටුම් නිරාකරණය කිරීම සඳහා:
git diff --name-only --diff-filter=U | xargs git checkout ${branchName}
එබැවින්, ඔබ දැනටමත් ඒකාබද්ධ කිරීමේ තත්වයේ සිටී නම් සහ ගැටුම්කාරී ලිපිගොනු වල ප්රධාන අනුවාදය තබා ගැනීමට ඔබට අවශ්ය නම්:
git diff --name-only --diff-filter=U | xargs git checkout master
git cherry-pick --continue
හෝgit commit --allow-empty
විධානයක් අවශ්ය වන අතර, විධානයක් අවශ්ය වන පද්ධතියක් නොමැති බව පෙනේ, මෙය ස්වයංක්රීය කිරීම වේදනාවක් බවට පත් කරයි. මම දැනට මෙය .git/COMMIT_EDITMSG
විසඳන්නේ ගොනුවක පැවැත්ම පරීක්ෂා කිරීමෙන් නමුත් එය අශෝභන හා අස්ථාවර බවක් පෙනේ, එය සැමවිටම ක්රියාත්මක වන බව මට තවම ඒත්තු ගොස් නැත.
git add
) එවිට ඔබට ඉතිරි කොටස තොග වශයෙන් විසඳා ගත හැකිය. git checkout --ours
/ git checkout --theirs
ද ප්රයෝජනවත් වේ.
සමහර විට මෙම නොවන කරුණාකර ඇත වැඩ කරන්නේ :
git checkout --ours / to / file
හෝ
git checkout --thehers path / to / file
මම ඒ වෙනුවට කළේ HEAD අපේ බවත් MERGE_HEAD ඔවුන්ගේ බවත් උපකල්පනය කරමිනි
git checkout HEAD -- path/to/file
හෝ:
git checkout MERGE_HEAD -- path/to/file
අපි මෙය කළ පසු අපි හොඳයි:
git add .
ඔබට තව දුරටත් තේරුම් ගැනීමට අවශ්ය නම්, ටොරෙක්ගේ අපූරු පෝස්ට් බලන්න: git checkout --ours ගිලී නැති ගොනු ලැයිස්තුවෙන් ගොනු ඉවත් නොකරයි
VS කේතය (ඒකාබද්ධ Git) IDE භාවිතා කරන්නන්:
ගැටුම් ගොනුවේ එන සියලුම වෙනස්කම් පිළිගැනීමට ඔබට අවශ්ය නම් පහත පියවර අනුගමනය කරන්න.
1. Go to command palette - Ctrl + Shift + P
2. Select the option - Merge Conflict: Accept All Incoming
ඒ හා සමානව ඔබට සියල්ලම පිළිගන්න, සියල්ල පිළිගන්න, වෙනත් විකල්ප සඳහා කළ හැකිය .
ඔබ දැනටමත් ගැටුම්කාරී තත්වයක සිටී නම් සහ මාර්ගය එකින් එක පරීක්ෂා කිරීමට අවශ්ය නොවන්නේ නම්. ඔබට උත්සාහ කළ හැකිය
git merge --abort
git pull -X theirs
next-version
වෙනස් වී ඇති ලිපිගොනු මකාදැමීම් සහිත දිගු ශාඛාවක් මා සතුව තිබුණිdevelop
ලිපිගොනු, අතු දෙකෙහිම විවිධ ස්ථානවල එකතු කර ඇති ලිපිගොනු, .
next-version
ශාඛාවේ සමස්ත අන්තර්ගතය තුළට ගෙන යාමට මට අවශ්ය වියdevelop
එකවරම ඒකාබද්ධ කිරීමටය.
මා වෙනුවෙන් වැඩ කළ ඉහත විධානයන්හි සංයෝජනය වූයේ:
git merge -X theirs next-version
# lots of files left that were modified on develop but deleted on next-version
git checkout next-version .
# files removed, now add the deletions to the commit
git add .
# still have files that were added on develop; in my case they are all in web/
git rm -r web
අළුත් පිළිතුරක් නොවේ, බොහෝ පිළිතුරු වලින් බිටු ඒකාබද්ධ කිරීම, අර්ධ වශයෙන් ඔබට මෙම පිළිතුරු සියල්ලම අවශ්ය විය හැකි බවට සහතික කිරීම.
https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging වෙතින්
මෙය මූලික වශයෙන් ව්යාජ ඒකාබද්ධ කිරීමක් කරනු ඇත. එය දෙමව්පියන් ලෙස ශාඛා දෙකම සමඟ නව ඒකාබද්ධ කිරීමේ බැඳීමක් වාර්තා කරනු ඇත, නමුත් එය ඔබ ඒකාබද්ධ කරන ශාඛාව දෙසවත් නොබලනු ඇත. ඔබේ වර්තමාන ශාඛාවේ නිශ්චිත කේතය ඒකාබද්ධ කිරීමේ ප්රති result ලයක් ලෙස එය සරලව සටහන් වේ.
$ git merge -s ours mundo
'අපේ' උපාය මාර්ගයෙන් සාදන ලද ඒකාබද්ධ කිරීම.
$ git diff HEAD HEAD~
අප සිටි ශාඛාව හා ඒකාබද්ධ කිරීමේ ප්රති result ලය අතර වෙනසක් නොමැති බව ඔබට පෙනේ.
පසුකාලීනව ඒකාබද්ධ කිරීමේදී ශාඛාවක් දැනටමත් ඒකාබද්ධ වී ඇතැයි සිතීමට මූලික වශයෙන් Git රැවටීමට මෙය බොහෝ විට ප්රයෝජනවත් වේ. නිදසුනක් ලෙස, ඔබ මුදා හැරීමේ ශාඛාවකින් අතු බෙදී ඇති බවත්, යම් වේලාවක ඔබේ ප්රධාන ශාඛාවට නැවත ඒකාබද්ධ වීමට අවශ්ය වනු ඇති බවට යම් වැඩක් කර ඇති බවත් පවසන්න. මේ අතර, මාස්ටර් පිළිබඳ සමහර දෝෂ නිවැරදි කිරීම් ඔබේ මුදා හැරීමේ ශාඛාවට ආපසු යැවිය යුතුය. ඔබට දෝෂ නිරාකරණ ශාඛාව මුදා හැරීමේ ශාඛාවට ඒකාබද්ධ කළ හැකි අතර අපගේ එකම ශාඛාව ඔබේ ප්රධාන ශාඛාවට ඒකාබද්ධ කරන්න (නිවැරදි කිරීම දැනටමත් එහි පැවතුනද) එබැවින් ඔබ පසුව මුදා හැරීමේ ශාඛාව නැවත ඒකාබද්ධ කරන විට දෝෂ නිරාකරණයෙන් කිසිදු ගැටුමක් නොමැත.
නව මාතෘකා ශාඛාවක වෙනස්කම් පිළිබිඹු කිරීමට මාස්ටර්ට අවශ්ය නම් මම ප්රයෝජනවත් යැයි සිතූ තත්වයක්. සමහර තත්වයන් තුළ ගැටුම්වලින් තොරව -එක්ස් ඒකාබද්ධ නොවන බව මම දැක ඇත්තෙමි ... උදා
$ git merge -Xtheirs topicFoo
CONFLICT (modify/delete): js/search.js deleted in HEAD and modified in topicFoo. Version topicFoo of js/search.js left in tree.
මෙම අවස්ථාවේ දී මම සොයාගත් විසඳුම විය
$ git checkout topicFoo
මාතෘකාව ෆූ වෙතින්, පළමුවෙන්ම අපගේ උපායමාර්ගය භාවිතා කර මාස්ටර් සමඟ ඒකාබද්ධ කරන්න, මෙය මාතෘකාවේ තත්වය පමණක් වන ව්යාජ බැඳීමක් ඇති කරයි. it git merge - අපේ ස්වාමියා
සාදන ලද ඒකාබද්ධ කිරීමේ බැඳීම පරීක්ෂා කරන්න
$ git log
දැන් ප්රධාන ශාඛාව පරීක්ෂා කරන්න
$ git checkout master
මාතෘකා ශාඛාව නැවත ඒකාබද්ධ කරන්න, නමුත් මේ වතාවේ -Xtheirs පුනරාවර්තන උපායමාර්ගය භාවිතා කරන්න, මෙය දැන් ඔබට මාතෘකාව පිළිබඳ තත්වය සමඟ ප්රධාන ශාඛාවක් ඉදිරිපත් කරනු ඇත.
$ git merge -X theirs topicFoo