“Git merge -s our” හි “ඔවුන්ගේ” අනුවාදයක් තිබේද?


902

මාතෘකාව B "B" භාවිතා කරමින් "A" සමඟ ඒකාබද්ධ කරන විට git merge, මට යම් ගැටුම් ඇති වේ. "බී" හි අනුවාදය භාවිතා කර සියලු ගැටුම් විසඳිය හැකි බව මම දනිමි.

මම දන්නවා git merge -s ours. නමුත් මට අවශ්‍ය දේ වැනි දෙයක් git merge -s theirs.

එය නොපවතින්නේ ඇයි? පවත්නා gitවිධානයන් සමඟ ගැටෙන පසු එකම ප්‍රති result ලය ලබා ගන්නේ කෙසේද? ( git checkoutB වෙතින් ඉවත් නොකළ සෑම ගොනුවක්ම)

යාවත්කාලීන කිරීම: A ශාඛාවෙන් කිසිවක් බැහැර කිරීමේ “විසඳුම” (ගසෙහි B අනුවාදයට ඒකාබද්ධ කිරීමේ ලක්ෂ්‍යය) මා සොයන දේ නොවේ.


1
මෙම පිළිතුරද බලන්න: stackoverflow.com/questions/928646/… - ඒ වෙනුවට බී අනුවාදය භාවිතා කිරීම සඳහා ආදර්ශය වෙනස් කිරීම සුළුපටු ය
රොබී බාසැක්

9
අනුකරණය කළ හැකි සියලු ක්‍රම සඳහා එක් ශාඛාවක් තවත් ශාඛාවක් සෑදීම සඳහා SO පිළිතුරු git විධානය බලන්න . git merge -s their
VonC

4
එබැවින් ඔබ සැබවින්ම සොයන්නේ git merge -s theirs(එය පහසුවෙන් git merge -s oursසහ තාවකාලික ශාඛාවක් සමඟ ළඟා කර ගත හැකි ), ඒකාබද්ධ වීමේ ශාඛාවේ වෙනස්වීම් අප විසින් මුළුමනින්ම නොසලකා හරින බැවින් ...
නිකොලා මාටිනි

23
OreTorek - Git devs සැබවින්ම ඊට අමතරව සැපයිය හැකි බව සොයාගෙන theirsතිබේද ours??? මෙය Git හි ඉහළ මට්ටමේ ඉංජිනේරු සහ සැලසුම් ගැටළු වල රෝග ලක්ෂණයකි: නොගැලපීම.
jww

3
@jww මෙහි ගැටළුව වන්නේ "අපගේ ඒකාබද්ධ කිරීම අපගේ" ආක්‍රමණශීලී වීම ගැන නොව, එය ප්‍රති-බුද්ධිමත් වීමයි. OP හි ප්‍රශ්නයෙන් ඔබට දැක ගත හැකිය, එවැනි අංගයක් එකතු කළ හොත් ඔහු එය වැරදීමකින් භාවිතා කරනු ඇත්තේ ඔහුට ඇත්ත වශයෙන්ම කිරීමට අවශ්‍ය වන්නේ “git merge -s recursive -X their” යන්නයි. අනෙක් ශාඛාවේ අනුවාදය සමඟ ගැටුම් ඉක්මවා යන තවත් ශාඛාවක් ඒකාබද්ධ කිරීමට අවශ්‍ය වීම සාමාන්‍ය දෙයකි, නමුත් වර්තමාන ශාඛාව වෙනත් ශාඛාවක් සමඟ සම්පූර්ණයෙන්ම නැවත ලිවීම වර්තමාන වෙනස්වීම් සම්පූර්ණයෙන්ම බැහැර කිරීම සැබවින්ම ව්‍යතිරේක අවස්ථාවකි.
තෝමස්මුරා

Answers:


1043

වෙත -Xවිකල්පය එක් කරන්න theirs. උදාහරණයක් වශයෙන්:

git checkout branchA
git merge -X theirs branchB

සෑම දෙයක්ම අපේක්ෂිත ආකාරයෙන් ඒකාබද්ධ වේ.

මම දුටු එකම දෙය වන්නේ ශාඛා බී වෙතින් ලිපිගොනු මකා දැමීමයි. Git හැර වෙනත් දෙයක් ඉවත් කිරීම සිදු කළේ නම් ඒවා ගැටුම් ලෙස පෙන්වයි.

නිවැරදි කිරීම පහසුය. git rmමකාදැමූ ඕනෑම ගොනුවක නම සමඟ ධාවනය කරන්න:

git rm {DELETED-FILE-NAME}

ඊට පසු -X theirs අපේක්ෂිත පරිදි වැඩ කළ යුතුය.

ඇත්ත වශයෙන්ම, git rmවිධානය සමඟ සත්‍ය ඉවත් කිරීම සිදු කිරීමෙන් ගැටුම මුලින් සිදුවීම වලක්වනු ඇත.


සටහන : දිගු පෝරම විකල්පයක් ද පවතී.

එය භාවිතා කිරීමට, ප්රතිස්ථාපනය කරන්න:

-X theirs

සමග:

--strategy-option=theirs

6
මුල් ප්‍රශ්නයට වඩා හොඳ විසඳුමක් සඳහා (පෝල් ප්ලැඩිජ්ස්) පහත වෙනත් පිළිතුර බලන්න.
මැල්කම්

