Git තල්ලු කිරීම නිසි ලෙස බල කරන්නේ කෙසේද?


1291

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

දැන්, මට දුරස්ථ ගබඩාවේ යමක් වෙනස් කිරීමට සිදු විය. ඊට පස්සේ මම මගේ දේශීය ගබඩාවේ යමක් වෙනස් කළා. දුරස්ථ ගබඩාව වෙනස් කිරීම අවශ්‍ය නොවන බව මට වැටහුණි. ඒ නිසා මම git pushමගේ දේශීය රෙපෝ සිට මගේ දුරස්ථ රෙපෝ වෙත උත්සාහ කළෙමි, නමුත් මට මෙවැනි දෝෂයක් ඇතිවිය:

ඉතිහාසය නැතිවීම වලක්වා ගැනීම සඳහා, වේගයෙන් ඉදිරියට නොයන යාවත්කාලීන කිරීම් ප්‍රතික්ෂේප කරන ලදි දුරස්ථ වෙනස්කම් නැවත තල්ලු කිරීමට පෙර ඒකාබද්ධ කරන්න. වැඩි විස්තර සඳහා 'වේගවත් ඉදිරියට යාම පිළිබඳ සටහන' කොටස git push --helpබලන්න.

මම හිතුවේ එය බොහෝ විට අ

git push --force

මගේ දේශීය පිටපත දුරස්ථ එකට වෙනස්කම් තල්ලු කර එය එකම කිරීමට බල කරයි. එය යාවත්කාලීනයට බල කරයි , නමුත් මම නැවත දුරස්ථ repo වෙත ගොස් කැපවීමක් කරන විට, ලිපිගොනු වල යල් පැන ගිය වෙනස්කම් (ප්‍රධාන දුරස්ථ ගබඩාව කලින් තිබූ ඒවා) අඩංගු බව මම දනිමි.

එක් පිළිතුරකට මා අදහස් දැක්වීමේදී සඳහන් කළ පරිදි :

[මම] බල කිරීමට උත්සාහ කළෙමි, නමුත් වෙනස්කම් සුරැකීම සඳහා මාස්ටර් සේවාදායකය වෙත ආපසු යන විට, මම යල් පැන ගිය වේදිකා ගත කරමි. මේ අනුව, මම සිදු කරන විට නිධි සමාන නොවේ. මම නැවත git push භාවිතා කිරීමට උත්සාහ කරන විට, මට එම දෝෂයම ලැබේ.

මෙම ගැටළුව විසඳන්නේ කෙසේද?


4
ඔබට ඉක්මනින්ම (git1.8.5, Q4 2013) කිරීමට හැකි වනු ඇත කිසිවක් කරන්න git push -forceවැඩි ප්රවේශමෙන් .
VonC


6
මගේ පිළිතුර මම විස්තර ලෙස , git push --forceවලංගු බලය තල්ලු කිරීමට තවත් ක්රමයක් නියත වශයෙන්ම එය, මෙන්ම මෙන් ශාඛා තල්ලු කරනු ඇත git push origin master --forceGit පෙරනිමි සමග push.default config settingsශාඛා විශේෂයෙන් 2.0 පසු එදිරිව 2.0 පෙර Git අනුවාද අතර මෙයින් වෙනස් තල්ලු වෙන්න ඇති නමුත්,.

2
git push --forceමේ දිනවල හොඳින් ක්‍රියාත්මක වේ,
FWIW

git push --force-with-leaseඊටත් වඩා හොඳින් ක්‍රියා කරයි :), එය ඔබ අපේක්ෂා කරන තත්වය නොවන්නේ නම් ශාඛාවක් යාවත්කාලීන කිරීම ප්‍රතික්ෂේප කරනු ඇත. (බලන්න developer.atlassian.com/blog/2015/04/force-with-lease )
spoorcc

Answers:


2346

කරන්න:

git push origin <your_branch_name> --force

