මම Git භාවිතා කරන අතර මම ගොනු කිහිපයක් භාවිතා කර ඇත
git commit -a
පසුව, ගොනුවක් වැරදීමකින් බැඳීමට එකතු කර ඇති බව මට පෙනී ගියේය.
අන්තිම බැඳීමෙන් ගොනුවක් ඉවත් කරන්නේ කෙසේද?
git reset filepath
මම Git භාවිතා කරන අතර මම ගොනු කිහිපයක් භාවිතා කර ඇත
git commit -a
පසුව, ගොනුවක් වැරදීමකින් බැඳීමට එකතු කර ඇති බව මට පෙනී ගියේය.
අන්තිම බැඳීමෙන් ගොනුවක් ඉවත් කරන්නේ කෙසේද?
git reset filepath
Answers:
මෙහි ඇති වෙනත් පිළිතුරු වැරදියි කියා මම සිතමි, මන්ද මෙය වැරදියට සිදු කරන ලද ලිපිගොනු කලින් සිදු කළ වෙනස්වීම් අවලංගු නොකර නැවත වේදිකාවට ගෙන යාමේ ප්රශ්නයකි. පරිටෝෂ් සිං යෝජනා කළ පරිදි මෙය කළ හැකිය:
git reset --soft HEAD^
හෝ
git reset --soft HEAD~1
අනවශ්ය ලිපිගොනු කැපවීමෙන් ඉවත් කිරීම සඳහා ඒවා නැවත සකසන්න:
git reset HEAD path/to/unwanted_file
දැන් නැවත කැප වන්න, ඔබට එකම කැපවීමේ පණිවිඩය නැවත භාවිතා කළ හැකිය:
git commit -c ORIG_HEAD
git push
ඔබේ රෙපෝව දක්වා නිවැරදි කිරීමට උත්සාහ කළහොත් එය පැමිණිලි කරනු ඇත Updates were rejected because the tip of your current branch is behind its remote counterpart.
. ඔබට ඒවා තල්ලු කිරීමට අවශ්ය බව ඔබට විශ්වාස නම් (උදා: එය ඔබේ දෙබලකි) එවිට ඔබට -f
තල්ලු කිරීම බල කිරීම සඳහා විකල්පය භාවිතා කළ හැකිය, උදා git push origin master -f
. (අනෙක් අය ලබා ගන්නා
git reset --soft HEAD^
මගේ වඩාත් සුලභ අහෝසි කිරීමේ මෙහෙයුමයි
git reset
සිටියද, දැනට පවතින “නිසි තැනට” බලපාන මාර්ගයක් අවශ්ය විය. මම දැන් ඉගෙන ගත්තා git commit -C
. ඉතින් මට නම්, මට අවශ්ය වන්නේ තවත් එක් පියවරක් සමඟ ඔබේ නිශ්චිත වට්ටෝරුවයි, “නැවත නව කැපවීම” ලෙස අක්ෂර වින්යාසය git commit -C [hash of original HEAD commit from first step]
.
අවධානය ! ඔබට අවශ්ය වන්නේ ඔබගේ පෙර කැපවීමෙන් ගොනුවක් ඉවත් කර එය තැටියේ තබා ගැනීමට නම් , ජස්ලින්ගේ පිළිතුර ඉහත කියවන්න.
මෙය ඔබගේ අවසාන කැපවීම වන අතර ඔබේ දේශීය සහ දුරස්ථ ගබඩාවෙන් ගොනුව සම්පූර්ණයෙන්ම මකා දැමීමට ඔබට අවශ්ය නම් , ඔබට:
git rm <file>
git commit --amend
සංශෝධන ධජය නැවත වරක් කැපවීමට git ට කියයි, නමුත් "ඒකාබද්ධ කිරීම" (ශාඛා දෙකක් ඒකාබද්ධ කිරීමේ අර්ථයෙන් නොවේ) මෙය අවසාන කැපවීම සමඟ සිදු කරයි.
අදහස් දැක්වීමේදී, git rm
මෙහි භාවිතා කිරීම rm
විධානය භාවිතා කිරීම හා සමානයි !
git rm --cached
ලිපිගොනු තැටියේ තබා ගැනීමටද ඔබට භාවිතා කළ හැකිය
rm
තුළ git
විධාන ඇත කරන්නේ කුමක් rm
ම කරන්නේ!
git commit --amend
තවමත් පවතින අතර උදාහරණයක් ලෙස සොයාගත හැකිය git reflog
. එබැවින් අනෙක් අදහස් දැක්වීම් තරම් එය නරක නැත.
පවත්නා පිළිතුරු සියල්ලම අන්තිම බැඳීමෙන් අනවශ්ය ලිපිගොනු ඉවත් කිරීම ගැන කතා කරයි .
ඔබට පැරණි බැඳීමකින් අනවශ්ය ලිපිගොනු ඉවත් කිරීමට අවශ්ය නම් (තල්ලු කර ඇත) සහ ක්රියාව නිසා නව බැඳීමක් නිර්මාණය කිරීමට අවශ්ය නොවන්නේ නම් එය අනවශ්යය:
1.
ගොනුව අනුකූල වීමට අවශ්ය කැපවීම සොයා ගන්න.
git checkout <commit_id> <path_to_file>
ඔබට බොහෝ ගොනු ඉවත් කිරීමට අවශ්ය නම් ඔබට මෙය කිහිප වතාවක් කළ හැකිය.
2.
git commit -am "remove unwanted files"
3.
වැරදීමකින් ලිපිගොනු එකතු කළ බැඳීමේ commit_id සොයා ගන්න , අපි මෙහි "35c23c2" යැයි කියමු
git rebase 35c23c2~1 -i // notice: "~1" is necessary
මෙම විධානය ඔබගේ සැකසුම් අනුව සංස්කාරකය විවෘත කරයි. පෙරනිමිය vim වේ.
"අනවශ්ය ලිපිගොනු ඉවත් කිරීම" විය යුතු අන්තිම බැඳීම වැරදි බැඳීමේ ඊළඟ පේළියට ගෙනයන්න (අපගේ නඩුවේ "35c23c2"), සහ විධානය පහත පරිදි සකසන්න fixup
:
pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files
ගොනුව සුරැකීමෙන් පසු ඔබ හොඳ විය යුතුය.
අවසන් කිරීමට :
git push -f
ඔබ අවාසනාවකට ගැටුම් ඇති වුවහොත්, ඔබ ඒවා අතින් විසඳා ගත යුතුය.
git rm --cached <file(s)>
.
--fixup=35c23c2
වෙත git commit
විධාන. අවශ්ය බැඳීම නිවැරදි කිරීමක් ලෙස මෙය ස්වයංක්රීයව බැඳීම සකසනු ඇති අතර එමඟින් ඔබට එය නැවත සඳහන් කිරීමේදී අවශ්ය නොවේ. මීට අමතරව, ඔබ එකතු නම් --autosquash
කිරීමට git rebase
(ඔබ පවා අවශ්ය නැත, ඉන් අදහස් වන්නේ හුදෙක් ප්රතිඵලයක් ඉතිරි - විධානය, GIT ස්වයංක්රීයව නිවැරදි ස්ථානය වෙත ඔබේ සිදු, ඔබ අන්තර් rebase දී ඕනෑම දෙයක් කිරීමට අවශ්ය නැහැ ඒ නිසා ගමන් කරනු ඇත -i
ධජය, මම බලාපොරොත්තු වන පරිදි සෑම දෙයක්ම පෙනෙන බව සහතික කර ගැනීමට කෙසේ හෝ එය භාවිතා කිරීමට මම කැමතියි).
පිළිගත් පිළිතුරෙන් දැක්වෙන පරිදි, සම්පූර්ණ කැපවීම නැවත සකස් කිරීමෙන් ඔබට මෙය කළ හැකිය. නමුත් මෙය තරමක් බර අතැති ප්රවේශයකි.
මෙය කිරීමට වඩා පිරිසිදු ක්රමයක් වනුයේ කැපවීම තබා ගැනීම සහ වෙනස් කළ ලිපිගොනු එයින් ඉවත් කිරීම ය.
git reset HEAD^ -- path/to/file
git commit --amend --no-edit
මෙම git reset
එය සිදු පෙර දී මෙන්ම ගොනුව ගන්න, හා දර්ශක එය වේදිකාගත වේ. වැඩ කරන නාමාවලියෙහි ඇති ගොනුව ස්පර්ශ නොකෙරේ.
එවිට git commit
අභිමතය වත්මන් බැඳීමට දර්ශකය කැප කරනු ඇත.
මෙය අත්යවශ්යයෙන්ම පෙර කැපවීමේදී තිබූ ගොනුවේ අනුවාදය ගෙන එය වර්තමාන බැඳීමට එකතු කරයි. මෙහි ප්රති net ලය වන්නේ ශුද්ධ වෙනසක් සිදු නොවන අතර එමඟින් ගොනුව කැපවීමෙන් effectively ලදායී ලෙස ඉවත් කිරීමයි.
git commit --amend --no-edit
විධානය හරහා බැඳීමට එකතු වේ . මෙය ඇයිදැයි නොදන්නා නමුත් එය මට තිත්ත විය.
ඔබ සේවාදායකයේ වෙනස්කම් තල්ලු කර නොමැති නම් ඔබට භාවිතා කළ හැකිය
git reset --soft HEAD~1
එය සියලු වෙනස්කම් නැවත සකසනු ඇති අතර නැවත එක් බැඳීමක් වෙත ආපසු යනු ඇත
ඔබ ඔබගේ වෙනස්කම් තල්ලු කර ඇත්නම් har චාර්ලස් බී විසින් පිළිතුරු දුන් පියවර අනුගමනය කරන්න
Rm භාවිතා කර ගොනුව ඉවත් කිරීමෙන් එය මැකෙනු ඇත!
ඔබ සැමවිටම ඉවත් කිරීමට වඩා git හි බැඳීමකට එකතු කරයි, එබැවින් මෙම අවස්ථාවෙහිදී ගොනුව පළමු කැපවීමට පෙර තිබූ තත්වයට ආපසු එවන්න (මෙය ගොනුව අළුත් නම් මකාදැමීමේ 'rm' ක්රියාවක් විය හැකිය) සහ පසුව නැවත කැපවී ගොනුව ඉදිරියට යනු ඇත.
ගොනුව පෙර පැවති තත්වයට ගෙන ඒමට:
git checkout <commit_id> <path_to_file>
හෝ දුරස්ථ HEAD හි එය තත්වයට ගෙන ඒමට:
git checkout origin/master <path_to_file>
ඉන්පසු බැඳීම සංශෝධනය කරන්න, ගොනුව ලැයිස්තුවෙන් අතුරුදහන් වී ඇති බව ඔබ සොයා ගත යුතුය (ඔබේ තැටියෙන් මකා නොදමා!)
git checkout HEAD~ path/to/file
git commit --amend
පහත දැක්වෙන්නේ ඔබ අදහස් කළ ගොනුව පමණක් වේදිකා ගත කරනු ඇති අතර එය OP විසින් ඉල්ලා ඇති දෙයයි.
git reset HEAD^ /path/to/file
පහත දැක්වෙන දේ වැනි දෙයක් ඔබට පෙනෙනු ඇත ...
කළ යුතු වෙනස්කම්: (වේදිකාවට "git reset HEAD ..." භාවිතා කරන්න)
වෙනස් කරන ලදි: / path / to / file
කැපවීම සඳහා වේදිකාගත නොකළ වෙනස්කම්: (කැපවිය යුතු දේ යාවත්කාලීන කිරීමට "git add ..." භාවිතා කරන්න) (වැඩ කරන නාමාවලියෙහි වෙනස්කම් ඉවතලීමට "git checkout - ..." භාවිතා කරන්න)
වෙනස් කරන ලදි: / path / to / file
මෙම අවස්ථාවෙහිදී, වෙනත් අනුවාදයකට නැවත සැකසීම වැනි ගොනුවට ඔබ කැමති දෙයක් කළ හැකිය.
ඔබ කැපවීමට සූදානම් වූ විට:
git commit --amend -a
හෝ (ඔබට සිදු කිරීමට අවශ්ය නොවන වෙනත් වෙනස්කම් සිදුවී ඇත්නම්)
git commit add /path/to/file
git commit --amend
මම ඔබට උදාහරණයකින් පැහැදිලි කරන්නම්.
A, B, C අනුප්රාප්තික 3 ක් විය යුතුය. කැපවීම B හි අඩංගු නොවිය යුතු ගොනුවක් අඩංගු වේ.
git log # take A commit_id
git rebase -i "A_commit_ID" # do an interactive rebase
change commit to 'e' in rebase vim # means commit will be edited
git rm unwanted_file
git rebase --continue
git push --force-with-lease <branchName>
noop
කරන්නedit [A_commit_ID]
e [A_commit_ID]
ඔබට සරලව උත්සාහ කළ හැකිය.
git reset --soft HEAD~1
නව බැඳීමක් ඇති කරන්න.
කෙසේ වෙතත්, "gitkraken" නම් විශිෂ්ට මෘදුකාංගයක් තිබේ. එමඟින් git සමඟ වැඩ කිරීම පහසු කරයි.
git commit --amend
ඔබගේ අවසන් කැපවීමේදී ගොනු ඉවත් කිරීම යාවත්කාලීන කිරීමට ඔබ කරනු ඇත; පසුව, එය සැබවින්ම ඉවත් කර ඇති බව ඔබට පරීක්ෂා කළ හැකියgit log -1 --stat
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"
ඔබට තවමත් දේශීය ගොනුව ඉතිරි වනු ඇත. ඔබට දේශීයව ගොනුව අවශ්ය නොවන්නේ නම්, ඔබට --cached විකල්පය මඟ හැරිය හැක.
සියලු වැඩ ඔබගේ ප්රාදේශීය ශාඛාවේ තිබේ නම්, ඔබ ගොනුව පසුකාලීනව තබා ගත යුතු අතර, පිරිසිදු ඉතිහාසයක් ඇතිවාක් මෙන්, මෙය කිරීමට සරල ක්රමයක් විය හැකිය:
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit --squash <commit_id>
git add <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "brand new file!"
git rebase --interactive <commit_id>^
එවිට ඔබට වඩාත් සංකීර්ණ විධානයන් මතක තබා නොගෙන පණිවිඩ යැවීම හෝ ටයිප් කිරීමකින් තොරව පහසුවෙන් නැවත ගෙවීම අවසන් කළ හැකිය.
Git GUI භාවිතා කිරීමෙන් පෙර කැපවීමෙන් ගොනුවක් ඉවත් කිරීම සරල කළ හැකිය.
මෙය හවුල් ශාඛාවක් නොවන බවත් , ඉතිහාසය නැවත ලිවීමට ඔබට අවශ්ය නැති බවත් උපකල්පනය කර ධාවනය කරන්න:
git gui citool --amend
ඔබට වැරදියට සිදු වූ ගොනුව පරීක්ෂා කර "බැඳීම" ක්ලික් කරන්න.
ගොනුව බැඳීමෙන් ඉවත් කරනු ලැබේ, නමුත් තැටියේ තබා ඇත . එබැවින් ඔබ ගොනුව වැරදියට එකතු කිරීමෙන් පසුව එය පරීක්ෂා නොකළේ නම්, එය ඔබගේ සොයා නොගත් ලිපිගොනු ලැයිස්තුවේ පෙන්වනු ඇත (තවද ඔබ ගොනුව වැරදියට වෙනස් කිරීමෙන් පසුව එය පරීක්ෂා නොකළහොත් එය ඔබගේ වෙනස්වීම් වල ලැයිස්තුගත කර නොමැති බව පෙන්වනු ඇත).
sudo apt-get install git-gui
git rebase -i HEAD~4
කර සංස්කාරකය විවෘත කිරීම සඳහා ඔබේ විධානය ක්රියාත්මක කළෙමි . තවත් සටහනක්: "අස්ථායි කිරීම" "කැපවීම" මෙනුවෙන් සොයාගත හැකිය.
git reset --soft HEAD^
(--Soft arg මතක තබා ගැනීම) භාවිතා කිරීමට වඩා අඩු දෝෂ සහිත , පසුව git commit -c ORIG_HEAD
(--amend වෙනුවට, සියල්ල ඉස්කුරුප්පු කරයි).
ඔබට ඔබගේ කැපවීම ආරක්ෂා කර ගැනීමට අවශ්ය නම් (සමහර විට ඔබ දැනටමත් සවිස්තරාත්මක පණිවිඩ පණිවිඩයක් ලිවීමට යම් කාලයක් ගත කර ඇති අතර එය නැති කර ගැනීමට අවශ්ය නොවනු ඇත), ඔබට අවශ්ය වන්නේ ගොනුව කැපවීමෙන් ඉවත් කිරීමට මිස ගබඩාවෙන් සම්පූර්ණයෙන්ම නොවේ:
git checkout origin/<remote-branch> <filename>
git commit --amend
මට අමතර විධානයක් ක්රියාත්මක කිරීමට සිදු වූ බැවින් ඉහළ පිළිතුරට අනුපූරක වීමට අවශ්ය විය:
git reset --soft HEAD^
git checkout origin/master <filepath>
චියර්ස්!
පහත දැක්වෙන විධානයන්හි අනුක්රමයක් කරන්න:
//to remove the last commit, but preserve changes
git reset --soft HEAD~1
//to remove unneded file from the staging area
git reset HEAD `<your file>`
//finally make a new commit
git commit -m 'Your message'
මට වැඩ කළ දෙයක්, නමුත් වඩා හොඳ විසඳුමක් තිබිය යුතු යැයි තවමත් සිතන්න:
$ git revert <commit_id>
$ git reset HEAD~1 --hard
අනෙක් කැපවීම තුළ ඔබට ඉවත දැමීමට අවශ්ය වෙනස තබන්න, අනෙක් අය පරීක්ෂා කරන්න
$ git commit --amend // or stash and rebase to <commit_id> to amend changes
ඇත්ත වශයෙන්ම, මම සිතන්නේ ඉක්මන් හා පහසු ක්රමයක් වන්නේ git rebase අන්තර් ක්රියාකාරී මාදිලිය භාවිතා කිරීමයි.
git rebase -i head~1
(හෝ head 4 හිස, ඔබට කොපමණ දුරක් යාමට අවශ්යද)
ඉන්පසු, 'තෝරන්න' වෙනුවට, 'සංස්කරණය' භාවිතා කරන්න. 'සංස්කරණය' කෙතරම් බලවත් දැයි මට නොතේරුණි.
https://www.youtube.com/watch?v=2dQosJaLN18
ඔබට එය ප්රයෝජනවත් වේ යැයි සිතමි.
මට එක් ගොනුවක් පමණක් ආපසු හැරවීමට අවශ්ය ප්රාදේශීය ශාඛාවක වෙනස්කම් ඇති එකම ගැටලුව තිබේ. මට වැඩ කළේ -
( විශේෂාංගය / target_branch පහත දැක්වෙන්නේ විශේෂිත ගොනුවක් සඳහා අහෝසි කිරීමට මට අවශ්ය වූ ඒවා ඇතුළුව මගේ සියලු වෙනස්කම් මා සතුව ඇත)
( සම්භවය / විශේෂාංගය / target_branch යනු මගේ වෙනස්කම් වෙත තල්ලු කිරීමට අවශ්ය දුරස්ථ ශාඛාවයි)
( විශේෂාංගය / වේදිකාගත කිරීම මගේ තාවකාලික වේදිකා ශාඛාව වන අතර එම එක් ගොනුවකට වෙනස් කිරීම හැරුණු කොට මට අවශ්ය සියලුම වෙනස්කම් වලින් මම තල්ලු වනු ඇත)
මගේ සම්භවය / විශේෂාංගය / ඉලක්ක_ ශාඛාවෙන් දේශීය ශාඛාවක් සාදන්න - එය විශේෂාංගය / වේදිකාගත කිරීම ලෙස හැඳින්වේ
මගේ වැඩ ශාඛා ඒකාබද්ධ ලක්ෂණය / target_branch වෙත ලක්ෂණය / වේදිකාගත ශාඛා
ක් පරීක්ෂා ලක්ෂණය / වේදිකාගත පසුව GIT යළි පිහිටුවීමේ --soft ORIG_HEAD (දැන් එම පහසුකම / වේදිකාගත 'සියලු වෙනස්කම් නිරත නමුත් ෂෙයික් කරනු ඇත.)
අනවශ්ය වෙනස්කම් සහිතව මා කලින් පරීක්ෂා කළ ගොනුව අස්ථාපනය කර ඇත
සඳහා උඩුගං ශාඛා වෙනස් ලක්ෂණය / වේදිකාගත කිරීමට සම්භවය / ලක්ෂණය / target_branch
වේදිකාගත කර ඇති ඉතිරි වෙනස්කම් සිදු කර මගේ දුරස්ථ සම්භවය / විශේෂාංගය / ඉලක්ක_ ශාඛාව වෙත ඉහළට තල්ලු කර ඇත
පෙර කොමිස් වලින් ගොනු ඉවත් කිරීමට ඔබට අවශ්ය නම් පෙරහන් භාවිතා කරන්න
git filter-branch --prune-empty --index-filter 'git rm --ignore-unmatch --cached "file_to_be_removed.dmg"'
ඔබ මෙම දෝෂය දුටුවහොත්:
නව උපස්ථයක් සෑදිය නොහැක. පෙර උපස්ථයක් දැනටමත් refs / original / Force හි -f සමඟ උපස්ථය නැවත ලිවීමෙහි පවතී
ඔබගේ දේශීය ගබඩාවේ ඇති ref උපස්ථ ඉවත් කරන්න
$ rm -rf .git/refs/original/refs
ඔබ තවමත් ඔබගේ වෙනස්කම් git වෙත තල්ලු නොකරන්නේ නම්
git reset --soft HEAD~1
එය සියලු වෙනස්කම් නැවත සකසනු ඇති අතර නැවත එක් බැඳීමක් වෙත ආපසු යනු ඇත
ඔබ කළ අවසන් කැපවීම මෙය නම් සහ දේශීය හා දුරස්ථ ගබඩාවෙන් ගොනුව මකා දැමීමට ඔබට අවශ්ය නම් මෙය උත්සාහ කරන්න:
git rm <file>
git commit --amend
හෝ ඊටත් වඩා හොඳ:
පළමුව නැවත සකසන්න
git reset --soft HEAD~1
අනවශ්ය ගොනුව නැවත සකසන්න
git reset HEAD path/to/unwanted_file
නැවත කැප වන්න
git commit -c ORIG_HEAD
Here is the step to remove files from Git Commit.
>git reset --soft HEAD^1(either commitid ) -- now files moved to the staging area.
>git rm --cached filename(it will removed the file from staging area)
>git commit -m 'meaningfull message'(Now commit the required files)
මෙම අවස්ථාවේදී පිළිතුරු කිසිවක් සාධාරණ නොවේ. සැබෑ විසඳුමක් යෝජනා කළ යුතු බවට ප්රමාණවත් ඉල්ලුමක් ඇති බව පෙනේ: https://github.com/git/git/blob/master/Documentation/SubmittingPatches
git --uncommit <ගොනුවේ නම>
හොඳයි. ඉතිහාසය වෙනස් කිරීමට අපට අවශ්ය නැති බව මට වැටහී ඇත, නමුත් මම දේශීය හා අහම්බෙන් දේශීය "හැක්" ගොනුවක් එකතු කර එය බැඳීමෙන් ඉවත් කිරීමට අවශ්ය නම් මෙය ඉතා ප්රයෝජනවත් වනු ඇත.