208
මෙය "ඒකාබද්ධ කිරීමේ උපාය මාර්ගයට theirs" සමාන නොවන බව සැලකිල්ලට ගැනීම වටී . -Xtheirs යනු පුනරාවර්තන උපාය මාර්ග සඳහා යොදා ගන්නා උපාය මාර්ගික විකල්පයයි . මෙයින් අදහස් කරන්නේ පුනරාවර්තන උපායමාර්ගය තවමත් එයට හැකි ඕනෑම දෙයක් ඒකාබද්ධ කරන අතර ගැටුම් ඇති වුවහොත් එය “ඔවුන්ගේ” තර්කනයට පමණක් වැටෙනු ඇති බවයි. ඉහත වැනි බොහෝ අවස්ථාවන්හිදී කෙනෙකුට අවශ්‍ය වන්නේ මෙය වුවත්, මෙය “B ශාඛාවෙන් සෑම දෙයක්ම ගන්න” හා සමාන නොවේ. එය කෙසේ හෝ සැබෑ ඒකාබද්ධ කිරීම සිදු කරයි.
තිමූර්

2
එය වෙනත් විධානයන් සමඟ ද ක්‍රියා කරයි. මම දැන් කළේ 'git cherry-pick sha1 -X thems'. ස්තූතියි!
මැක්ස් හොහෙන්ගර්

52
මෙය භයානක පිළිතුරකි, මන්ද එය නිවැරදි බව පෙනේ, නමුත් ඇත්ත වශයෙන්ම වැරදිය. "git merge -X theirs" කරන්නේ "git merge -s their" කරන්නේ කුමක්ද යන්නයි. එය ඒකාබද්ධ ශාඛාවේ අන්තර්ගතය සමඟ වත්මන් ශාඛාව ප්‍රතිස්ථාපනය නොකරයි. එය "ඔවුන්ගේ" වෙනස්කම් වලට වැඩි කැමැත්තක් දක්වයි, නමුත් ගැටුමකදී පමණි. එම නිසා, එහි ප්‍රති commit ලයක් වශයෙන් ඇති වන කැපවීම “ඔවුන්ගේ” ශාඛාවට වඩා බෙහෙවින් වෙනස් විය හැකිය. ප්‍රශ්න පෝස්ටරයේ මතකයේ තිබුණේ මෙය නොවේ.
අයිවන් ක්‍රිවියාකොව්

7
33 user3338098: ඔව්, ඔබ හරි. මම ප්‍රශ්නය නැවත කියවූ අතර එය ද එතරම් හොඳ නැත. අවාසනාවකට මෙන්, ව්‍යාකූලත්වයට මූලික හේතුව පිළිතුර නොවන අතර ප්‍රශ්නය පවා නොවේ. ඒකාබද්ධ කිරීමේ උපාය මාර්ගයකට 'පුනරාවර්තන' ඒකාබද්ධ කිරීමේ විකල්පයකට 'අපේ' යන නමම ලබා දීම git කතුවරුන්ගේ සැලසුම් තේරීම වේ. මෙම නඩුවේ ව්යාකූලත්වය ප්රායෝගිකව නොවැළැක්විය හැකිය.
අයිවන් ක්‍රිවියාකොව්

219

අපගේ පරීක්ෂා කළ ශාඛාවට ශාඛා බී ඒකාබද්ධ කිරීම සඳහා කළ හැකි සහ පරීක්ෂා කළ හැකි විසඳුමක්:

# in case branchA is not our current branch
git checkout branchA

# make merge commit but without conflicts!!
# the contents of 'ours' will be discarded later
git merge -s ours branchB    

# make temporary branch to merged commit
git branch branchTEMP         

# get contents of working tree and index to the one of branchB
git reset --hard branchB

# reset to our merged commit but 
# keep contents of working tree and index
git reset --soft branchTEMP

# change the contents of the merged commit
# with the contents of branchB
git commit --amend

# get rid off our temporary branch
git branch -D branchTEMP

# verify that the merge commit contains only contents of branchB
git diff HEAD branchB

එය ස්වයංක්‍රීය කිරීම සඳහා ඔබට එය ශාඛා ඒ සහ ශාඛා බී භාවිතා කර ස්ක්‍රිප්ට් එකකට ඔතා තැබිය හැකිය.

මෙම විසඳුම ඔබ අපේක්ෂා කරන ආකාරයටම ඒකාබද්ධ කිරීමේ පළමු හා දෙවන දෙමව්පියන් ආරක්ෂා කරයි git merge -s theirs branchB.


ප්‍ර: ඔබට ශාඛා ටෙම්ප් අවශ්‍ය ඇයි? ඔයාට git reset --soft branchAබැරිද?
cdunn2001

4
d cdunn2001: කෙසේ හෝ මම එකම දේ සිතුවෙමි, නමුත් නැත. අවධානය යොමු කරන git reset --hardවෙනස්කම් බව සලකන්න branchA.
ට්සුයෝෂි ඉටෝ

5
මෝඩ ප්‍රශ්නයක් ඇසීමට කණගාටුයි, නමුත් මෙම ක්‍රමය -xtheirs වඩා හොඳ වන්නේ ඇයි? වාසි / අවාසි
මොනවාද