හෝ ඔබට නිශ්චිත repo එකක් තිබේ නම්:

git push https://git.... --force

මෙය ඔබගේ පෙර බැඳීම් (ය) මකා දමා ඔබගේ වර්තමාන එක තල්ලු කරයි.

එය නුසුදුසු විය හැකිය, නමුත් යමෙකු මෙම පිටුවට පැකිලෙන්නේ නම්, ඔවුන්ට සරල විසඳුමක් අවශ්‍ය යැයි සිතුවා ...

කෙටි ධජය

-fසඳහා කෙටි බව ද සටහන් --forceකරන්න

git push origin <your_branch_name> -f

එසේම ක්‍රියාත්මක වනු ඇත.


59
ඔබට git push origin +masterඒ වෙනුවට භාවිතා කළ හැකිය , එමඟින් ඔබට සියලු බලහත්කාරයෙන් තොරව බහු රීපෙක්ස් තල්ලු කිරීමට ඉඩ ලබා දේ.
nickgrim

5
ඔබ අහම්බෙන් පමණක් එසේ කළහොත්, git push --forceඔබ ප්‍රධාන ශාඛාව අවුල් කිරීම අවසන් කළ හැකි බව මතක තබා ගන්න (ඔබේ තල්ලු පෙරනිමි හැසිරීම අනුව) .. එය ටිකක් උරා
බොන්නට

9
Ie ජිව්ස් Git අනුවාදය 2.0 සමඟ ආරම්භ වන අතර, පෙරනිමි හැසිරීම git push --forceමූලික වශයෙන් දැනට පරීක්ෂා කර ඇති ශාඛාව එහි දුරස්ථ කවුන්ටරයට තල්ලු කිරීමට බල කිරීමයි, එබැවින් ඔබ ප්‍රධාන ශාඛාව පරීක්ෂා කර ඇත්නම් එය සමාන වේ git push origin master --force. 2.0 සඳහා පෙර Git අනුවාද සඳහා පෙරනිමිය වන ඔබ matchingසැකසුම භාවිතා කරන්නේ නම් එය වෙනස් push.defaultවේ. සියලුම දේශීය ශාඛා එකම නමක් ඇති දුරස්ථ ස්ථාන වෙත matchingතල්ලු කරයි , එබැවින් බලෙන් තල්ලු කිරීම අනිවාර්යයෙන්ම ඔබට කිරීමට අවශ්‍ය දේ නොවිය හැකිය ...

@ ජිව්ස් නමුත් Git 2.0 සමඟ පෙරනිමිය ආරක්ෂිතයි, නැතහොත් අවම වශයෙන් එය වඩා භයානක නොවේ git push origin master --force.

2
push -f හොඳයි, නමුත් බොහෝ ආයතනික ගබඩාවල -f අක්‍රීය කර ඇති බැවින් මාස්ටර් සඳහා නැවත නිර්දේශ නොකෙරේ. මෙම merge -s oursමා වෙනුවෙන් වැඩ
mihai

248

push --forceවැඩ නොකරන්නේ නම් ඔබට කළ හැකිය push --delete. 2 පෙනුම වන මෙම අවස්ථාවේ මත තියාගන්න:

git reset --hard HEAD~3  # reset current branch to 3 commits ago
git push origin master --delete  # do a very very bad bad thing
git push origin master  # regular push

නමුත් පරෙස්සම් වන්න ...

කිසි විටෙකත් පොදු ගිටාර් ඉතිහාසයකට ආපසු නොයන්න!

වෙනත් විදිහකින්:

  • කිසි විටෙකත් forceපොදු ගබඩාවකට තල්ලු නොකරන්න .
  • මෙය හෝ වෙනත් කෙනෙකුගේ බිඳ දැමිය හැකි කිසිවක් නොකරන්න pull.
  • කවදාවත් resetහෝ rewriteඉතිහාසයක් කවුරුහරි දැනටමත් ඇදගෙන ගොස් ඇති රෙපෝ එකක .

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

