ඇද ගැනීමේදී Git ඒකාබද්ධ කිරීමේ ගැටුම් ඔවුන්ගේ වෙනස්කම් වලට පක්ෂව විසඳන්න


1279

ඇද ගන්නා ලද වෙනස්කම් වලට පක්ෂව git ඒකාබද්ධ කිරීමේ ගැටුමක් විසඳන්නේ කෙසේද?

මූලික වශයෙන් මට ගැටුම්වලින් තොර සියලු වෙනස්කම් ටික වේලාවක් නොගෙන වැඩ කරන ගසකින් ඉවත් කළ යුතුය git mergetool. ඇදගෙන යාමේදී මෙය සිදු කිරීම වඩාත් සුදුසුය, පසුව නොවේ.




3
AnDanDascalescu පිළිගත් පිළිතුර මෙම ප්‍රශ්නවලට පිළිතුරු සපයන්නේ නැත, එබැවින් පැහැදිලිවම එය අනුපිටපතක් නොවේ. ප්ලස්, අනෙක් ප්‍රශ්නය තරමක් අපැහැදිලි ය: අසන දේ පැවසීම ඉතා අපහසු ය. සියල්ලට ම මට ඔබ සමඟ එකඟ විය නොහැක. ඔබ මෙහි සඳහන් කරන්නේ කුමක්ද?
සන්මායි

2
an සන්මන් ඔබට පිළිතුරු දෙකක් ඇත - ඔබ ඒවායින් එකක් පිළිගත්තේය. පිළිතුරකින් ඔබ අපේක්ෂා කරන දේ සහ ඔබට මෙහි තවත් විස්තර අවශ්‍ය වන්නේ කෙසේද?
එඩ්වඩ් තොම්සන්

2
D එඩ්වර්ඩ් තොම්සන්, ඇත්ත වශයෙන්ම මම සිතුවේ පළමු පිළිතුර සඳහා මෙම කීර්තිය ලබා දීමටයි, නමුත් ඔබ ඇසුවොත්, වඩා හොඳ පිළිතුරක්
ලැබේදැයි

Answers:


1291
git pull -s recursive -X theirs <remoterepo or other repo>

නැතහොත්, පෙරනිමි ගබඩාව සඳහා:

git pull -X theirs

ඔබ දැනටමත් ගැටුම්කාරී තත්වයක සිටී නම් ...

git checkout --theirs path/to/file

42
-s recursiveමෙහි අතිරික්තයක් ඇති බව සලකන්න , එය පෙරනිමි ඒකාබද්ධ කිරීමේ උපාය මාර්ගය බැවින්. එබැවින් ඔබට එය සරල කළ හැකිය git pull -X theirs, එය මූලික වශයෙන් සමාන වේ git pull --strategy-option theirs.

5
මම මෙය කළහොත්, මම නැවත MERGINGප්‍රාන්තයට පැමිණෙමි . මට පසුව git merge --abortනැවත උත්සාහ කළ හැකිය , නමුත් සෑම අවස්ථාවකම මම ඒකාබද්ධ වීමක් සමඟ අවසන් වෙමි. … මම දන්නවා ප්‍රතිප්‍රහාරයක් මගේ උඩුමහලට තල්ලු කළත්, සමහර විට එය මෙයට හේතු විය හැකිද?
බෙන්ජොන්

24
ප්‍රවේශම් වන්න git checkout --theirs path/to/file. නැවත භාවිතා කිරීමේදී එය භාවිතා කළ අතර අනපේක්ෂිත ප්‍රති .ල ලැබුණි. ලේඛනයේ ඇති පැහැදිලි කිරීම: git rebase සහ git pull --rebase අතරතුර, අපගේ සහ ඒවා හුවමාරු වූ බවක් පෙනෙන්නට ඇති බව සලකන්න; --ours විසින් ශාඛාවේ සිට අනුවාදයන් නැවත ප්‍රතිස්ථාපනය කරනු ලබන අතර, - ඔවුන් විසින් ප්‍රතිනිර්මාණය කරනු ලබන ඔබේ වැඩ කටයුතු කරගෙන යන ශාඛාවෙන් අනුවාදය ලබා දේ.
Vuk Djapic