9
ris chrispepper1989 -x ඒවා ගැටුම් වලට පමණක් බලපාන අතර , අපගේ හක්කක් පිරිසිදුව යෙදිය හැකි නම්, එමඟින් ලැබෙන ඒකාබද්ධය කරා ළඟා වේ. මෙම අවස්ථාවෙහිදී, අවසාන විධානය මඟින් පෙන්වා ඇති පරිදි, ගැටුම් ඇතිවිය හැකිද නැද්ද යන්න නොසලකා අපි ශාඛා බී වලට පරිපූර්ණ ලෙස ඒකාබද්ධ කිරීමක් ලබා ගනිමු.
අන්කල් සීව්

2
@UncleZeiv එසේ මූලික වශයෙන් "ඔවුන්ට ලැබෙන්නේ" ගැල කේතය සමාන නොවන බව int කේතය ප්රතිඵලයක් එක්සත් ජාතීන්ගේ-ගැටුම්කාරී වෙනස්කම් සහ ගොනු තබා ඇත කරන්නේ, පැහැදිලි කිරීම සඳහා ඔබට ස්තුතියි.
chrispepper1989

90

Git හි පැරණි අනුවාදයන් ඔබට "ඔවුන්ගේ" ඒකාබද්ධ කිරීමේ උපාය භාවිතා කිරීමට ඉඩ දී ඇත:

git pull --strategy=theirs remote_branch

ජූනියෝ හමානෝ (Git නඩත්තු කරන්නා) විසින් මෙම පණිවිඩයේ පැහැදිලි කර ඇති පරිදි මෙය එතැන් සිට ඉවත් කර ඇත . සබැඳියේ සඳහන් කර ඇති පරිදි, ඒ වෙනුවට ඔබ මෙය කරනු ඇත:

git fetch origin
git reset --hard origin

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


7
මට ඇත්තටම ජූනියෝ හමානෝගේ පැහැදිලි කිරීම තේරෙන්නේ නැත. කොහොමද git reset --hard originඑය පවත්නේ ශෛලිය ඒකාබද්ධ සඳහා විසඳුමක්? මට ශාඛා බී ශාඛාව සමඟ ඒකාබද්ධ කිරීමට අවශ්‍ය නම් (ඇලන් ඩබ්ලිව්. ස්මිත්ගේ පිළිතුර මෙන්), මම එය resetක්‍රමවේදය භාවිතා කරන්නේ කෙසේද?
ජේම්ස් මැක් මහෝන්

3
Ames ජේම්ස් මැක්මහෝන්: ජූනියෝ සී හමානෝගේ අදහස git reset --hard“ඔවුන්ගේ” ශෛලිය ඒකාබද්ධ නොවේ. ඇත්ත වශයෙන්ම, git reset --hardඒකාබද්ධ කිරීමේ බැඳීමක් හෝ ඒ සඳහා කිසිදු කැපවීමක් ඇති නොකරයි. ඔහුගේ අදහස නම්, අපි HEAD හි ඇති ඕනෑම දෙයක් වෙනත් දෙයක් මගින් ප්‍රතිස්ථාපනය කිරීම සඳහා ඒකාබද්ධ කිරීමක් භාවිතා නොකළ යුතුය . මම අනිවාර්යයෙන්ම එකඟ නොවෙමි.
ට්සුයෝෂි ඉටෝ

11
theirsතාර්කිකත්වය අසම්පූර්ණ බැවින් එය ඉවත් කිරීම ලැජ්ජාවකි . කේතය හොඳ වන අවස්ථාවන් සඳහා එය ඉඩ දීමට අපොහොසත් විය, එය උඩුගං බලා වෙනස් දාර්ශනික පදනමක් මත පවත්වා ගෙන යනු ලැබේ, එබැවින් එම අර්ථයෙන් 'නරක' වේ, එබැවින් යමෙකුට උඩුගං බලා යාවත්කාලීනව සිටීමට අවශ්‍ය වේ, නමුත් ඒ සමඟම හොඳ කේත 'නිවැරදි කිරීම්' රඳවා තබා ගන්න [git & msysgit ඔවුන්ගේ විවිධ ඉලක්ක වේදිකා දර්ශන නිසා මෙම 'ගැටුම' ඇති කරයි]
පිලිප් ඕක්ලි

1
මම මේ මොහොතේ සිරවී සිටින භාවිත නඩුව ද එහි මග හැරී ඇත, එහිදී මම වෙනත් කෙනෙකු සමඟ ශාඛාවක් බෙදා හදා ගන්නා අතර අපි දෙදෙනාම එකවර වෙනස්කම් (විවිධ ලිපිගොනු වල) ඉහළට ඔසවා තැබුවෙමු. ඒ නිසා මට අවශ්‍ය වන්නේ මා සතුව ඇති පැරණි අනුවාදයන් සියල්ලම වසා දමා ඒ වෙනුවට ඔහුගේ නවතම ඒවා භාවිතා කිරීමයි. මා යාවත්කාලීන කළ ලිපිගොනු සඳහාද එයම කිරීමට ඔහුට අවශ්‍යය. 'නැවත සැකසීමට' කිසිවක් නැත. එක් එක් ගොනුව ඩොලර් 20 ක් වන විට එය පරීක්ෂා කිරීම සඳහා විසඳුම ප්‍රායෝගික නොවේ.
szeitlin