ඒ වෙනුවට ආපසු හැරවීමක් කරන්න.

ඔබ සැමවිටම පොදු ගබඩාවකට තල්ලු කරන දේ ගැන සැලකිලිමත් වන්න . ආපසු හැරවීම:

git revert -n HEAD~3..HEAD  # prepare a new commit reverting last 3 commits
git commit -m "sorry - revert last 3 commits because I was not careful"
git push origin master  # regular push

ඇත්ත වශයෙන්ම, මූලාරම්භයේ HEADs දෙකම ( ආපසු හැරවීමේ සිට සහ නපුරු යළි පිහිටුවීමේ සිට ) එකම ලිපිගොනු අඩංගු වේ.


යාවත්කාලීන තොරතුරු සහ තවත් තර්ක එකතු කිරීමට සංස්කරණය කරන්න push --force

තල්ලු කිරීම වෙනුවට කල්බදු බලයෙන් තල්ලු කිරීම සලකා බලන්න, නමුත් ආපසු හැරවීමට වැඩි කැමැත්තක් දක්වයි

push --forceඔබ විසින් කිරීමට පෙර යමෙකු යමක් තල්ලු කිරීම තවත් ගැටළුවක් විය හැකිය, නමුත් ඔබ දැනටමත් ලබා ගත් පසු. ඔබ ඔබේ බල තල්ලු නම් rebased අනුවාදය දැන් ඔබ ඇත අන් අය සිට වැඩ වෙනුවට .

git push --force-with-lease1.8.5 git හි හඳුන්වා දී ඇත ( ප්‍රශ්නය පිළිබඳ onVonC අදහස් දැක්වීමට ස්තූතියි ) මෙම විශේෂිත ගැටළුව විසඳීමට උත්සාහ කරයි. මූලික වශයෙන්, එය දෝෂයක් ගෙන එනු ඇති අතර ඔබගේ නවතම ලබාගැනීමෙන් පසු දුරස්ථය වෙනස් කර ඇත්නම් එය තල්ලු නොවේ.

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

අපි git --pushසිදුවීම් ගැන කතා කරන නිසා ...

බල කිරීමට කිසිවෙකුට අවශ්‍ය ඇයි?

@linquize අදහස් සඳහා හොඳ තල්ලු බල උදාහරණයක් ගෙන ආවා: සංවේදී දත්ත . ඔබ තල්ලු නොකළ යුතු දත්ත වැරදියට කාන්දු වී ඇත. ඔබ ප්‍රමාණවත් තරම් වේගවත් නම්, ඉහළට තල්ලු කිරීමෙන් ඔබට එය "නිවැරදි" කළ හැකිය *.

*මෙම දත්ත තවමත් දුරස්ථ වනු ඇත ඔබ ද කරන්න නම් එකතු කුණු , හෝ කෙසේ හෝ එය පිරිසිදු . කියලා තවත් අය එය පැතිර වීමට පැහැදිලි විය හැකි ද ඇත ඉහළම අගය දැනටමත් එය, එහෙත් ඔබ අදහස ලබා.


1
ගැටළුව, @rogerdpack, එය කළ හැකි නම් නොවේ. එය. නමුත් එය විශාල ව්‍යසනයකට එකතු විය හැකිය. කවුරුහරි එය කරන තරමට (බල තල්ලු කිරීම) සහ ඔබ මහජන ගබඩාවෙන් යාවත්කාලීන වන විට (අදින්න), ව්‍යසනය විශාල වේ. ඔබ දන්නා පරිදි එයට ලෝකය විසුරුවා හැරිය හැකිය !!! 111 අවම වශයෙන් එම විශේෂිත ගබඩාවෙන් සමන්විත ලෝකය.
cregox

