වත්මන් Git ශාඛාව ප්‍රධාන ශාඛාවක් බවට පත් කරන්න


1677

මට Git හි ගබඩාවක් තිබේ. මම ශාඛාවක් හැදුවා, පසුව ස්වාමියාට සහ ශාඛාවට යම් යම් වෙනස්කම් කළා.

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

මට එය ඒකාබද්ධ කළ නොහැක, මන්ද වෙනස්කම් මාස්ටර් මත තබා ගැනීමට මට අවශ්‍ය නැත. මම කළ යුත්තේ කුමක් ද?

අමතර : මේ අවස්ථාවේ දී, 'පැරණි' මාස්ටර් දැනටමත් pushGitHub වැනි වෙනත් ගබඩාවකට යවා ඇත . මෙය දේවල් වෙනස් කරන්නේ කෙසේද?


2
සමාන ප්‍රශ්න වලට පිළිතුරු පරීක්ෂා කරන්න stackoverflow.com/q/2862590/151641
mloskot

4
කෙසේ වෙතත්, එකම ගැටලුවක් තිබුනේ නම්, මම හුදෙක් ස්වාමියා ඉවත් කර වෙනත් ශාඛාවක් මාස්ටර් ලෙස නම් කළෙමි: stackoverflow.com/a/14518201/189673
jayarjo

10
ayjayarjo ඔබට හැකි නම් මෙය වළක්වා ගත යුත්තේ එය ඉතිහාසය නැවත ලිවීමට හා අනෙක් සියල්ලන්ටම ඊළඟට ස්වාමියා ඇද ගැනීමට උත්සාහ කරන විට ගැටලු ඇති කිරීමට හේතුවෙනි.
joelittlejohn

3
ජෙෆ්රොමිගේ පිළිතුරට මා ආදරය කරන්නේ මේ නිසා ය. ලේඛනාගාරයේ ඉතිහාසය නැවත සකස් කිරීමක් සිදු නොවේ.
froggythefrog

Answers:


2157

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

git checkout better_branch
git merge --strategy=ours master    # keep the content of this branch, but record a merge
git checkout master
git merge better_branch             # fast-forward master up to the merge

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

git merge --strategy=ours --no-commit master
git commit          # add information to the template merge message

26
Git හි ඒකාබද්ධ කිරීමේ "උපාය මාර්ග" පිළිබඳ සටහන: --strategy=oursඊට වඩා වෙනස් ය --strategy=recursive -Xours. එනම් "අපේ" යනු තමා තුළම උපාය මාර්ගයක් විය හැකිය (ප්‍රති result ලය කුමක් වුවත් වර්තමාන ශාඛාව වනු ඇත), හෝ "පුනරාවර්තන" උපාය මාර්ගයට විකල්පයක් ලෙස සම්මත කර ඇත (වෙනත් ශාඛාවේ වෙනස්කම් ගෙන ඒම සහ ගැටුමක් ඇති විට වත්මන් ශාඛාවේ වෙනස්කම් ස්වයංක්‍රීයව කැමති වේ. ).
කෙල්වින්

6
එය ක්‍රියාත්මක වීමට මට දෙවන පේළිය සෑදීමට සිදු git merge --strategy=ours master -m "new master"විය.
incandescentman

5
@ ජොහ්ස්ම් හරියටම මගේ පිළිතුරේ පළමු වාක්‍යය ගැන කතා කරන්නේ එයයි. ඔබ එය කරන්නේ නම්, නව ස්වාමියාට පැරණි ස්වාමියාට සමාන ඉතිහාසයක් නොතිබෙනු ඇත, ඔබට තල්ලු කිරීමට / අදින්නට අවශ්‍ය නම් එය ඉතා නරක ය. එය නිවැරදිව වැඩ කිරීම සඳහා ඔබ පරම්පරාව බෙදාගෙන තිබිය යුතුය; ඒ වෙනුවට ඔබ කියන දේ කරන්නේ නම්, ඔබ එය තල්ලු කිරීමට උත්සාහ කරන විට ඔබ එය බල නොකරන්නේ නම් එය අසාර්ථක වනු ඇත (මෙය නරක නිසා එය ඔබව නැවැත්වීමට උත්සාහ කරයි), සහ ඔබ එය බල කරන්නේ නම්, පසුව ඇද ගන්නා ඕනෑම අයෙක් පැරණි මාස්ටර් සහ නව මාස්ටර් ඒකාබද්ධ කිරීමට උත්සාහ කරනු ඇත, එය බොහෝ විට දුම්රිය සුන්බුන් වනු ඇත.
කැස්කබෙල්