2
මට ඇත්තටම දර්ශනය තේරෙන්නේ නැහැ. මම භාවිතා theirsකළේ වෙනම ශාඛා දෙකක සමහර ලිපිගොනු අහම්බෙන් වෙනස් කර ඇති අතර සෑම ගොනුවක් සඳහාම එය අතින් සිදු නොකොට එක් වෙනස් කිරීමක් ඉවත දැමීමට අවශ්‍ය නිසාය.
sudo

70

ඔබ අපේක්ෂිත ප්‍රති come ලය කුමක්ද යන්න මුළුමනින්ම පැහැදිලි නැත, එබැවින් පිළිතුරු සහ ඔවුන්ගේ අදහස් දැක්වීමේදී “නිවැරදි” ආකාරය පිළිබඳ යම් ව්‍යාකූලතාවයක් පවතී. මම දළ විශ්ලේෂණයක් ලබා දීමට උත්සාහ කර පහත විකල්ප තුන බලන්න:

ඒකාබද්ධ කිරීමට උත්සාහ කර ගැටුම් සඳහා B භාවිතා කරන්න

මේ නො වන "සඳහා පවත්නේ අනුවාදය git merge -s oursවන" නමුත් "සඳහා පවත්නේ අනුවාදය git merge -X ours" (සඳහා කෙටි වන git merge -s recursive -X ours:)

git checkout branchA
# also uses -s recursive implicitly
git merge -X theirs branchB

උදා: ඇලන් ඩබ්ලිව්. ස්මිත්ගේ පිළිතුර මෙයයි .

B වෙතින් පමණක් අන්තර්ගතය භාවිතා කරන්න

මෙය ශාඛා දෙකටම ඒකාබද්ධ කිරීමේ බැඳීමක් ඇති කරන නමුත් සියලු වෙනස්කම් branchAබැහැර කරන අතර අන්තර්ගතය පමණක් තබා ගනී branchB.

# Get the content you want to keep.
# If you want to keep branchB at the current commit, you can add --detached,
# else it will be advanced to the merge commit in the next step.
git checkout branchB

# Do the merge an keep current (our) content from branchB we just checked out.
git merge -s ours branchA

# Set branchA to current commit and check it out.
git checkout -B branchA

මුසුව අනාචාරයේ පළමු මව් දැන් සිට බව බව සටහන branchBසහ එකම දෙවන වෙතින් වන branchA. උදා: ගන්ඩල්ෆ් 458 ගේ පිළිතුර මෙයයි .

B වෙතින් පමණක් අන්තර්ගතය භාවිතා කර නිවැරදි දෙමාපිය පිළිවෙල තබා ගන්න

මෙය සැබෑ "ඔවුන්ගේ අනුවාදය git merge -s ours" වේ. එයට පෙර විකල්පයේ ඇති අන්තර්ගතයට සමාන අන්තර්ගතයක් ඇත (එනම් එය පමණක් branchB) නමුත් දෙමව්පියන්ගේ අනුපිළිවෙල නිවැරදි ය, එනම් පළමු දෙමව්පියන් පැමිණෙන්නේ branchAදෙවැන්නාගෙන් ය branchB.

git checkout branchA

# Do a merge commit. The content of this commit does not matter,
# so use a strategy that never fails.
# Note: This advances branchA.
git merge -s ours branchB

# Change working tree and index to desired content.
# --detach ensures branchB will not move when doing the reset in the next step.
git checkout --detach branchB

# Move HEAD to branchA without changing contents of working tree and index.
git reset --soft branchA

# 'attach' HEAD to branchA.
# This ensures branchA will move when doing 'commit --amend'.
git checkout branchA

# Change content of merge commit to current index (i.e. content of branchB).
git commit --amend -C HEAD

මේ මොකක්ද පෝල් Pladijs පිළිතුර (තාවකාලික ශාඛා කිරීමකින් තොරව) කරන්නේ.


විකල්ප 3 හි පිරිසිදු අනුවාදය:git checkout branchA; git merge -s ours --no-commit branchB; git read-tree -um @ branchB; git commit
jthill

@jthill: ඔබේ අනුවාදය වඩාත් සංක්ෂිප්ත වන අතර එය read-treeසාමාන්‍ය git භාවිතා කරන්නෙකුට භාවිතා නොකළ හැකි අඩු මට්ටමේ ("ජලනල") විධානය ද භාවිතා කරයි (අවම වශයෙන් මම නොවේ ;-)). පිළිතුරෙහි ඇති විසඳුම් භාවිතා කරන්නේ බොහෝ git භාවිතා කරන්නන් දැන සිටිය යුතු ඉහළ මට්ටමේ ("පෝසිලේන්") විධානයන් පමණි. මම ඔවුන්ට කැමතියි නමුත් ඔබේ අනුවාදයට ස්තූතියි!
siegi

දෙවන සිට අවසාන පියවර දක්වා ඔබට විස්තර කළ හැකිද? එය එහි නොතිබිය යුතු බව පෙනේ.
පැට්‍රික්