10
බව සටහන git checkout --theirs/--ours pathman පිටුව ඒ සඳහා ක්රියා කරන පවසයි unmerged මාර්ග . එබැවින් මාර්ගයේ කිසිදු ගැටුමක් නොතිබුනේ නම්, එය දැනටමත් ඒකාබද්ධ වී ඇති බැවින් මෙම විධානය කිසිවක් නොකරනු ඇත. ඔබට සම්පූර්ණ උප ෆෝල්ඩරයක 'ඔවුන්ගේ' අනුවාදය අවශ්‍ය විට මෙය ගැටළු ඇති විය හැක. එබැවින් එවැනි අවස්ථාවකදී git checkout MERGE_HEAD pathකැපවීම හැෂ් කිරීම හෝ භාවිතා කිරීම ආරක්ෂිත වේ .
fsw

4
git pull -X theirsගැටුම් තිබේ නම් ඒකාබද්ධ කිරීමේ බැඳීමක් නිර්මාණය කරයි (උදා: වෙනත් බැඳීමක් දුරස්ථයට දිව ගියහොත් git push -f). ඒකාබද්ධ කිරීමේ කොමිස් ඔබට අවශ්‍ය නැතිනම්, ඒ වෙනුවට ධාවනය කරන්න git fetch && git reset --hard origin/master.
ඩෑන් ඩස්කල්ස්කු

1004

ඔබට පුනරාවර්තන "ඔවුන්ගේ" උපාය විකල්පය භාවිතා කළ හැකිය :

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.

සටහන: මිනිසා පිටුව ලෙස "අප හා" ඒකාබද්ධය පවසයි උපාය-විකල්පය ඇති "අපේ" ඒකාබද්ධ වඩා ඉතා වෙනස් උපාය .


මෙන්න වඩාත් සවිස්තරාත්මක පැහැදිලි කිරීම: lostechies.com/joshuaflanagan/2010/01/29/…
mPrinC

227
git checkout --theirsතනි පරස්පර ගොනුව මත ක්රියාත්මක කිරීමට
dvd

48
ඔබ දැනටමත් ගැටුම් නිරාකරණ තත්වයේ සිටී නම් මෙය ක්‍රියාත්මක නොවේ. එවැනි අවස්ථාවකදී විසඳීමට ඇති හොඳම ක්‍රමය මෙය යැයි මම විශ්වාස කරමි git checkout <ref to theirs> -- the/conflicted.file. ඉන්පසු git addඒවායේ වෙනස්කම්.
ThorSummoner

54
OrThorSummoner එවැනි අවස්ථාවක, git checkout --theirs path / of / file ඇත. ඒ ආකාරයෙන්, ඔබට නිවැරදි හැෂ් අතින් බැලීමට අවශ්‍ය නැත.
ඉකේ

8
KIkke ඔබ මගෙන් ඇසුවොත් එය මූලිකවම තමන්ගේම පිළිතුර විය යුතුය.
ThorSummoner

496

ඔබ දැනටමත් ගැටුම්කාරී තත්වයක සිටී නම්, ඔබට ඒවා සියල්ලම පිළිගැනීමට අවශ්‍ය නම්:

git checkout --theirs .
git add .

ඔබට ප්‍රතිවිරුද්ධ දේ කිරීමට අවශ්‍ය නම්:

git checkout --ours .
git add .

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


49
නැතහොත්, .ඔබට පරික්ෂා කිරීමට අවශ්‍ය තිත වෙනුවට ගොනුව (ය) භාවිතා නොකරන්න . අඩු "දැඩි" සහ හරියටම ඔබට කිරීමට අවශ්‍ය දේ, අනුමාන වශයෙන්.
manroe

10
ගොනුව අනෙක් ශාඛාවෙන් ඉවත් කර ඇත්නම් මෙය ක්‍රියා නොකරයි: '<file>' ඒවායේ අනුවාදය නොමැත
Japster24

4
මට හැකි නම් තවත් ඉහළට ඔසවා තබනු ඇත, සෑම විටම මෙම පිළිතුර වෙත නැවත පැමිණෙන්න.
තාරිකි