4
ඒකාබද්ධ කිරීමේදී vi සංස්කාරකය දිස්වන්නේ නම්, ටයිප් කරන්න: w (සුරැකීම සඳහා): q (vi වෙතින් පිටවීම සඳහා)
ටොමාස් කුබ්ස්

9
මෙම පිළිතුර විශිෂ්ටයි. මට අවශ්‍ය වූයේ (නව හෝ සැක සහිත පුද්ගලයන් සඳහා) git pushඔබේ කේතය දුරස්ථව තල්ලු කිරීමට අවශ්‍ය නම් ඔබට මෙයින් පසුව නිවැරදිව කළ යුතු බවයි. Your branch is ahead of 'origin/master' by 50 commits.මෙය අපේක්ෂා කරන වැනි අනතුරු ඇඟවීමක් ඔබට පෙනෙනු ඇත . එය තල්ලු කරන්න! : ඩී
චැපල්ජුයිස්

399

සෑම දෙයක්ම ඔබගේ දුරස්ථ ගබඩාවට (GitHub) තල්ලු කර ඇති බවට වග බලා ගන්න:

git checkout master

"වඩා හොඳ_ ශාඛාව" සමඟ "මාස්ටර්" නැවත ලියන්න:

git reset --hard better_branch

ඔබගේ දුරස්ථ ගබඩාවට තල්ලු කිරීමට බල කරන්න:

git push -f origin master

82
බොහෝ දෙනා සොයන පිළිතුර මෙය විය හැකිය. BS උපාය ඒකාබද්ධය සමඟ ඇති අනෙක් සියලුම පිළිතුරු ශාඛාව මුළුමනින්ම ප්‍රතිස්ථාපනය නොකරයි. මෙය සෑම දෙයක්ම මට අවශ්‍ය ආකාරයටම සාදා, ශාඛාව නැවත ලිවීම හා එය බලෙන් තල්ලු කිරීම.
ගුබට්‍රොන්

32
ඇත්ත වශයෙන්ම මෙය බොහෝ දෙනා සොයන දෙයක් වුවද, රෙපෝ හි වෙනත් දේශීය පිටපත් git reset --hard origin/masterඊළඟ වතාවට අදින්නට අවශ්‍ය වන බව සැලකිල්ලට ගත යුතුය , එසේ නොමැතිනම් git විසින් ඔවුන්ගේ (දැන්) අපසාරී දේශීයයට වෙනස්කම් ඒකාබද්ධ කිරීමට උත්සාහ කරනු ඇත. මෙහි ඇති අන්තරායන් මෙම පිළිතුරෙන්
7yl4r

3
නිධිය වෙත තල්ලු කිරීමට ඔබට අවසර දිය යුතු බව කරුණාවෙන් සලකන්න - උදා: ව්‍යාපාරික පරිසරයක මෙය ක්‍රියාත්මක නොවනු ඇත
inetphantom

2
මෙහි උඩු යටිකුරු කිරීම මිනිසුන්ට අවශ්‍ය දේ අනුව අවාසියක් විය හැකිය. මාස්ටර්ගේ ඉතිහාසය අනෙක් ශාඛාවේ ඉතිහාසය සමඟ ප්‍රතිස්ථාපනය කිරීමට ඔබට අවශ්‍ය නම්, මෙය ඔබේ පිළිතුරයි.
b15

මගේ නව ශාඛාව මාස්ටර් කැපවීමෙන් වූ බැවින් මම සොයන පිළිතුර මෙයයි. පෙර ස්වාමියාගේ ඕනෑම ශාඛාවකට ඒකාබද්ධ වීමේ ගැටළු ඇති නොවීම මෙය පහසු කරයි.
ස්ටැන්ලි ඔක්පාල නවෝසා

76

සංස්කරණය කරන්න: ඔබ ප්‍රසිද්ධ ගබඩාවකට තල්ලු කළ බව ඔබ කීවේ නැත! එය වෙනස් ලෝකයක් කරයි.

ක්‍රම දෙකක් තිබේ, "අපිරිසිදු" මාර්ගය සහ "පිරිසිදු" මාර්ගය. ඔබේ ශාඛාව නම් කර ඇතැයි සිතමු new-master. පිරිසිදු ක්‍රමය මෙයයි:

git checkout new-master
git branch -m master old-master
git branch -m new-master master
# And don't do this part.  Just don't.  But if you want to...
# git branch -d --force old-master

මෙය නැවත නම් කරන ලද ශාඛාවන්ට ගැලපෙන පරිදි වින්‍යාස ගොනු වෙනස් කරයි.

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

mv -i .git/refs/new-master .git/refs/master
git checkout master

2
ඔබට ස්තුතියි. තව එක ප්රශ්නයක්. මම එය ගිතුබ් වෙත තල්ලු කරමි. මම මෙය කළහොත් එහි කුමක් සිදුවේද?
කරල් බොලෙක්

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

6
Iet ඩියෙට්‍රික් එප්: අපිරිසිදු ක්‍රමය යෝජනා කිරීම හොඳ අදහසක් දැයි මට විශ්වාස නැත. එය දුරස්ථ ලුහුබැඳීම් අවුල් කරයි, ප්‍රතිවර්තනයන් ... ඔබ එය කවදා හෝ කරාවි යැයි සිතිය නොහැක.
කැස්කබෙල්

2
අහ්, ඒක හොඳ කාරණයක්. ඔබට එය දෙයාකාරයෙන්ම තිබිය හැකිය : git branch old-master master; git branch -f master new-master. උපස්ථ ශාඛාව නැවුම් ලෙස සාදන්න, පසුව කෙලින්ම මාස්ටර් නව මාස්ටර් වෙත ගෙන යන්න. (ඔබේ නම වැරදියට
ලිවීම

2
AkeFakeName එය කිරීමට කිසිදු හේතුවක් නැතැයි මම නිගමනය නොකළෙමි, එය අපිරිසිදු ආකාරයෙන් කිරීමට හේතුවක් නැත . සාමාන්‍ය විධානයන් භාවිතයෙන් ඔබට එය කළ හැකිය (මගේ පෙර අදහස් දැක්වීමේදී මෙන්) එකම ප්‍රති result ලය ලබා ගත හැකිය. ඔබ ක්‍රියාත්මක කිරීමේ තොරතුරු සමඟ නොගැලපෙන බැවින් එය වැඩ කිරීමට සහතික වේ.
කැස්කබෙල්

46

ශාඛාව පහත පරිදි නම් කරන්න master:

git branch -M branch_name master

12
අවාසනාවකට, git ශාඛා නැවත නම් කිරීම නිරීක්ෂණය නොකරයි, එබැවින් ඔබ දැනටමත් ඔබේ ගබඩාව දුරස්ථ ස්ථානයකට තල්ලු කර ඇති අතර අනෙක් අයට ඔවුන්ගේ පැරණි පැරණි ශාඛාවේ දේශීය වෙනස්කම් තිබේ නම්, ඔවුන් කරදරයට පත්වනු ඇත.
සොෆ්ට්

මෙය සහ අතර වෙනසක් git checkout master&&git reset --hard better_branchතිබේද?
wotanii

26

මා තේරුම් ගත් දෙයින්, ඔබට වර්තමාන ශාඛාව පවතින ශාඛාවකට අතු බෙදිය හැකිය. සාරාංශයක් ලෙස, මෙය masterවත්මන් ශාඛාවේ ඇති ඕනෑම දෙයක් සමඟ නැවත ලියයි :

git branch -f master HEAD

ඔබ එය කළ පසු, ඔබට සාමාන්‍යයෙන් ඔබේ ප්‍රාදේශීය masterශාඛාව තල්ලු කළ හැකිය , සමහර විට මෙහි බල පරාමිතියද අවශ්‍ය වේ:

git push -f origin master

ඒකාබද්ධ කිරීම් නැත, දිගු විධානයන් නොමැත. සරලව branchහා push- එහෙත්, ඔව්, මෙම ඉතිහාසය නැවත ලිවිය ඇත පිළිබඳ masterඔබ දන්නවා ඔයා මොනවද කරන්නේ කියලා යොමු කර තිබෙනවා කණ්ඩායමක් වැඩ එසේ නම්, ශාඛා.




විකල්පයක් ලෙස, ඔබට ඕනෑම ශාඛාවක් ඕනෑම දුරස්ථ ශාඛාවකට තල්ලු කළ හැකි බව මට පෙනී ගියේය, එබැවින්:

# This will force push the current branch to the remote master
git push -f origin HEAD:master

# Switch current branch to master
git checkout master

# Reset the local master branch to what's on the remote
git reset --hard origin/master

ඉතා සරල හා පරිපූර්ණ ලෙස වැඩ! සරල හා පහසුවෙන් තේරුම් ගත හැකි git විධාන දෙකක්. මගේ git repo සුරකින ලද අතර දැන් එය සුපිරි පිරිසිදු බව පෙනේ. ස්තූතියි!
thehelix

16

බ්ලොග් පෝස්ට් එකෙන් මට අවශ්‍ය පිළිතුර හමු විය මාස්ටර් ශාඛාව වෙනත් ශාඛාවක් සමඟ ආදේශ කරන්න :

git checkout feature_branch
git merge -s ours --no-commit master
git commit      # Add a message regarding the replacement that you just did
git checkout master
git merge feature_branch

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

මේ ආකාරයෙන් සොයා ගැනීම පහසුය.

මම, නව පිළිතුරක් ලෙස මෙම එකතු මම පසුව මෙම විසඳුම අවශ්ය නම්, මම ඇති කිරීමට අවශ්ය නිසා කරනවා සියලු කේතය මම එක් කේතය වාරණ භාවිතා කිරීමට යනවා.

එසේ නැත්නම්, මම පිටපත්-paste හැක, එවිට මම වන රේඛාව බැලීමට පහත විස්තර කියවීමට යුතු වෙනස් වී ඇති - මම දැනටමත් එය ක්රියාත්මක පසු.


15

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

පරමාර්ථය: "ශාඛාවේ" වර්තමාන තත්වය "ස්වාමියා" බවට පත් කරන්න

ඔබේ දේශීය හා දුරස්ථ ගබඩාවන් යාවත්කාලීනව පවතින බව තහවුරු කර ගැනීම සඳහා ශාඛාවක වැඩ කිරීම, කැපවීම සහ තල්ලු කිරීම:

git checkout master      # Set local repository to master
git reset --hard branch  # Force working tree and index to branch
git push origin master    # Update remote repository

මෙයින් පසු, ඔබේ ස්වාමියා ඔබගේ අවසාන ශාඛාවේ නිශ්චිත තත්වය වන අතර ඔබේ ප්‍රධාන බැඳීම් ලොගය ශාඛාවේ සියලුම පිරික්සුම් පෙන්වනු ඇත.


14

මෙහි දී ඇති විසඳුම් (ශාඛාව 'මාස්ටර්' ලෙස නම් කිරීම) දුරස්ථ (GitHub) repo සඳහා වන ප්‍රතිවිපාක ගැන අවධාරනය නොකරයි:

    -f
    --force

සාමාන්‍යයෙන්, විධානය දුරස්ථ ref යාවත්කාලීන කිරීම ප්‍රතික්ෂේප කරයි, එය නැවත ලිවීමට භාවිතා කරන දේශීය ref හි මුතුන් මිත්තෙකු නොවේ. මෙම ධජය චෙක්පත අක්‍රීය කරයි. මෙය දුරස්ථ ගබඩාවට කොමිස් නැති වීමට හේතු විය හැක; එය ප්‍රවේශමෙන් භාවිතා කරන්න.

අනෙක් අය දැනටමත් ඔබේ නිධිය ඇදගෙන ඇත්නම්, ඔවුන්ගේම ස්වාමියා වෙනුවට එම නව GitHub ප්‍රධාන ශාඛාව (හෝ බොහෝ ඒකාබද්ධ කිරීම් සමඟ කටයුතු නොකර) වෙනුවට එම නව ප්‍රධාන ඉතිහාසය අදින්නට ඔවුන්ට නොහැකි වනු ඇත.
ඇත මහජන ප්රතිමිලදී සඳහා GIT තල්ලුව --force විකල්ප .
ජෙෆ්රෝමිගේ පිළිතුර (නිවැරදි වෙනස්කම් මුල් ස්වාමියා සමඟ නැවත ඒකාබද්ධ කිරීම) ඉන් එකකි.


10

කෙනෙකුට අනෙක් ශාඛාවේ සියලුම ලිපිගොනු මාස්ටර් බවට පරීක්ෂා කළ හැකිය:

git checkout master
git checkout better_branch -- .

ඉන්පසු සියලු වෙනස්කම් කරන්න.


5

ජෙෆ්රොමිගේ පිළිතුරට එකතු කිරීම සඳහා, sourceශාඛාවේ ඉතිහාසය තුළ අර්ථ විරහිත ඒකාබද්ධ කිරීමක් කිරීමට ඔබට අවශ්‍ය නැතිනම්, ඔබට ඒකාබද්ධ කිරීම සඳහා තාවකාලික ශාඛාවක් නිර්මාණය කළ හැකිය ours, පසුව එය ඉවතලන්න:

git checkout <source>
git checkout -b temp            # temporary branch for merge
git merge -s ours <target>      # create merge commit with contents of <source>
git checkout <target>           # fast forward <target> to merge commit
git merge temp                  # ...
git branch -d temp              # throw temporary branch away

ඒ අනුව ඒකාබද්ධ කිරීමේ බැඳීම පවතින්නේ targetශාඛාවේ ඉතිහාසය තුළ පමණි .

විකල්පයක් ලෙස, ඔබට කිසිසේත්ම ඒකාබද්ධ කිරීමක් කිරීමට අවශ්‍ය නැතිනම්, ඔබට එහි අන්තර්ගතය අල්ලාගෙන sourceනව කැපවීමක් සඳහා ඒවා භාවිතා කළ හැකිය target:

git checkout <source>                          # fill index with contents of <source>
git symbolic-ref HEAD <target>                 # tell git we're committing on <target>
git commit -m "Setting contents to <source>"   # make an ordinary commit with the contents of <source>

3

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

සංවර්ධනය වෙමින් පවතින අතරතුර:

git checkout master
git pull

git checkout develop
git pull

git reset --hard origin/master
git push -f

2

මගේ දේවල් කරන ආකාරය පහත දැක්වේ

#Backup branch
git checkout -b master_backup
git push origin master_backup
git checkout master
#Hard Reset master branch to the last common commit
git reset --hard e8c8597
#Merge
git merge develop

2

ඔබ භාවිතා කරන්නේ නම් eGit දී එක්ලිප්ස් :

  • ව්‍යාපෘති නෝඩය මත දකුණු ක්ලික් කරන්න.
  • තෝරා කණ්ඩායම → පසුව උසස් → පසුව නැවත නම් කරන්න ශාඛා
  • ඉන්පසු දුරස්ථ ලුහුබැඳීමේ ෆෝල්ඩරය පුළුල් කරන්න .
  • වැරදි නමක් ඇති ශාඛාව තෝරන්න, පසුව නම් කරන්න බොත්තම ක්ලික් කරන්න, එය නව නමට නැවත නම් කරන්න.
  • නව ස්වාමියා තෝරන්න, පසුව එය ප්‍රධාන ලෙස නම් කරන්න.

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

0

පහත දැක්වෙන පියවර ඇට්ලේෂියන් (බිට්බකට් සේවාදායකය) විසින් බල ගැන්වෙන Git බ්‍රව්සරයේ සිදු කරයි.

{වත්මන් ශාඛාව} ලෙස සෑදීම master

  1. ශාඛාවක් සාදා masterඑයට “ප්‍රධාන අනුපිටපත” ලෙස නම් කරන්න.
  2. {වත්මන් ශාඛාවෙන්} ශාඛාවක් සාදා එයට “{වත්මන් ශාඛාව cop -කොපි” ලෙස නම් කරන්න.
  3. නිධිය සැකසීමේදී (බිට්බකට්) “පෙරනිමි ශාඛාව” “ප්‍රධාන අනුපිටපත” වෙත යොමු කරන්න (මෙම පියවර නොමැතිව ඔබට ස්වාමියා මකා දැමීමට නොහැකි වනු ඇත - “ඊළඟ පියවරේදී”).
  4. “ප්‍රධාන” ශාඛාව මකන්න - මම මෙම පියවර කළේ ප්‍රභව ගසෙනි (ඔබට එය CLI හෝ Git බ්‍රව්සරයෙන් කළ හැකිය)
  5. “{වත්මන් ශාඛාව}” “ස්වාමියා” ලෙස නම් කර ගබඩාවට තල්ලු කරන්න (මෙය නව “ප්‍රධාන” ශාඛාවක් නිර්මාණය කරනු ඇත, තවමත් “{වත්මන් ශාඛාව” පවතිනු ඇත).
  6. නිධිය සැකසීම් වලදී, “පෙරනිමි ශාඛාව” “මාස්ටර්” වෙත යොමු කරන්න.
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.