At පැට්‍රික්, මෙම පියවර අවශ්‍යයි. ඔබ එය මඟ හැරියහොත්, ඔබට එම කැපවීමම ලැබෙනු ඇත, නමුත් ඔබට මෙම බැඳීම පෙන්වා දෙන ශාඛාවක් නොමැත. එබැවින් ඔබ වෙනත් බැඳීමකට / ශාඛාවකට මාරු වූ විගසම ඔබ අවසාන විධානය ( …commit --amend…) සමඟ කළ කැපවීම "නැති වී යයි". මට ඒවා කිරීමට කාලය ඇති විගසම මෙම පිළිතුරට චිත්‍රක පැහැදිලි කිරීම් කිහිපයක් එක් කිරීමට මම සැලසුම් කරමි… ;-)
siegi

63

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

git checkout --theirs <file>

අනෙක් ශාඛාවෙන් සංශෝධනය භාවිතා කරමින් ගැටුම නිරාකරණය කිරීමට. ඔබ එක් එක් ගොනුව සඳහා මෙය කරන්නේ නම්, ඔබ අපේක්ෂා කරන ආකාරයටම ඔබට හැසිරීමක් ඇත

git merge <branch> -s theirs

කෙසේ වෙතත්, උත්සාහය ඒකාබද්ධ කිරීමේ උපාය මාර්ගයට වඩා වැඩි ය! (මෙය git අනුවාදය 1.8.0 සමඟ පරීක්ෂා කරන ලදි)


1
ලිපිගොනු ලැයිස්තුව ලබා ගත හැකි නම් එය ඉතා හොඳ වේ. උදාහරණයක් ලෙස, git ls-files --modified | xargs git addදෙපැත්තටම එකතු කිරීම සඳහා මෙය කිරීමට මට අවශ්‍ය විය: /
andho

ඇත්ත වශයෙන්ම git විසින් දෙපසම එකතු කරන ලද ලිපිගොනු නැවත ලබා දෙයි, git ls-files --modifiedඑබැවින් මෙයද ශක්‍ය විසඳුමක් යැයි මම සිතමි.
andho

1
මෙයද එකතු කිරීම ගැන ස්තූතියි. බොහෝ විට එය ගොනු මගින් ගොනු පදනමක් මත අවශ්‍ය නොවේ. එසේම, git තත්ත්වය "පතුලේ නොගැලපෙන මාර්ග" පෙන්වයි. නොවිසඳුණු මාර්ග ලැයිස්තුව ලබා ගැනීම සඳහා, මම මෙම අන්වර්ථය භාවිතා කරමි:git config --global alias.unresolved '!git status --short|egrep "^([DAU])\1"'
මෙල්වින්

අර්ථය මොකක්ද -Xහා අතර වෙනස මොකක්ද -Xහා -s? කිසිදු ලේඛනයක් සොයාගත නොහැක.
ලී යැං


18

මාතෘකා ශාඛාව "බී" "ඒ" හි git ඒකාබද්ධ කිරීම සමඟ ඒකාබද්ධ කරන විට, මට යම් ගැටුම් ඇති වේ. "බී" හි අනුවාදය භාවිතා කර සියලු ගැටුම් විසඳිය හැකි බව මම දනිමි.

Git ඒකාබද්ධ කිරීම ගැන මම දනිමි. නමුත් මට අවශ්‍ය වන්නේ git merge> -s වැනි ය.

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

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

git checkout Branch
git merge master -s ours

ඉන්පසුව, චෙක්පට් මාස්ටර් සහ ඔබේ ශාඛාව ඒ තුළ ඒකාබද්ධ කරන්න (එය දැන් සුමටව සිදුවනු ඇත):

git checkout master
git merge Branch

1
ස්තූතියි. මෙය පිළිගත් පිළිතුර විය යුතුය, බොහෝ දුරට සරලම හා වඩාත්ම නිවැරදි ය. ඔබේ ශාඛාව ස්වාමියා සමඟ පිටුපස / ගැටුම් තිබේ නම්, එහි ශාඛා කාර්යය ඒකාබද්ධ කිරීම සහ සියල්ල නැවත ප්‍රගුණ කිරීමට පෙර සියල්ල ක්‍රියාත්මක කිරීම.
ස්ටැක්හෝලා

12

ඔබ A ශාඛාවේ නම් කරන්න:

git merge -s recursive -X theirs B

Git අනුවාදය 1.7.8 මත පරීක්ෂා කර ඇත


8

ඔබ ඒකාබද්ධ කරන ශාඛාවෙන් ආදාන පමණක් ගන්නා ඒකාබද්ධ කිරීමක් සැබවින්ම නිසියාකාරව කිරීමට ඔබට කළ හැකිය

git merge --strategy=ours ref-to-be-merged

git diff --binary ref-to-be-merged | git apply --reverse --index

git commit --amend

මා දන්නා ඕනෑම අවස්ථාවක ගැටුම් ඇති නොවනු ඇත, ඔබට අමතර ශාඛා සෑදිය යුතු නැත, එය සාමාන්‍ය ඒකාබද්ධ කිරීමක් ලෙස ක්‍රියා කරයි.

කෙසේ වෙතත් මෙය උප මොඩියුල සමඟ හොඳින් ක්‍රියා නොකරයි.


-R මෙහි කරන්නේ කුමක්ද?
පී. මයර් නෝර්

මේ ආකාරයෙන් ඔබට "ගෙන ගිය සහ වෙනස් කළ" ලිපිගොනු ඉතිහාසය අහිමි වේ. මම හරිද?
elysch