6
git add -uඅනුවාද පාලනයට යටත් නොවන ගොනු මඟ හැරීමට ඒ වෙනුවට භාවිතා කරන්න .
සුදීප්තා බාසාක්

3
උපකල්පිත නඩුව, ගොනුවක වෙනස්කම් තුනක්, එක් ගැටුමක්, දෙකක් ගැටුමකින් තොරව, මෙම විසඳුම එකිනෙකට පරස්පර නොවන වෙනස්කම් වලට අදාළ වන අතර ගැටුම්කාරී වෙනස අපගේ විසඳා ගත හැකිද? එසේත් නැතිනම් ඒවායේ වෙනස් නොවන වෙනස්කම් නොසලකා හරිමින් අපගේ අනුවාදය පමණක් අවශ්‍ය වේද?
pedromarce

223

හරි, මම දැන් සිටි තත්වය සිතන්න:

ඔබ උත්සාහ කරන්නේ 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

පුදුමයට කරුණක් නම්, මට මෙම පිළිතුර අන්තර්ජාලයේ ඉතා පහසුවෙන් සොයාගත නොහැකි විය.


15
යමෙකු git statusඅතර checkoutසහ එකක් සිදු කරන්නේ නම් add, ගොනුව තවමත් "දෙකම වෙනස් කරන ලද" ලෙස පෙන්වන බව සලකන්න .
බිෂොප්

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

2
මම මෙය කරන්නෙමි: git reset --hard පසුව git pull [remote server name] [branch name] -Xtheirs(ඒකාබද්ධ කිරීම අහෝසි කර නව දේවල් මගේ දේවල් මතට ඇද දමයි) - මෙය ඔබට අවශ්‍ය දැයි විශ්වාස නැත.
ssaltman

39

මෙම git pull -X theirsපිළිතුරු කැත ඒකාබද්ධ සිදු හෝ නිකුත් විසින් නිර්මාණය විය හැක

දෝෂය: පහත දැක්වෙන ලිපිගොනු වල ඔබගේ දේශීය වෙනස්කම් ඒකාබද්ධ කිරීමෙන් නැවත ලියනු ලැබේ:

ඔබට රෙපෝ වෙතින් ලිපිගොනු වල කිසියම් දේශීය වෙනස් කිරීමක් නොසලකා හැරීමට අවශ්‍ය නම්, උදාහරණයක් ලෙස සෑම විටම සම්භවයක් ඇති කැඩපතක් විය යුතු සේවාදායකයකු මත, මෙය ක්‍රියාත්මක කරන්න ( masterඔබට අවශ්‍ය ශාඛාව වෙනුවට ආදේශ කරන්න):

git fetch && git reset --hard origin/master

එය ක්‍රියාත්මක වන්නේ කෙසේද? git fetchකරන්නේ git pullනමුත් ඒකාබද්ධ තොරව . එවිට git reset --hardඔබගේ වැඩ කරන ගස අන්තිම බැඳීමට ගැලපේ. රෙපෝ හි ඇති ගොනු සඳහා ඔබගේ සියලුම දේශීය වෙනස්කම් ඉවතලනු ඇත , නමුත් නව දේශීය ලිපිගොනු තනි වනු ඇත.


1
+1 - git fetch && git reset --hard {remote}/{branch}මගේ ගැටලුව විසඳුවේ එයයි. ශාඛාවක “ඔවුන්ගේ” තත්වයට පක්ෂව මගේම වෙනස්කම් මුළුමනින්ම ඉවත් කිරීමට මට අවශ්‍ය විය, නමුත් git pull -X theirsගෙන ගිය / නැවත නම් කරන ලද සමහර ලිපිගොනු වල හුස්ම හිරවී ඇත. ස්තූතියි!
අයිවාලෝ ස්ලාවොව්

34

Git ඒකාබද්ධ කිරීමෙන් පසු, ඔබට ගැටුම් ඇති වුවහොත් ඔබට හෝ ඔබේ හෝ ඒවාට අවශ්‍ය නම්

git checkout --theirs .
git checkout --ours .