3
ඔබට සංවේදී දත්ත තිබේ නම්, එය තල්ලු කරන්න
ලින්ක් කරන්න

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

3
git push origin master --delete # do a very very bad bad thing git push origin master # regular pushමෙය ඇත්ත වශයෙන්ම මගේ ගැටලුව මනාව විසඳීය (මා සහ මගේ මිතුරා සමඟ පමණක් ඇති රිපෝ එකක). සමහර විට එය මහජන ගබඩාවලට වැරදියි නමුත් පුද්ගලික එකක් සඳහා මෙය ජීවිතාරක්ෂකයෙකි.
Can Poyrazoğlu

1
සමහර රෙපෝ කළමණාකරුවන්, ස්වයංක්‍රීය ස්කොෂ් යනාදිය සමඟ මෙය ස්වයංක්‍රීයව සිදු වේ. කොමිස් අඩු කිරීම සඳහා විශේෂාංග ශාඛාවක් නිම කිරීමෙන් පසු තල්ලු කිරීම පොදු සහ අපේක්ෂා කෙරේ.
ෆ්ලේවර්ස්කේප්

18

පළමුවෙන්ම, මම "ප්රධාන" repo හි සෘජුවම කිසිදු වෙනසක් නොකරමි. ඔබට සැබවින්ම "ප්‍රධාන" repo එකක් ලබා ගැනීමට අවශ්‍ය නම්, ඔබ එය වෙතට පමණක් තල්ලු කළ යුතුය, එය කෙලින්ම වෙනස් නොකරන්න.

ඔබට ලැබෙන දෝෂය සම්බන්ධයෙන්, ඔබ git pullඔබේ දේශීය ගබඩාවෙන් උත්සාහ කර, පසුව git pushප්‍රධාන ගබඩාවට ගොස් තිබේද? ඔබ දැනට කරමින් සිටින්නේ (මම එය හොඳින් වටහා ගත්තා නම්) තල්ලු කිරීමට බල කිරීම සහ "ප්‍රධාන" ගබඩාවේ ඔබගේ වෙනස්කම් නැතිවීම ය. ඔබ පළමුව වෙනස්කම් දේශීයව ඒකාබද්ධ කළ යුතුය.


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

1
එවැනි අවස්ථාවක භාවිතා කරන්න git push -f, නමුත් ඔබ නැවත ඔබේ ප්‍රධාන ගබඩාව වෙනස් කරන්නේ නම්, ඔබට නැවත ඔබේ දේශීය ගබඩාව වෙත යා යුතු git pullඅතර එමඟින් නවතම වෙනස්කම් සමඟ සමපාත වේ. එවිට ඔබට ඔබේ වැඩ කටයුතු කළ හැකි අතර නැවත තල්ලු කරන්න. ඔබ මෙම "තල්ලු-අදින්න" කාර්ය ප්‍රවාහය අනුගමනය කරන්නේ නම්, ඔබ පැමිණිලි කළ ආකාරයේ දෝෂයක් ඔබට නොලැබෙනු ඇත.
ubik

/ මම උත්සාහ අතර කියවනවා කියවනවා ටිකක් නැවත ලැබෙනු ඇත: ඔව්, මම මේ මගේ වරදක් බව තේරුම්
Spyros

1
බල කිරීමට උත්සාහ කළ නමුත් වෙනස්කම් සුරැකීම සඳහා මාස්ටර් සේවාදායකය වෙත ආපසු යන විට, මම යල් පැන ගිය වේදිකා ගත කරමි. මේ අනුව, මම සිදු කරන විට නිධි සමාන නොවේ. මම නැවත git push භාවිතා කිරීමට උත්සාහ කරන විට, මට එම දෝෂයම ලැබේ.
ස්පිරෝස්

17

මම මගේ දේශීය ශාඛාව A හි සිටී නම්, සහ ප්‍රාදේශීය ශාඛාව B මූලාරම්භක ශාඛාවට තල්ලු කිරීමට මට අවශ්‍ය නම් CI හට පහත සඳහන් වාක්‍ය ඛණ්ඩය භාවිතා කළ හැකිය:

git push --force origin B:C

2
මම මගේ ප්‍රාදේශීය ශාඛාව වන බී හි සිටියත්, මම තවමත් කළ යුතු බව දැන ගතිමි git push --force origin B:C. මගේ නඩුවේදී, එය git push --force origin Cදැනට මා සිටින්නේ කුමන ශාඛාව නොසලකා දේශීය මාස්ටර්ගේ සිට දුරස්ථ සී ශාඛාවට පමණක් තල්ලු වන බව පෙනේ . git version 2.3.8 (Apple Git-58)
වයිෂි සෙන්ග්

12

මෙම විධානය භාවිතා කරන්න:

git push -f origin master

2
සමහර විට මෙම පිළිතුර අනෙක් ඒවාට වඩා සුදුසු වන්නේ ඇයි සහ එය වෙනස් වන්නේ කුමක් ද යන්න පිළිබඳ තවත් පැහැදිලි කිරීමක් දෙන්න.
ඇඩම්

ඔහ්, අපහසුතාවයට කණගාටුයි, මට එකම ගැටලුවක් ඇති අතර මෙම විධානය එය විසඳයි, මම එය බෙදා ගත යුතු යැයි සිතුවෙමි.
මුස්තාපා එල්සයිඩ්

12
එය අනෙක් ඒවාට සමාන ය, ඔබ -fධජයේ පිහිටීම වෙනස් කර ඇත ...
svelandiag

11

මම ඇත්තටම නිර්දේශ කරන්නේ:

  • ප්‍රධාන ගබඩාවට පමණක් තල්ලු කරන්න

  • ප්‍රධාන repo වැඩ කරන ගස එහි පදනම සමඟ සමපාත නොවීම පිළිබඳව කිසි විටෙකත් ගැටළුවක් ඇති නොවන පරිදි ප්‍රධාන repo යනු හිස් repo එකක් බවට වග බලා ගන්න .git. " දේශීය git ගබඩාවක් වෙනත් පරිගණකයකට තල්ලු කරන්නේ කෙසේද? " බලන්න.

  • ඔබට ප්‍රධාන (හිස්) repo හි වෙනස් කිරීම් කිරීමට අවශ්‍ය නම්, එය ක්ලෝන කරන්න (ප්‍රධාන සේවාදායකයේ), ඔබේ වෙනස් කිරීම සිදු කර නැවත එය වෙතට තල්ලු කරන්න

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


5

ඉතිහාසය පවත්වා ගෙන යන අතරම ආයතනික gitHub ගබඩාවක මාස්ටර් වෙනුවට ආදේශ කිරීම සඳහා මෙය අපගේ විසඳුම විය.

push -fශාඛා ඉතිහාසය පවත්වා ගැනීම සඳහා ආයතනික ගබඩාවල ප්‍රගුණ කිරීම බොහෝ විට අක්‍රීය කර ඇත. මෙම විසඳුම අප වෙනුවෙන් වැඩ කළා.

git fetch desiredOrigin
git checkout -b master desiredOrigin/master // get origin master

git checkout currentBranch  // move to target branch
git merge -s ours master  // merge using ours over master
// vim will open for the commit message
git checkout master  // move to master
git merge currentBranch  // merge resolved changes into master

ඔබේ ශාඛාව තල්ලු desiredOriginකර PR එකක් සාදන්න


3

මට එකම ප්‍රශ්නය තිබුනද අවසානයේ එය හදුනා ගත්තේය. ඔබ බොහෝ විට කළ යුත්තේ පහත දැක්වෙන git විධාන දෙක ක්‍රියාත්මක කිරීමයි (හැෂ් වෙනුවට git commit revision number):

git checkout <hash>
git push -f HEAD:master
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.