1
-R යනු - ප්‍රතිලෝමයි, මම පිළිතුර ස්වයං-ලේඛනගත කිරීම සඳහා යාවත්කාලීන කළෙමි.
එලියා ලින්

ඔබ ඒකාබද්ධ කිරීමට උත්සාහ කරන ලිපිගොනු එන ශාඛාව තුළ මකා දැමුවහොත් මෙය ක්‍රියාත්මක වන බවක් නොපෙනේ.
solvingJ

7

එය නොපවතින්නේ ඇයි?

මම "තුළ සඳහන් වන අතර තවත් වැනි ශාඛාව ගැනීම සඳහා තොරතුරු තාක්ෂණය විධානය ආකාරය අනුකරනය කිරීමට" git merge -s theirs, සටහන් Git 2.15 (Q4 2017) දැන් පැහැදිලි වන බව:

-X<option>ඒකාබද්ධ කිරීම සඳහා වන ලියකියවිලි නොමඟ යවන ලද්දේ " -s theirs" පවතින බව යෝජනා කිරීම සඳහා ය . එය එසේ නොවේ.

බලන්න c25d98b සිදු විසින් (25 සැප්තැම්බර් 2017) ජූනි සී Hamano ( gitster) .
(විසින් අලුතින් ඒකාබද්ධ ජූනි සී Hamano - gitster- දී 4da3e23 සිදු , 28 සැප්තැම්බර් 2017)

ඒකාබද්ධ කිරීමේ උපාය මාර්ග: එය ඇඟවීමෙන් වළකින්න-s theirs " පවතී

-Xoursඒකාබද්ධ කිරීමේ විකල්පය පිළිබඳ විස්තරය වර්‍ගාත්මක සටහනක් ඇති අතර එය පා different කයන්ට වඩා බෙහෙවින් වෙනස් ය-s ours , එය නිවැරදියි, නමුත් -Xtheirsඑය අනුගමනය කරන විස්තරය එය නොසැලකිලිමත් ලෙස පවසන්නේ “මෙය ප්‍රතිවිරුද්ධ දෙයයි ours”, පා readers කයන්ට ද අවශ්‍ය යැයි ව්‍යාජ හැඟීමක් ඇති කරයි. එය -s theirsයථාර්ථයේ දී පවා නොපවතින තත්වයට වඩා බෙහෙවින් වෙනස් ය .

-Xtheirsයනු පුනරාවර්තන ක්‍රමෝපායට අදාළ උපාය මාර්ගික විකල්පයකි . මෙයින් අදහස් කරන්නේ පුනරාවර්තන උපායමාර්ගය තවමත් එයට හැකි ඕනෑම දෙයක් ඒකාබද්ධ කරන අතර එය නැවත වැටෙනු ඇත්තේ "theirs කරන අතර ගැටුම් ඇති වුවහොත් එය තර්කනයට ඇති බවයි.

theirsඒකාබද්ධ කිරීමේ උපාය මාර්ගයක විචල්‍යතාවය හෝ නොවීම පිළිබඳ එම විවාදය මෑතකදී මෙම සැප්තැම්බර් 2017 නූලෙන් නැවත ගෙන එන ලදි .
එය පැරණි (2008) නූල් පිළිගනී

කෙටියෙන් කිවහොත්, පෙර සාකච්ඡාව "අපට අවශ්‍ය නැත" යනුවෙන් සාරාංශගත කළ හැකි -s theirsඅතර එය වැරදි වැඩ ප්‍රවාහයක් දිරිගන්වයි.

එහි අන්වර්ථය සඳහන් කරයි:

mtheirs = !sh -c 'git merge -s ours --no-commit $1 && git read-tree -m -u $1' -

යාරොස්ලාව් හැල්චෙන්කෝ නැවත වරක් එම උපක්‍රමය වෙනුවෙන් පෙනී සිටීමට උත්සාහ කළද ජූනියෝ සී. හමානෝ තවදුරටත් මෙසේ පවසයි .

අපගේ සහ ඔවුන්ගේ සමමිතික නොවීමට හේතුව ඔබ ඔබම මිස ඔවුන් නොවන නිසාය --- අපගේ ඉතිහාසය සහ ඔවුන්ගේ ඉතිහාසය පාලනය කිරීම සහ හිමිකම සමමිතික නොවේ.

ඔවුන්ගේ ඉතිහාසය ප්‍රධාන රේඛාව බව ඔබ තීරණය කළ පසු, ඔබේ සංවර්ධන රේඛාව පැති ශාඛාවක් ලෙස සලකමින් එම දිශාවට ඒකාබද්ධ වීමට ඔබට අවශ්‍ය වනු ඇත, එනම්, එහි ප්‍රති ing ලයක් ලෙස ඒකාබද්ධ වීමේ පළමු මවුපියන් ඔවුන්ගේ ඉතිහාසය හා දෙවනුව දෙමාපිය යනු ඔබගේ ඉතිහාසයේ අවසාන නරක දෙයයි. එබැවින් ඔබ භාවිතා කිරීම අවසන් වනු ඇත "checkout their-history && merge -s ours your-history පළමු-මාපියභාවය සංවේදීව තබා ගැනීමට " කරයි.