එකිනෙකට පරස්පර කොටස් මත මම මෙය කරන්නේ කෙසේද? ඉහත සඳහන් දෑ ගොනු මට්ටමින් ක්‍රියාත්මක වන අතර ගැටුම්කාරී ගොනුවකට තිබිය හැකි ගැටුම් නොවන කුට්ටි ඉවතලයි.
ජානි

21

විශේෂිත ශාඛාවක අනුවාදය සමඟ ඇති සියලු ගැටුම් නිරාකරණය කිරීම සඳහා:

git diff --name-only --diff-filter=U | xargs git checkout ${branchName}

එබැවින්, ඔබ දැනටමත් ඒකාබද්ධ කිරීමේ තත්වයේ සිටී නම් සහ ගැටුම්කාරී ලිපිගොනු වල ප්‍රධාන අනුවාදය තබා ගැනීමට ඔබට අවශ්‍ය නම්:

git diff --name-only --diff-filter=U | xargs git checkout master

පයිප්ප xargs වෙත ප්‍රවේශය නොමැති කවුළු මත සිටින පුද්ගලයින් සඳහා, මෙය පරිවර්තනය කරන්නේ කෙසේද?
tsemer

එය ඔබගේ වෙනස්කම් සම්පූර්ණයෙන්ම මඟ හැරෙන්නේ නැද්ද? ගැටුම් තත්ත්වයේ නොමැති අය පවා?
වැලන්ටින් හයිනිට්ස්

මේක තමයි මම කළේ. අවාසනාවකට එය පසුව මෙම වෙනස්කම් සිදු කිරීම සඳහා විධානයක් git cherry-pick --continue හෝgit commit --allow-empty විධානයක් අවශ්‍ය වන අතර, විධානයක් අවශ්‍ය වන පද්ධතියක් නොමැති බව පෙනේ, මෙය ස්වයංක්‍රීය කිරීම වේදනාවක් බවට පත් කරයි. මම දැනට මෙය .git/COMMIT_EDITMSGවිසඳන්නේ ගොනුවක පැවැත්ම පරීක්ෂා කිරීමෙන් නමුත් එය අශෝභන හා අස්ථාවර බවක් පෙනේ, එය සැමවිටම ක්‍රියාත්මක වන බව මට තවම ඒත්තු ගොස් නැත.
කොන්රාඩ් රුඩොල්ෆ්

මෙය හොඳයි, එයින් අදහස් වන්නේ ඔබ සමහරක් අතින් විසඳා ගතහොත් (සහ කරන්න git add) එවිට ඔබට ඉතිරි කොටස තොග වශයෙන් විසඳා ගත හැකිය. git checkout --ours/ git checkout --theirsද ප්‍රයෝජනවත් වේ.
rcoup

19

සමහර විට මෙම නොවන කරුණාකර ඇත වැඩ කරන්නේ :

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 ගිලී නැති ගොනු ලැයිස්තුවෙන් ගොනු ඉවත් නොකරයි


14

VS කේතය (ඒකාබද්ධ Git) IDE භාවිතා කරන්නන්:

ගැටුම් ගොනුවේ එන සියලුම වෙනස්කම් පිළිගැනීමට ඔබට අවශ්‍ය නම් පහත පියවර අනුගමනය කරන්න.

1. Go to command palette - Ctrl + Shift + P
2. Select the option - Merge Conflict: Accept All Incoming

ඒ හා සමානව ඔබට සියල්ලම පිළිගන්න, සියල්ල පිළිගන්න, වෙනත් විකල්ප සඳහා කළ හැකිය .


2
එය ක්‍රියාත්මක වන්නේ එක් ගොනුවක් සඳහා පමණක් වන අතර ගැටුම් ඇති සියලුම ලිපිගොනු නොවේ.
යොරියෝ

3

ඔබ දැනටමත් ගැටුම්කාරී තත්වයක සිටී නම් සහ මාර්ගය එකින් එක පරීක්ෂා කිරීමට අවශ්‍ය නොවන්නේ නම්. ඔබට උත්සාහ කළ හැකිය

git merge --abort
git pull -X theirs

1

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

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


-1

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
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.