මම සාමාන්යයෙන් සමාලෝචනය සඳහා කොමිස් ලැයිස්තුවක් ඉදිරිපත් කරමි. මට පහත සඳහන් බැඳීම් තිබේ නම්:
HEAD
Commit3
Commit2
Commit1
... මම දන්නවා මට කැපවීම වෙනස් කළ හැකි බව git commit --amend
. නමුත් Commit1
එය වෙනස් නොවන HEAD
බව මා සලකන්නේ කෙසේද?
මම සාමාන්යයෙන් සමාලෝචනය සඳහා කොමිස් ලැයිස්තුවක් ඉදිරිපත් කරමි. මට පහත සඳහන් බැඳීම් තිබේ නම්:
HEAD
Commit3
Commit2
Commit1
... මම දන්නවා මට කැපවීම වෙනස් කළ හැකි බව git commit --amend
. නමුත් Commit1
එය වෙනස් නොවන HEAD
බව මා සලකන්නේ කෙසේද?
Answers:
ඔබට git rebase භාවිතා කළ හැකිය . උදාහරණයක් ලෙස, ඔබට කැපවීම වෙනස් කිරීමට අවශ්ය නම් bbc643cd
, ධාවනය කරන්න
$ git rebase --interactive 'bbc643cd^'
කරුණාකර ^
විධානය අවසානයේ ඇති කරත්තය සටහන් කරන්න , මන්ද ඔබ වෙනස් කිරීමට බලාපොරොත්තු වන තැනැත්තාට පෙර නැවත කැපවීම නැවත කළ යුතු බැවිනි .
පෙරනිමි කර්තෘ දී, වෙනස් කරන්න pick
කිරීමට edit
'bbc643cd' සඳහන් රේඛාව.
ගොනුව සුරකිමින් පිටවන්න: git මඟින් ගොනුවේ විධාන අර්ථ නිරූපණය කර ස්වයංක්රීයව ක්රියාත්මක කරනු ඇත. ඔබ කැපවීමක් ඇති කළ පෙර තත්වය තුළ ඔබ සොයා ගනු ඇත bbc643cd
.
මෙම අවස්ථාවෙහිදී, bbc643cd
ඔබගේ අවසාන කැපවීම වන අතර ඔබට එය පහසුවෙන් සංශෝධනය කළ හැකිය : ඔබේ වෙනස්කම් සිදු කර ඒවා විධානය සමඟ සිදු කරන්න:
$ git commit --all --amend --no-edit
ඊට පසු, ටයිප් කරන්න:
$ git rebase --continue
පෙර හෙඩ් බැඳීම වෙත ආපසු යාමට.
අවවාදයයි : මෙය එම කැපවීමේ SHA-1 මෙන්ම සියලු දරුවන් ද වෙනස් කරනු ඇති බව සලකන්න - වෙනත් වචන වලින් කිවහොත්, මෙය ඉතිහාසය එතැන් සිට නැවත ලියයි. ඔබ විධානය භාවිතා කරමින් තල්ලු කළහොත් ඔබට මෙය සිදු කළ හැකියgit push --force
reword
පියවර git rebase -i
වෙනුවට edit
(එය ස්වයංක්රීයව සංස්කාරක විවෘත හා rebase පියවර සෙසු රටවල් සමඟ දිගටම; මෙම භාවිතය obviates git commit --ammend
හා git rebase --continue
ඔබ පමණක් සිදු පණිවිඩය නොවේ අන්තර්ගතය වෙනස් කිරීමට අවශ්ය වන විට ).
git stash
පෙර git rebase
සහ git stash pop
පසුව ධාවනය කිරීමට ඔබට අවශ්ය විය හැකි බව සඳහන් කිරීම වටී .
git commit --all --amend --no-edit
මෙහි අන්ධ ලෙස භාවිතා කරනවා වෙනුවට කඩිනම් උපදෙස් අනුගමනය කිරීම වඩා er ානවන්ත බව සලකන්න . මට පසුව කළ යුතුව git rebase -i ...
තිබුණේ git commit --amend
සාමාන්යයෙන් එවකටය git rebase --continue
.
git rebase -i @~9 # Show the last 9 commits in a text editor
ඔබට අවශ්ය කැපවීම සොයා ගන්න, ( ) pick
වෙත වෙනස් කර ගොනුව සුරකින්න සහ වසා දමන්න . Git එම කැපවීමට පෙරළා, ඔබට එක්කෝ ඉඩ දෙයි:e
edit
git commit --amend
වෙනස්කම් කිරීමට භාවිතා කරන්න, හෝgit reset @~
අන්තිම බැඳීම බැහැර කිරීමට භාවිතා කරන්න, නමුත් ලිපිගොනු වල වෙනස්කම් නොවේ (එනම් ඔබ ලිපිගොනු සංස්කරණය කරන විට ඔබ සිටි ස්ථානයට ගෙන යන්න, නමුත් තවමත් කැපවී නැත).බහුවිධ කොමිස් වලට බෙදීම වැනි වඩාත් සංකීර්ණ දේවල් කිරීමට දෙවැන්න ප්රයෝජනවත් වේ.
ඉන්පසුව, ධාවනය කරන්න git rebase --continue
, එවිට ඔබගේ වෙනස් කරන ලද කැපවීමට ඉහළින් Git පසුකාලීන වෙනස්කම් නැවත ධාවනය කරයි. ඒකාබද්ධ කිරීමේ ගැටුම් කිහිපයක් නිවැරදි කිරීමට ඔබෙන් ඉල්ලා සිටිය හැකිය.
සටහන: @
සඳහා කෙටිකාලීන HEAD
වන අතර ~
එය නිශ්චිත බැඳීමට පෙර බැඳීම වේ.
Git ලියකියවිලි වල ඉතිහාසය නැවත ලිවීම පිළිබඳ වැඩිදුර කියවන්න .
ProTip ™: ඉතිහාසය නැවත ලියන "භයානක" විධානයන් සමඟ අත්හදා බැලීමට බිය නොවන්න * - Git විසින් ඔබගේ කොමිස් දින 90 ක් පෙරනිමියෙන් මකා නොදමනු ඇත; ඔබට ඒවා reflog හි සොයාගත හැකිය:
$ git reset @~3 # go back 3 commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started
* වැනි විකල්ප සඳහා සිදු වොච් --hard
සහ --force
වුවත් - ඔවුන් දත්ත ඉවතලන්න හැක.
* එසේම, ඔබ සහයෝගයෙන් කටයුතු කරන කිසිදු ශාඛාවක ඉතිහාසය නැවත ලියන්න එපා.
බොහෝ පද්ධති වල, git rebase -i
පෙරනිමියෙන් Vim විවෘත වේ. බොහෝ නවීන පෙළ සංස්කාරකවරුන් මෙන් Vim ක්රියා නොකරයි, එබැවින් Vim භාවිතා කර නැවත භාවිතා කරන්නේ කෙසේදැයි බලන්න . ඔබ වෙනත් සංස්කාරකයක් භාවිතා කිරීමට කැමති නම්, එය වෙනස් කරන්න git config --global core.editor your-favorite-text-editor
.
@
කෙටිමං ලෙස භාවිතා කළ හැකි බව මම දැන සිටියේ නැත HEAD
. මෙය පළ කිරීම ගැන ස්තූතියි.
git reset @~
කැපවීම තෝරා ගැනීමෙන් පසු මට කිරීමට අවශ්ය දේ git rebase ...
. ඔබ මගේ වීරයා)
අන්තර් ක්රියාකාරී rebase සමග --autosquash
මම ගැඹුරු ඉතිහාසයේ පෙර අනාචාරයේ fixup කිරීමට අවශ්ය විට මම නිතර භාවිතා දෙයක්. එය මූලිකවම ZelluX හි පිළිතුර නිරූපණය කරන ක්රියාවලිය වේගවත් කරන අතර ඔබට සංස්කරණය කිරීමට අවශ්ය එකකට වඩා වැඩි ප්රමාණයක් ඇති විට එය විශේෂයෙන් ප්රයෝජනවත් වේ.
ප්රලේඛනයෙන්:
--autosquash
බැඳීම් ලොග් පණිවිඩය “ස්කොෂ්!…” (හෝ “සවි කිරීම!…”) සමඟ ආරම්භ වන විට, සහ එහි මාතෘකාව එකම ආකාරයකින් ආරම්භ වන බැඳීමක් තිබේ නම්…, ප්රතිප්රහාරයේ ටෝඩෝ ලැයිස්තුව ස්වයංක්රීයව වෙනස් කරන්න. ස්කොෂ් කිරීම සඳහා සලකුණු කර ඇත්තේ වෙනස් කිරීමට ඇති කැපවීමෙන් පසුවය
ඔබට මේ වගේ ඉතිහාසයක් ඇතැයි උපකල්පනය කරන්න:
$ git log --graph --oneline
* b42d293 Commit3
* e8adec4 Commit2
* faaf19f Commit1
ඔබට කොමිට් 2 වෙත සංශෝධනය කිරීමට අවශ්ය වෙනස්කම් ඇති අතර පසුව ඔබේ වෙනස්කම් සිදු කරන්න
$ git commit -m "fixup! Commit2"
විකල්පයක් ලෙස ඔබට බැඳීම් පණිවිඩය වෙනුවට කැපවීම-ෂා භාවිතා කළ හැකිය, එසේ "fixup! e8adec4
නැතහොත් කැපවීමේ පණිවිඩයේ උපසර්ගයක් පවා භාවිතා කළ හැකිය .
ඉන්පසු කැපවීමට පෙර අන්තර්ක්රියාකාරී ප්රතිප්රහාරයක් ආරම්භ කරන්න
$ git rebase e8adec4^ -i --autosquash
දැනටමත් නිවැරදිව ඇණවුම් කර ඇති කොමිස් සමඟ ඔබේ සංස්කාරකය විවෘත වේ
pick e8adec4 Commit2
fixup 54e1a99 fixup! Commit2
pick b42d293 Commit3
ඔබ කළ යුත්තේ සුරැකීම සහ පිටවීම පමණි
git commit --fixup=@~
ඒ වෙනුවට ඔබට භාවිතා කළ හැකිය git commit -m "fixup! Commit2"
. ඔබගේ කැපවීමේ පණිවිඩ දිගු වන විට මෙය විශේෂයෙන් ප්රයෝජනවත් වන අතර එය සියල්ලම ටයිප් කිරීම වේදනාවක් වනු ඇත.
ධාවනය:
$ git rebase --interactive commit_hash^
එක් එක් ^
මඟින් ඔබට කොපමණ වාර ගණනක් ආපසු සංස්කරණය කිරීමට අවශ්ය දැයි පෙන්නුම් කරයි, එය එකක් පමණක් නම් (ඔබ නියම කළ කැපවීමේ හැෂ්), එවිට ඔබ එකක් එකතු කරන්න^
.
විම් භාවිතා ඔබ වචන වෙනස් pick
කිරීමට reword
ඔබට වෙනස් කිරීමට අවශ්ය අනාචාරයේ සඳහා, සුරැකීම සහ ඉවත් ( :wq
). එවිට ඔබ නැවත පණිවිඩයක් ලෙස සලකුණු කළ සෑම බැඳීමක්ම git මඟින් ඔබෙන් විමසනු ඇත, එවිට ඔබට බැඳීම් පණිවිඩය වෙනස් කළ හැකිය.
සෑම කැපවීමේ පණිවිඩයක්ම :wq
ඊළඟ කැපවීමේ පණිවිඩයට යාමට ඔබ සුරැකිය යුතු අතර ( ) ඉවත් විය යුතුය
වෙනස්කම් සිදු නොකර ඔබට පිටවීමට අවශ්ය නම්, ඔබන්න :q!
සංස්කරණය කරන්න : vim
ඔබ තුළ සැරිසැරීමට j
ඉහළට k
යන්න, පහළට h
යන්න, වමට යන්න, සහ l
දකුණට යන්න (මේ සියල්ලම NORMAL
ප්රකාරයේදී, ප්රකාරයට ESC
යාමට ඔබන්න NORMAL
). පෙළක් සංස්කරණය කිරීම සඳහා , ඔබ පෙළ i
ඇතුළු කරන INSERT
මාදිලියට ඇතුළු වන පරිදි ඔබන්න . ESC
නැවත NORMAL
ප්රකාරයට යාමට ඔබන්න :)
යාවත්කාලීන කිරීම : මෙන්න github ලැයිස්තුගත කිරීම වෙතින් හොඳ සබැඳියක් git සමඟ ඕනෑම දෙයක් අහෝසි කරන්නේ කෙසේද (පාහේ)
git push --force
?
git push --force
ඔබගේ දේශීය කොමිස් සමඟ දුරස්ථ කිරීම් නැවත ලිවීම යනු කුමක්ද . මෙම මාතෘකාවේ තත්වය එය නොවේ :)
කිසියම් හේතුවක් නිසා ඔබ අන්තර්ක්රියාකාරී සංස්කාරකවරුන්ට අකමැති නම්, ඔබට භාවිතා කළ හැකිය git rebase --onto
.
ඔබට වෙනස් කිරීමට අවශ්ය යැයි පවසන්න Commit1
. පළමුව, පෙර සිට අතු Commit1
:
git checkout -b amending [commit before Commit1]
දෙවනුව, කැක්කුමක් නැහැ Commit1
සමග cherry-pick
:
git cherry-pick Commit1
දැන්, ඔබගේ වෙනස්කම් සංශෝධනය කරමින්, නිර්මාණය කරන්නේ Commit1'
:
git add ...
git commit --amend -m "new message for Commit1"
අවසාන වශයෙන්, වෙනත් වෙනස්කම් සිදු කිරීමෙන් පසු, ඔබගේ ඉතිරි බැඳීම් master
ඔබගේ නව කැපවීමට ඉහළින් බද්ධ කරන්න:
git rebase --onto amending Commit1 master
කියවන්න: "ශාඛාව මත නැවත ප්රතිස්ථාපනය කරන්න amending
, සියල්ලම Commit1
(ඇතුළත් නොවන) සහ master
(ඇතුළත්) අතර වේ." එනම්, commit2 සහ commit3, පැරණි Commit1 මුළුමනින්ම කපා දමයි. ඔබට ඒවා චෙරි-තෝරා ගත හැකිය, නමුත් මේ ක්රමය පහසුය.
ඔබේ අතු පිරිසිදු කිරීමට මතක තබා ගන්න!
git branch -d amending
git checkout -b amending Commit1~1
පූර්ව කැපවීම ලබා ගැනීමට ඔබට භාවිතා කළ හැකිය
git checkout -b amending Commit1
?
ප්රලේඛනය මත පදනම්ව
පැරණි හෝ බහු බැඳීම් පණිවිඩවල පණිවිඩය සංශෝධනය කිරීම
git rebase -i HEAD~3
ඉහත දැක්වෙන්නේ වත්මන් ශාඛාවේ අවසන් කොමිස් 3 ලැයිස්තුවකි, ඔබට තවත් අවශ්ය නම් 3 වෙනත් දෙයකට වෙනස් කරන්න. ලැයිස්තුව පහත සඳහන් දේට සමාන වනු ඇත:
pick e499d89 Delete CNAME
pick 0c39034 Better README
pick f7fde4a Change the commit message but push the same commit.
ඔබට වෙනස් කිරීමට අවශ්ය එක් එක් පණිවිඩයට පෙර තේරීම ප්රතිවර්තනය සමඟ ප්රතිස්ථාපනය කරන්න . ලැයිස්තුවේ දෙවන බැඳීම ඔබ වෙනස් කරන බව කියමු, ඔබේ ගොනුව පහත පරිදි වේ:
pick e499d89 Delete CNAME
reword 0c39034 Better README
pick f7fde4a Change the commit message but push the same commit.
බැඳීම් ලැයිස්තු ගොනුව සුරකින්න සහ වසා දමන්න, මෙය ඔබගේ කැපවීමේ පණිවිඩය වෙනස් කිරීමට, බැඳීම් පණිවිඩය වෙනස් කිරීමට සහ සුරැකීමට නව සංස්කාරකයක් උත්පතන කරනු ඇත.
සංශෝධිත කොමිස් අවසාන වශයෙන් බල කිරීම.
git push --force
මම හිතුවා මම මේ සඳහා භාවිතා කරන අන්වර්ථයක් බෙදා ගන්නවා කියලා. එය පදනම් වී ඇත්තේ අන්තර්ක්රියාකාරී නොවන අන්තර්ක්රියාකාරී ප්රතිරෝධය මත ය. එය ඔබගේ git එකට එක් කිරීමට, මෙම විධානය ක්රියාත්මක කරන්න (පහත පැහැදිලි කිරීම):
git config --global alias.amend-to '!f() { SHA=`git rev-parse "$1"`; git commit --fixup "$SHA" && GIT_SEQUENCE_EDITOR=true git rebase --interactive --autosquash "$SHA^"; }; f'
මෙම විධානයේ ඇති ලොකුම වාසිය නම් එය නිෂ් -ල වීමයි.
(1) ඇත්ත වශයෙන්ම නැවත ගෙවීමේදී ගැටුම් නොමැති බව සලකන විට
git amend-to <REV> # e.g.
git amend-to HEAD~1
git amend-to aaaa1111
නම amend-to
සුදුසු IMHO ලෙස පෙනේ. ප්රවාහය සමඟ සසඳන්න --amend
:
git add . && git commit --amend --no-edit
# vs
git add . && git amend-to <REV>
git config --global alias.<NAME> '!<COMMAND>'
- git <NAME>
නොවන විධානයක් ක්රියාත්මක කරන ගෝලීය git අන්වර්ථයක් නිර්මාණය කරයි<COMMAND>
f() { <BODY> }; f
- "නිර්නාමික" bash ශ්රිතයක්.SHA=`git rev-parse "$1"`;
- තර්කය git revision බවට පරිවර්තනය කර ප්රති result ලය විචල්යයට පවරයි SHA
git commit --fixup "$SHA"
- සවි කිරීම-කැපවීම SHA
. ලියකියවිලි බලන්නgit-commit
GIT_SEQUENCE_EDITOR=true git rebase --interactive --autosquash "$SHA^"
git rebase --interactive "$SHA^"
කොටස වෙනත් පිළිතුරු වලින් ආවරණය කර ඇත.--autosquash
යනු කුමක් සමඟද යන්න git commit --fixup
, වැඩි විස්තර සඳහා git-rebase
ලියකියවිලි බලන්නGIT_SEQUENCE_EDITOR=true
මුළු දේම අන්තර්ක්රියාකාරී නොවන බවට පත් කරන්නේ එයයි. මෙම බ්ලොග් සටහනෙන් මම ඉගෙන ගත් මෙම කඩුල්ල .amend-to
අස්ථායී ලිපිගොනු හැසිරවිය හැකිය: git config --global alias.amend-to '!f() { SHA=
git rev-parse "$ 1"; git stash -k && git commit --fixup "$SHA" && GIT_SEQUENCE_EDITOR=true git rebase --interactive --autosquash "$SHA^" && git stash pop; }; f'
අතීත කැපවීමක් නිතර නිතර නිවැරදි කරන බව මට පෙනී ගියේය.
වැඩ ප්රවාහය මෙන්න:
git commit-edit <commit-hash>
මෙය ඔබට සංස්කරණය කිරීමට අවශ්ය කැපවීම අතහැර දමනු ඇත.
කැපවීම මුලින් සිදු වූවා නම් එය නිවැරදි කර වේදිකා ගත කරන්න.
(ඔබ සිදු git stash save
නොකරන ඕනෑම ලිපිගොනු තබා ගැනීමට ඔබට භාවිතා කිරීමට අවශ්ය විය හැකිය )
සමඟ බැඳීම නැවත කරන්න --amend
, උදා:
git commit --amend
නැවත පිරවීම සම්පූර්ණ කරන්න:
git rebase --continue
ඉහත ක්රියා කිරීමට, පහත ස්ක්රිප්ට් git-commit-edit
ඔබේ කොතැනක හෝ ක්රියාත්මක කළ හැකි ගොනුවකට දමන්න $PATH
:
#!/bin/bash
set -euo pipefail
script_name=${0##*/}
warn () { printf '%s: %s\n' "$script_name" "$*" >&2; }
die () { warn "$@"; exit 1; }
[[ $# -ge 2 ]] && die "Expected single commit to edit. Defaults to HEAD~"
# Default to editing the parent of the most recent commit
# The most recent commit can be edited with `git commit --amend`
commit=$(git rev-parse --short "${1:-HEAD~}")
message=$(git log -1 --format='%h %s' "$commit")
if [[ $OSTYPE =~ ^darwin ]]; then
sed_inplace=(sed -Ei "")
else
sed_inplace=(sed -Ei)
fi
export GIT_SEQUENCE_EDITOR="${sed_inplace[*]} "' "s/^pick ('"$commit"' .*)/edit \\1/"'
git rebase --quiet --interactive --autostash --autosquash "$commit"~
git reset --quiet @~ "$(git rev-parse --show-toplevel)" # Reset the cache of the toplevel directory to the previous commit
git commit --quiet --amend --no-edit --allow-empty # Commit an empty commit so that that cache diffs are un-reversed
echo
echo "Editing commit: $message" >&2
echo
මෙම ප්රවේශයට පැමිණියේය (එය බොහෝ විට අන්තර්ක්රියාකාරී නැවත භාවිතා කිරීම හා සමාන වේ) නමුත් මට නම් එය සරල ය.
සටහන: මම මෙම ප්රවේශය ඉදිරිපත් කරන්නේ එදිනෙදා විකල්පයකට වඩා ඔබට කළ හැකි දේ නිදර්ශනය කිරීම සඳහා ය. එයට පියවර රාශියක් ඇති හෙයින් (සමහර විට සමහර අවවාද.)
ඔබට බැඳීම වෙනස් කිරීමට අවශ්ය යැයි පවසන්න, ඔබ 0
දැනට සිටීfeature-branch
some-commit---0---1---2---(feature-branch)HEAD
මෙම කැපවීම පරීක්ෂා කර අ quick-branch
. ඔබේ විශේෂාංග ශාඛාව ප්රතිසාධන ලක්ෂ්යයක් ලෙස ක්ලෝන කළ හැකිය (ආරම්භ කිරීමට පෙර).
?(git checkout -b feature-branch-backup)
git checkout 0
git checkout -b quick-branch
ඔබට දැන් මේ වගේ දෙයක් ලැබෙනු ඇත:
0(quick-branch)HEAD---1---2---(feature-branch)
අදියර වෙනස් කිරීම, අනෙක් සියල්ල ගබඩා කිරීම.
git add ./example.txt
git stash
වෙනස්කම් සිදු කර නැවත පරීක්ෂා කරන්න feature-branch
git commit --amend
git checkout feature-branch
ඔබට දැන් මේ වගේ දෙයක් ලැබෙනු ඇත:
some-commit---0---1---2---(feature-branch)HEAD
\
---0'(quick-branch)
Rebase feature-branch
මතට quick-branch
(ඔබට කවර හෝ ගැටුම් නිරාකරණය). තොගයක් යොදන්න සහ ඉවත් කරන්න quick-branch
.
git rebase quick-branch
git stash pop
git branch -D quick-branch
ඔබ අවසන් වන්නේ:
some-commit---0'---1'---2'---HEAD(feature-branch)
Git අනුපිටපත් නොකරනු ඇත (මට කොතරම් දුරට කිව නොහැකි වුවද) නැවත ප්රතිස්ථාපනය කිරීමේදී 0 සිදු වේ.
සටහන: අප මුලින් වෙනස් කිරීමට අදහස් කළ කැපවීමෙන් පටන් ගෙන සියලු බැඳීම් හැෂ් වෙනස් වේ.
git stash
+ rebase
ස්වයංක්රීයකරණය
ගෙරිට් සමාලෝචන සඳහා මට පැරණි බැඳීමක් වෙනස් කිරීමට අවශ්ය වූ විට, මම කරමින් සිටියේ:
git-amend-old() (
# Stash, apply to past commit, and rebase the current branch on to of the result.
current_branch="$(git rev-parse --abbrev-ref HEAD)"
apply_to="$1"
git stash
git checkout "$apply_to"
git stash apply
git add -u
git commit --amend --no-edit
new_sha="$(git log --format="%H" -n 1)"
git checkout "$current_branch"
git rebase --onto "$new_sha" "$apply_to"
)
භාවිතය:
git add
දැනටමත් repo හි තිබේ නම් අවශ්ය නොවේgit-amend-old $old_sha
--autosquash
සම්බන්ධයක් නැති වෙනත් සවි කිරීම් ස්කොෂ් නොකරන බැවින් මම මේකට කැමතියි .
git amend
වර්තමාන තොගය භාවිතා කරමින් නිශ්චිත බැඳීමකට වෙනස්කම් යෙදීම සඳහා සුපුරුදු විකල්පයක් විය යුතුය , ඉතා දක්ෂයි!
අන්තර්ක්රියාකාරී නොවන විධානයක් ලබා ගැනීම සඳහා, මෙම අන්තර්ගතය සමඟ පිටපතක් ඔබේ PATH හි තබන්න:
#!/bin/sh
#
# git-fixup
# Use staged changes to modify a specified commit
set -e
cmt=$(git rev-parse $1)
git commit --fixup="$cmt"
GIT_EDITOR=true git rebase -i --autosquash "$cmt~1"
ඔබගේ වෙනස්කම් (සමඟ git add
) වේදිකා ගත කර එය ක්රියාත්මක කරන්න git fixup <commit-to-modify>
. ඇත්ත වශයෙන්ම, ඔබට ගැටුම් ඇති වුවහොත් එය තවමත් අන්තර්ක්රියාකාරී වනු ඇත.
මම මේක විසඳුවා,
1) මට අවශ්ය වෙනස්කම් සමඟ නව බැඳීමක් ඇති කිරීමෙන් ..
r8gs4r commit 0
2) එය සමඟ ඒකාබද්ධ වීමට අවශ්ය කුමන කැපවීමදැයි මම දනිමි. එය 3 වේ.
එබැවින්, git rebase -i HEAD~4
# 4 නිරූපණය කරන්නේ මෑත කාලීන බැඳීම් 4 යි (මෙහි 3 කැපවීම 4 වන ස්ථානයේ ඇත)
3) අන්තර්ක්රියාකාරී ප්රතිප්රහාරයේදී මෑත කාලීන කැපවීම පතුලේ පිහිටා ඇත. එය එක හා සමානව පෙනෙනු ඇත,
pick q6ade6 commit 3
pick vr43de commit 2
pick ac123d commit 1
pick r8gs4r commit 0
4) මෙහිදී ඔබට නිශ්චිත එකක් සමඟ ඒකාබද්ධ වීමට අවශ්ය නම් අපි බැඳීම නැවත සකස් කළ යුතුයි. එය එසේ විය යුතුය,
parent
|_child
pick q6ade6 commit 3
f r8gs4r commit 0
pick vr43de commit 2
pick ac123d commit 1
නැවත සකසන්න පසු ඔබ වෙනුවට අවශ්ය p
pick
සමග f
( fixup පණිවිඩය සිදු තොරව ඒකාබද්ධ කරනු ඇත) හෝ s
( ස්කොෂ් බැඳීම් පණිවිඩය සමඟ ඒකාබද්ධ කිරීම ධාවන කාලය තුළ වෙනස් විය හැක)
ඉන්පසු ඔබේ ගස බේරා ගන්න.
දැන් පවත්නා බැඳීම සමඟ ඒකාබද්ධ කරන්න.
සටහන: ඔබ තනිවම නඩත්තු නොකරන්නේ නම් එය වඩාත් සුදුසු නොවේ. ඔබට විශාල කණ්ඩායම් ප්රමාණයක් තිබේ නම්, එය git ගස නැවත ලිවීම පිළිගත හැකි ක්රමයක් නොවන අතර එය ඔබ නොදන්නා ගැටුම් වලින් අවසන් වේ. ඔබට අඩු කැපවීමකින් ගස පිරිසිදුව පවත්වා ගැනීමට අවශ්ය නම් මෙය උත්සාහ කළ හැකි අතර එහි කුඩා කණ්ඩායම වෙනත් ආකාරයකින් එය වඩාත් සුදුසු නොවේ නම් .....
හොඳම විකල්පය වන්නේ "අන්තර්ක්රියාකාරී නැවත සැකසුම් විධානය" භාවිතා කිරීමයි.
මෙම
git rebase
විධානය ඇදහිය නොහැකි තරම් බලවත් ය. බැඳීම් පණිවිඩ සංස්කරණය කිරීමට , කොමිස් ඒකාබද්ධ කිරීමට, ඒවා නැවත ඇණවුම් කිරීමට ...ඔබ බැඳීමක් නැවත ප්රතිනිර්මාණය කරන සෑම අවස්ථාවකම අන්තර්ගතය වෙනස් කළත් නැතත් එක් එක් බැඳීම සඳහා නව SHA එකක් නිර්මාණය වේ! මෙම විධානය භාවිතා කරන විට ඔබ ප්රවේශම් විය යුතුය, විශේෂයෙන් ඔබ වෙනත් සංවර්ධකයින් සමඟ සහයෝගයෙන් වැඩ කරන්නේ නම් එයට දැඩි ඇඟවුම් ඇති විය හැකිය. ඔබ සමහරක් ප්රතික්ෂේප කරන අතරතුර ඔවුන් ඔබේ කැපවීම සමඟ වැඩ කිරීමට පටන් ගනී. ඔබ කොමිස් තල්ලු කිරීමට බල කළ පසු ඒවා සමමුහුර්ත වී ඇති අතර පසුව අවුල් සහගත තත්වයකදී ඔබට දැනගත හැකිය. එබැවින් ප්රවේශම් වන්න!
backup
නැවත ප්රතිස්ථාපනය කිරීමට පෙර ශාඛාවක් සෑදීම රෙකමදාරු කරනු ලැබේ, එවිට ඔබට පාලනය කළ නොහැකි දේවල් සොයාගත් සෑම විටම ඔබට පෙර තත්වයට ආපසු යා හැකිය.
git rebase -i <base>
-i
"අන්තර්ක්රියාකාරී" සඳහා පෙනී සිටින්න . අන්තර්ක්රියාකාරී නොවන ආකාරයෙන් ඔබට ප්රතිප්රහාරයක් කළ හැකි බව සලකන්න. උදා:
#interactivly rebase the n commits from the current position, n is a given number(2,3 ...etc)
git rebase -i HEAD~n
HEAD
ඔබගේ වර්තමාන ස්ථානය දක්වයි (ශාඛා නාමය හෝ SHA කැපවීම ද විය හැකිය). මෙම ~n
අදහස් වන්නේ "n beforeé, ඒ නිසා HEAD~n
ඔබ දැනට එක් පෙර අනාචාරයේ n" ලැයිස්තුව වනු ඇත ".
git rebase
වැනි වෙනස් විධානයන් ඇත:
p
නැත්නම් pick
කැපවීම දිගටම කරගෙන යන්න.r
හෝ reword
: බැඳීමේ අන්තර්ගතය තබා ගැනීමට නමුත් බැඳීම් පණිවිඩය වෙනස් කිරීමට.s
හෝ squash
: මෙම බැඳීමේ වෙනස්වීම් පෙර කළ බැඳීමට ඒකාබද්ධ කිරීම (ලැයිස්තුවේ ඊට ඉහළින් ඇති කැපවීම).... ආදිය.
සටහන: දේවල් සරල කිරීම සඳහා ඔබේ කේත සංස්කාරකය සමඟ Git වැඩ කිරීම වඩා හොඳය. උදාහරණයක් ලෙස ඔබ දෘශ්ය කේතය භාවිතා කරන්නේ නම් ඔබට මේ ආකාරයට එකතු කළ හැකිය git config --global core.editor "code --wait"
. නැතහොත් ඔබේ කේත සංස්කාරකය GIT සමඟ වඩාත් කැමති ලෙස ඇසුරු කරන්නේ කෙසේදැයි ඔබට ගූගල් හි සෙවිය හැකිය.
git rebase
මා කළ අන්තිම කොමිස් 2 වෙනස් කිරීමට මට අවශ්ය විය, එබැවින් මම මේ ආකාරයට ක්රියා කරමි:
#This to show all the commits on one line
$git log --oneline
4f3d0c8 (HEAD -> documentation) docs: Add project description and included files"
4d95e08 docs: Add created date and project title"
eaf7978 (origin/master , origin/HEAD, master) Inital commit
46a5819 Create README.md
දැන් මම git rebase
අවසන් වරට කළ පණිවිඩ 2 වෙනස් කිරීමට භාවිතා කරමි :
$git rebase -i HEAD~2
එය කේත සංස්කාරකය විවෘත කර මෙය පෙන්වයි:
pick 4d95e08 docs: Add created date and project title
pick 4f3d0c8 docs: Add project description and included files
# Rebase eaf7978..4f3d0c8 onto eaf7978 (2 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
...
මට මේ 2 සඳහා වන බැඳීම් පණිවිඩය වෙනස් කිරීමට අවශ්ය බැවින්. ඒ නිසා මම ටයිප් ඇත r
හෝ reword
වෙනුවට pick
. ඉන්පසු ගොනුව සුරකිමින් ටැබ් එක වසා දමන්න. rebase
එය බහු-පියවර ක්රියාවලියක ක්රියාත්මක වන බව සලකන්න , ඊළඟ පියවර වන්නේ පණිවිඩ යාවත්කාලීන කිරීමයි. කොමිස් ප්රතිලෝම කාලානුක්රමික අනුපිළිවෙලින් ප්රදර්ශනය වන බැවින් අවසාන කැපවීම එම එකෙහි ද පළමු බැඳීම පළමු පේළියේ ද යනාදිය ප්රදර්ශනය කෙරේ.
පණිවිඩ යාවත්කාලීන කරන්න: පළමු පණිවිඩය යාවත්කාලීන කරන්න:
docs: Add created date and project title to the documentation "README.md"
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
...
සුරකින්න සහ වසා දමන්න දෙවන පණිවිඩය සංස්කරණය කරන්න
docs: Add project description and included files to the documentation "README.md"
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
...
සුරකින්න සහ වසා දමන්න.
ප්රතිප්රහාරය අවසන් වන විට ඔබට මෙවැනි පණිවිඩයක් ලැබෙනු ඇත: Successfully rebased and updated refs/heads/documentation
එයින් අදහස් වන්නේ ඔබ සාර්ථක වන බවයි. ඔබට වෙනස්කම් පෙන්විය හැකිය:
5dff827 (HEAD -> documentation) docs: Add project description and included files to the documentation "README.md"
4585c68 docs: Add created date and project title to the documentation "README.md"
eaf7978 (origin/master, origin/HEAD, master) Inital commit
46a5819 Create README.md
එය නව පරිශීලකයින්ට උපකාරී වනු ඇතැයි මම ප්රාර්ථනා කරමි :).
ඔබ මේ වන විටත් කොමිස් තල්ලු කර නොමැති නම්, ඔබට පෙර කැපවීමකට ආපසු යා හැකිය git reset HEAD^[1,2,3,4...]
උදාහරණයක් වශයෙන්
git commit <file1> -m "Updated files 1 and 2"
git commit <file3> -m "Updated file 3"
අපොයි, පළමු කැපවීමට ගොනු 2 එක් කිරීමට අමතක විය ...
git reset HEAD^1 // because I only need to go back 1 commit
git add <file2>
මෙය පළමු බැඳීමට ගොනු 2 එකතු කරයි.
හොඳයි, මෙම විසඳුම ඉතා මෝඩ බවක් පෙනෙන්නට තිබුණත් සමහර තත්වයන් යටතේ ඔබව බේරා ගත හැකිය.
මගේ මිතුරෙකු අහම්බෙන් ඉතා විශාල ලිපිගොනු කීපයක් (ස්වයංක්රීයව ජනනය කරන ලද ලිපිගොනු 3GB සිට 5GB දක්වා පරාසයක) සිදු කර, පසුව git push
තවදුරටත් ක්රියාත්මක නොවන ගැටලුව අවබෝධ කර ගැනීමට පෙර අමතර කේත කිහිපයක් ඒ මත සිදු කළේය !
ලිපිගොනු ලැයිස්තුගත කර ඇති .gitignore
නමුත් බහාලුම් ෆෝල්ඩරය නැවත නම් කිරීමෙන් පසු ඒවා නිරාවරණය වී කැපවී ඇත! දැන් ඊට ඉහළින් තවත් කේත කිහිපයක් තිබේ, නමුත් push
එය සදහටම ක්රියාත්මක වෙමින් පැවතුනි (GB දත්ත උඩුගත කිරීමට උත්සාහ කරයි!) අවසානයේදී ගිතූබ්ගේ ගොනු ප්රමාණයේ සීමාවන් නිසා එය අසාර්ථක වනු ඇත .
අන්තර්ක්රියාකාරී නැවත ප්රතිස්ථාපනය කිරීමේ ගැටලුව හෝ ඒ හා සමාන දෙයක් නම්, ඔවුන් මෙම දැවැන්ත ලිපිගොනු වටා එබීම සමඟ කටයුතු කරන අතර ඕනෑම දෙයක් කිරීමට සදහටම ගතවනු ඇත. කෙසේ වෙතත්, සීඑල්අයි හි පැයකට ආසන්න කාලයක් ගත කිරීමෙන් පසුව, ලිපිගොනු (සහ ඩෙල්ටා) ඇත්ත වශයෙන්ම ඉතිහාසයෙන් ඉවත් කර තිබේද නැතිනම් වර්තමාන කොමිස් වලට ඇතුළත් කර නොමැතිදැයි අපට විශ්වාස නැත. තල්ලුව වැඩ නොකරන අතර මගේ මිතුරා ඇත්තටම හිර වී සිටියේය.
ඉතින්, මා ඉදිරිපත් කළ විසඳුම වූයේ:
~/Project-old
.~/Project
) දක්වා නැවතත් git ෆෝල්ඩරය ක්ලෝන කරන්න . cp -r
සිට අතින් ගොනු අතින් . ~/Project-old
~/Project
mv
සංස්කරණය කර .gitignore
නිසි පරිදි ඇතුළත් කර ඇති බවට වග බලා ගන්න . .git
මෑතකදී ක්ලෝන කරන ලද ෆෝල්ඩරය නැවත ලියන්නේ නැති බවට වග බලා ගන්න~/Project
කරන ලද පැරණි . ගැටළු සහගත ඉතිහාසයේ ලොග් ජීවත් වන්නේ එතැනිනි!push
.මෙම විසඳුමේ ඇති ලොකුම ගැටළුව නම්, එය සමහර ලිපිගොනු අතින් පිටපත් කිරීම සමඟ කටයුතු කරන අතර, එය මෑතදී කළ සියලු බැඳීම් එකකට ඒකාබද්ධ කරයි (පැහැදිලිවම නව බැඳීම්-හැෂ් සමඟ) බී
විශාල වාසි වන්නේ, එය සෑම පියවරකදීම ඉතා පැහැදිලිය, එය විශාල ලිපිගොනු සඳහා (මෙන්ම සංවේදී ඒවා සඳහා) විශිෂ්ට ලෙස ක්රියා කරන අතර එය ඉතිහාසයේ කිසිදු හෝඩුවාවක් ඉතිරි නොකරයි!