එම අවස්ථාවෙහිදී, " -s ours" හි භාවිතය තවදුරටත් " -s theirs" හිඟකම සඳහා විසඳුමක් නොවේ .
එය අපේක්ෂිත අර්ථකථනයේ නිසි කොටසකි, එනම් දැනට පවතින කැනොනිකල් ඉතිහාස රේඛාවේ දෘෂ්ටි කෝණයෙන්, ඔබට එය කළ දේ ආරක්ෂා කර ගැනීමට අවශ්‍ය වන අතර අනෙක් ඉතිහාසයේ රේඛාව අහෝසි කරයි .

මයික් බීටන් අදහස් දැක්වූ පරිදි ජූනියෝ තවදුරටත් පවසයි :

git merge -s ours <their-ref>' <their-ref>සදාකාලිකව නොසලකා හැරිය යුතු යැයි ඔවුන්ගේ ශාඛාව මත සලකුණු කැපීම' effectively ලදායී ලෙස පවසයි ;
මෙය වැදගත් වන්නේ, ඔබ පසුව ඔවුන්ගේ ශාඛාවේ පසුකාලීන ප්‍රාන්තවලින් ඒකාබද්ධ වුවහොත්, නොසලකා හරින ලද වෙනස්කම් නොමැතිව කිසි විටෙකත් ඒවායේ පසුකාලීන වෙනස්කම් ගෙන එනු ඇත .


1
මෙය ප්රයෝජනවත් පිළිතුර වේ, නමුත් එය මට ජූනි සී Hamano පිළිතුර තේරුම් කර ඇති බව එක් ප්රධාන කරුණක් ගැන සඳහන් නොකරයි: git merge -s ours <their-ref>ඵලදායී ලකුණ අනාචාරයේ අනාචාරයේ ස්ථිරවම නොසලකා නොහැරිය හැකි ලෙස තම ශාඛා මත <ඔවුන්ගේ-ref> දක්වා කර ඇති 'පවසයි '; මෙය වැදගත් වන්නේ, ඔබ පසුව ඔවුන්ගේ ශාඛාවේ පසුකාලීන රාජ්‍යයන්ගෙන් ඒකාබද්ධ වුවහොත්, නොසලකා හරින ලද වෙනස්කම් නොමැතිව ඔවුන්ගේ පසුකාලීන වෙනස්කම් ගෙන එනු ඇත.
මයික් බීටන්

1
Ike මයික් බීටන් ස්තූතියි. වැඩි දෘශ්‍යතාවයක් සඳහා මම ඔබේ අදහස පිළිතුරට ඇතුළත් කර ඇත්තෙමි.
VonC

5

ශුද්ධාසනයේ ජූනි Hamano ගේ පුළුල් ලෙස සඳහන් පිළිතුර : ඔයා තමයි යන්තම් අනාචාරයේ ඉවතලන්න, කැප අන්තර්ගතයට ඉවත යන්නේ, හෝ ඕනෑම අනුපාතයකින් ප්රධාන ඉතිහාසයේ එය ඉවත් කර තබා නම්. අනාගත කියවීමේදී සෑම කෙනෙකුම කරදර කිරීමට හේතුව කුමක්ද?

නමුත් සමහර විට පරිපාලන අවශ්‍යතා හෝ සමහර විට වෙනත් හේතුවක් තිබේ. කිසිවක් දායක නොවන කොමිස් වාර්තා කිරීමට ඔබට ඇත්ත වශයෙන්ම අවශ්‍ය වන අවස්ථා සඳහා, ඔබට අවශ්‍ය වන්නේ:

(සංස්කරණය කරන්න: වාව්, මම මීට පෙර මෙය වැරදියට තේරුම් ගත්තාද? මෙය ක්‍රියාත්මක වේ.)

git update-ref HEAD $(
        git commit-tree -m 'completely superseding with branchB content' \
                        -p HEAD -p branchB    branchB:
)
git reset --hard

3

මෙය git ජලනල විධාන කියවීමේ-ගස භාවිතා කරයි, නමුත් කෙටි සමස්ත කාර්ය ප්‍රවාහයක් ඇති කරයි.

git checkout <base-branch>

git merge --no-commit -s ours <their-branch>
git read-tree -u --reset <their-branch>
git commit

# Check your work!
git diff <their-branch>

1

මෙම පිළිතුර ලබා දුන්නේ පෝල් ප්ලැඩිජ් විසිනි. මම ඔහුගේ විධානයන් රැගෙන පහසුව සඳහා git අන්වර්ථයක් සෑදුවෙමි.

ඔබගේ .gitconfig සංස්කරණය කර පහත සඳහන් දෑ එක් කරන්න:

[alias]
    mergetheirs = "!git merge -s ours \"$1\" && git branch temp_THEIRS && git reset --hard \"$1\" && git reset --soft temp_THEIRS && git commit --amend && git branch -D temp_THEIRS"

එවිට ඔබට ධාවනය කිරීමෙන් "git merge -s theirs A" කළ හැකිය:

git checkout B (optional, just making sure we're on branch B)
git mergetheirs A

0

මෙය ඔබගේ නව ශාඛාව පවත්නා බේස් බ්‍රාන්ච් සමඟ ඒකාබද්ධ කරනු ඇත

git checkout <baseBranch> // this will checkout baseBranch
git merge -s ours <newBranch> // this will simple merge newBranch in baseBranch
git rm -rf . // this will remove all non references files from baseBranch (deleted in newBranch)
git checkout newBranch -- . //this will replace all conflicted files in baseBranch

git commit --amendඔබගේ උදාහරණයේ අවසානයට එකතු කිරීමට මම යෝජනා කරමි , නැතහොත් පරිශීලකයින් ඒකාබද්ධ කිරීම දැක බලා git logමෙහෙයුම සම්පුර්ණ යැයි උපකල්පනය කරයි.
මයිකල් ආර්

0

මම හිතන්නේ ඔබට සැබවින්ම අවශ්‍ය වන්නේ:

git checkout -B mergeBranch branchB
git merge -s ours branchA
git checkout branchA
git merge mergeBranch
git branch -D mergeBranch

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


0

'ඔවුන්ගේ ශාඛාව ඒකාබද්ධ කිරීම' සඳහා සමාන (මව් පිළිවෙල තබා ගන්නා)

ඒකාබද්ධ කිරීමට පෙර:රූප විස්තරය මෙහි ඇතුළත් කරන්න

!!! ඔබ පිරිසිදු තත්වයේ සිටින බවට වග බලා ගන්න !!!

ඒකාබද්ධ කිරීම කරන්න:

git commit-tree -m "take theirs" -p HEAD -p branchB 'branchB^{tree}'
git reset --hard 36daf519952 # is the output of the prev command

අපි මොනවද කළේ? අපි නව බැඳීමක් ඇති කළ අතර එය දෙමව්පියන් දෙදෙනෙකුගේ සහ ඔවුන්ගේ දෙමාපියන් වන අතර බැඳීමේ පරමාර්ථය ශාඛා බී - ඔවුන්ගේ ය

ඒකාබද්ධ කිරීමෙන් පසු:රූප විස්තරය මෙහි ඇතුළත් කරන්න

වඩාත් නිවැරදිව:

git commit-tree -m "take theirs" -p HEAD -p 'SOURCE^{commit}' 'SOURCE^{tree}'

-1

පොදු ඉතිහාසයක් ඇති වෙනම ගබඩාවන් දෙකක් සඳහා මෙය කිරීමට මට මෑතකදී අවශ්‍ය විය. මම ආරම්භ කළේ:

  • Org/repository1 master
  • Org/repository2 master

මට අවශ්‍ය සියලුම වෙනස්කම් repository2 masterrepository1 masterගබඩාවේ 2 විසින් සිදු කරනු ලබන සියලු වෙනස්කම් පිළිගෙන, සියලු වෙනස්කම් අදාළ කර ගැනීමට . Git හි වචන වලට අනුව, මෙය නොපවතින නමුත් එය නොපවතින උපාය මාර්ගයක් විය යුතුය -s theirs. ප්‍රවේශම් වන්න, මන්ද -X theirsඑය ඔබට අවශ්‍ය ආකාරයටම නම් කර ඇති නමුත් එය එසේ නොවේ (එය මෑන් පිටුවේ පවා එසේ කියයි).

මම මෙය විසඳූ ආකාරය වූයේ repository2නව ශාඛාවක් වෙත යාමයි repo1-merge. ඒ ශාඛාවේ මම දිව්වාgit pull git@gitlab.com:Org/repository1 -s ours අතර එය කිසිදු ගැටළුවක් නොමැතිව හොඳින් ඒකාබද්ධ වේ. මම එය දුරස්ථයට තල්ලු කරමි.

ඊට පස්සේ මම ආපහු ගිහින් repository1අලුත් ශාඛාවක් හදනවා repo2-merge. එම ශාඛාව තුළ, මම දුවන්නේ git pull git@gitlab.com:Org/repository2 repo1-mergeඑය ගැටළු සමඟ සම්පූර්ණ වනු ඇත.

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


-2

සරල හා බුද්ධිමත් (මගේ මතය අනුව) එය කිරීමේ පියවර දෙකකි

git checkout branchB .
git commit -m "Picked up the content from branchB"

අනුගත

git merge -s ours branchB

(එමඟින් ශාඛා දෙක ඒකාබද්ධ වූ බව සලකුණු කරයි)

එකම අවාසිය නම් එය ඔබේ වර්තමාන ශාඛාවෙන් ශාඛා බී හි මකාදැමූ ගොනු ඉවත් නොකිරීමයි. ශාඛා දෙක අතර සරල වෙනසක් පසුව එවැනි ලිපිගොනු තිබේදැයි පෙන්වයි.

මෙම ප්‍රවේශය පසුව සිදු කළ දේ සහ අපේක්ෂිත දේ සංශෝධන ලොගයෙන් පැහැදිලි කරයි.


මුල් ප්‍රශ්නයට මෙය නිවැරදි විය හැකිය, කෙසේ වෙතත් OP විසින් 2008 දී ප්‍රශ්නය යාවත්කාලීන කරන ලද්දේ මෙම පිළිතුර වැරදිය.
user3338098

1
@ user3338098 ඔව්, ඔවුන් නොමඟ යවා මාතෘකාව අතහැර පමණක් දී එසේ දෘශ්යමාන නොවන යාවත්කාලීන අතුල් පහරක් බව එවැනි අනුකම්පා අවසන් .... ප්රශ්නය ශරීරයේ මෙම පිළිතුරු නිසා කරන්නේ නිවැරදිව මාතෘකාව ප්රශ්නය පිළිතුර.
රොමේන් වලරි

@RomainValeri
AppleCiderGuy
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.