ä»»ä½ä¸ä¸ªçæ¬æ§å¶ç³»ç»ä¸ï¼ææç¨çç¹æ§ä¹ä¸è«è¿äº âæ¤éï¼undoï¼âæä½ãå¨Gitä¸ï¼âæ¤éâæå¾å¤ç§å«ä¹ã
å½ä½ å®æäºä¸æ¬¡æ°çæ交ï¼commitï¼ï¼Gitä¼åæ¶åå¨å½åæ¶å»ä»åºï¼repositoryï¼çå¿«ç
§ï¼snapshotï¼ï¼ä½ è½å¤ä½¿ç¨Gitå°é¡¹ç®åéå°ä»»ä½ä¹åççæ¬ã
ä¸æä¸ï¼æå°å举å 个常è§çãéè¦âæ¤éâçåºæ¯ï¼å¹¶ä¸å±ç¤ºå¦ä½ä½¿ç¨Gitæ¥å®æè¿äºæä½ã
ä¸ãæ¤éä¸ä¸ªå
Œ
±ä¿®æ¹ Undo a "public" change
åºæ¯ï¼ä½ ååç¨git pushå°æ¬å°ä¿®æ¹æ¨éå°äºGitHubï¼è¿æ¶ä½ æè¯å°å¨æ交ä¸æä¸ä¸ªé误ãä½ æ³æ¤éè¿æ¬¡æ交ã
使ç¨æ¤éå½ä»¤ï¼git revert
åçäºä»ä¹ï¼git revertå°æ ¹æ®ç»å®SHAçç¸åå¼ï¼å建ä¸ä¸ªæ°çæ交ãå¦ææ§æ交æ¯âmatterâï¼é£ä¹æ°çæ交就æ¯âanti-matterâââæ§æ交ä¸ææ已移é¤çä¸è¥¿å°ä¼è¢«æ·»å è¿å°æ°æ交ä¸ï¼æ§æ交ä¸å¢å çä¸è¥¿å°å¨æ°æ交ä¸ç§»é¤ã
è¿æ¯Gitæå®å
¨ãä¹æ¯æç®åçâæ¤éâåºæ¯ï¼å 为è¿æ ·ä¸ä¼ä¿®æ¹åå²è®°å½ââä½ ç°å¨å¯ä»¥git pushä¸åårevertä¹åçæ交æ¥çº æ£é误äºã
äºãä¿®æ¹æè¿ä¸æ¬¡çæäº¤ä¿¡æ¯ Fix the last commit message
åºæ¯ï¼ä½ åªæ¯å¨æåçæ交信æ¯ä¸æ²éäºåï¼æ¯å¦ä½ æ²äºgit commit -m "Fxies bug #42"ï¼èå¨æ§è¡git pushä¹åä½ å·²ç»æè¯å°ä½ åºè¯¥æ²"Fixes bug #42"ã
使ç¨æ¤éå½ä»¤ï¼git commit âamendægit commit --amend -m "Fixes bug #42"
åçäºä»ä¹ï¼git commit âamendå°ä½¿ç¨ä¸ä¸ªå
å«äºååé误æ交ææåæ´çæ°æ交ï¼æ¥æ´æ°å¹¶æ¿æ¢è¿ä¸ªé误æ交ãç±äºæ²¡æstagedçæ交ï¼æ以å®é
ä¸è¿ä¸ªæ交åªæ¯éåäºå
åçæ交信æ¯ã
ä¸ãæ¤éæ¬å°æ´æ¹ Undo "local" changes
åºæ¯ï¼å½ä½ çç«ç¬è¿é®çæ¶ï¼ä½ æ£å¨ç¼è¾çæ件æ°å¥½è¢«ä¿åäºï¼ä½ çç¼è¾å¨ä¹æ°å¨æ¤æ¶å´©æºäºãæ¤æ¶ä½ 并没ææ交è¿ä»£ç ãä½ æææ¤éè¿ä¸ªæ件ä¸çææä¿®æ¹ââå°è¿ä¸ªæ件åéå°ä¸æ¬¡æ交çç¶æã
使ç¨æ¤éå½ä»¤ï¼git checkout --
åçäºä»ä¹ï¼git checkoutå°å·¥ä½ç®å½ï¼working directoryï¼éçæ件修æ¹æå
åGitå·²ç¥çç¶æãä½ å¯ä»¥æä¾ä¸ä¸ªæå¾
åéåæ¯çååæè
ä¸ä¸ªç¡®åçSHAç ï¼Gitä¹ä¼é»è®¤æ£åºHEADââå³ï¼å½ååæ¯çä¸ä¸æ¬¡æ交ã
注æï¼ç¨è¿ç§æ¹æ³âæ¤éâçä¿®æ¹é½å°çæ£çæ¶å¤±ãå®ä»¬æ°¸è¿ä¸ä¼è¢«æ交ãå æ¤Gitä¸è½æ¢å¤å®ä»¬ãæ¤æ¶ï¼ä¸å®è¦æç¡®èªå·±å¨åä»ä¹ï¼ï¼æ许å¯ä»¥ç¨git diffæ¥ç¡®å®ï¼
åãéç½®æ¬å°ä¿®æ¹ Reset "local" changes
åºæ¯ï¼ä½ å·²ç»å¨æ¬å°åäºä¸äºæ交ï¼è¿æ²¡pushï¼ï¼ä½ææçä¸è¥¿é½ç³ç³éäºï¼ä½ æ³æ¤éæè¿çä¸æ¬¡æ交ââå°±åå®ä»¬ä»æ²¡åçè¿ä¸æ ·ã
使ç¨æ¤éå½ä»¤ï¼git resetægit reset --hard
åçäºä»ä¹ï¼git resetå°ä½ çä»åºçºªå½ä¸ç´åéå°æå®çæåä¸ä¸ªSHA代表çæ交ï¼é£äºæ交就åä»æªåçè¿ä¸æ ·ãé»è®¤æ
åµä¸ï¼git
resetä¼ä¿çå·¥ä½ç®å½ï¼working
directoryï¼ãè¿äºæ交è½ç¶æ¶å¤±äºï¼ä½æ¯å
容è¿å¨ç£çä¸ãè¿æ¯æå®å
¨çåæ³ï¼ä½é常æ
åµæ¯ï¼ä½ æ³ä½¿ç¨ä¸ä¸ªå½ä»¤æ¥âæ¤éâæææ交åæ¬å°ä¿®æ¹ââé£
ä¹è¯·ä½¿ç¨--hardåæ°å§ã
äºãæ¤éæ¬å°åéå Redo after undo "local"
åºæ¯ï¼ä½ å·²ç»æ交äºä¸äºå
容ï¼å¹¶ä½¿ç¨git reset âhardæ¤éäºè¿äºæ´æ¹ï¼è§ä¸é¢ï¼ï¼çªç¶æè¯å°ï¼ä½ æ³è¿åè¿äºä¿®æ¹ï¼
使ç¨æ¤éå½ä»¤ï¼git reflogågit reset, æè
git checkout
åçäºä»ä¹ï¼git reflogæ¯ä¸ä¸ªç¨æ¥æ¢å¤é¡¹ç®åå²è®°å½ç好åæ³ãä½ å¯ä»¥éè¿git reflogæ¢å¤å ä¹ä»»ä½å·²æ交çå
容ã
ä½ æ许对git logå½ä»¤æ¯è¾çæï¼å®è½æ¾ç¤ºæ交å表ãgit reflogä¸ä¹ç±»ä¼¼ï¼åªä¸è¿git reflogæ¾ç¤ºçæ¯HEADåæ´æ¬¡æ°çå表ã
ä¸äºè¯´æï¼
1. åªæHEADä¼æ¹åãå½ä½ åæ¢åæ¯æ¶ï¼ç¨git commitæ交åæ´æ¶ï¼ææ¯ç¨git
resetæ¤éæ交æ¶ï¼HEADé½ä¼æ¹åãä½å½ä½ ç¨git checkout --æ¶ï¼
HEADä¸ä¼åçæ¹åãï¼å°±åä¸ææå°çæ
å½¢ï¼é£äºæ´æ¹æ ¹æ¬å°±æ²¡ææ交ï¼å æ¤reflogå°±ä¸è½å¸®å©æ们è¿è¡æ¢å¤äºï¼
2. git reflogä¸ä¼æ°¸è¿åå¨ãGitå°ä¼å®ææ¸
çé£äºâä¸å¯è¾¾ï¼unreachableï¼âç对象ãä¸è¦ææè½å¤å¨reflogéæ¾å°æ°æåçæ交记å½ã
3. reflogåªæ¯ä½ 个人çãä½ ä¸è½ç¨ä½ çreflogæ¥æ¢å¤å
¶ä»å¼åè
æªpushçæ交ã
å æ¤ï¼ææ ·åç使ç¨reflogæ¥æ¾åä¹åâæªå®æâçæ交å¢ï¼è¿è¦çä½ ç©¶ç«è¦åä»ä¹ï¼
1. å¦æä½ æ³æ¢å¤é¡¹ç®åå²å°æ次æ交ï¼é£è¯·ä½¿ç¨git reset --hard
2. å¦æä½ æ³å¨å·¥ä½ç®å½ï¼working direcotryï¼ä¸æ¢å¤æ次æ交ä¸çä¸ä¸ªæå¤ä¸ªæ件ï¼å¹¶ä¸ä¸æ¹åæ交åå²ï¼é£è¯·ä½¿ç¨git checkout--
3. å¦æä½ æ³ç¡®åçåæ»å°æ次æ交ï¼é£ä¹è¯·ä½¿ç¨git cherry-pickã
å
ãä¸åæ¯æå
³çé£äºäº Once more, with branching
åºæ¯ï¼ä½ æ交äºä¸äºåæ´ï¼ç¶åä½ æè¯å°ä½ æ£å¨masteråæ¯ä¸ï¼ä½ä½ ææçæ¯å¨featureåæ¯ä¸æ§è¡è¿äºæ交ã
使ç¨æ¤éå½ä»¤ï¼git branch feature, git reset --hard origin/master, å git checkout feature
åçäºä»ä¹ï¼ä½ å¯è½ç¨çæ¯git checkout -bæ¥å»ºç«æ°çåæ¯ï¼è¿æ¯å建åæ£åºåæ¯ç便æ·æ¹æ³ââä½å®é
ä½ å¹¶ä¸æ³ç«å»åæ¢åæ¯ãgit
branch featureä¼å»ºç«ä¸ä¸ªå«featureçåæ¯ï¼è¿ä¸ªåæ¯æåä½ æè¿çæ交ï¼ä½æ¯ä½ è¿åçå¨masteråæ¯ä¸ã
git reset --hardå°masteråéè³origin/masterï¼å¹¶å¿½ç¥æææ°æ交ãå«æ
å¿ï¼é£äºæ交é½è¿ä¿çå¨featureä¸ã
æåï¼git checkoutå°åæ¯åæ¢å°featureï¼è¿ä¸ªåæ¯åå°ä¸å¨çä¿çäºä½ æè¿çææå·¥ä½ã
ä¸ãäºåååå¤çåæ¯ Branch in time saves nine
åºæ¯ï¼ä½ åºäºmasteræ°å»ºäºä¸ä¸ªfeatureåæ¯ï¼ä½æ¯masteråæ¯è¿è¿è½åä¸origin/masterãç°å¨masteråæ¯ä¸
origin/masteråæ¥äºï¼ä½ æææ¤å»è½å¨featureä¸ç«å»commit代ç ï¼å¹¶ä¸ä¸æ¯å¨è¿è¿è½åmasterçæ
åµä¸ã
使ç¨æ¤éå½ä»¤ï¼git checkout featureågit rebase master
åçäºä»ä¹ï¼ä½ ä¹è®¸å·²ç»æ²äºå½ä»¤ï¼git resetï¼ä½æ¯æ²¡ç¨--hard,ææå¨ç£çä¸ä¿åè¿äºæ交å
容ï¼ï¼ç¶åæ²äºgit checkout -bï¼ä¹åéæ°æ交æ´æ¹ï¼ä½æ¯é£æ ·çè¯ï¼ä½ å°å¤±å»æ¬å°çæ交记å½ãä¸è¿ï¼ä¸ä¸ªæ´å¥½çæ¹æ³ï¼
使ç¨git rebase masterå¯ä»¥åå°ä¸äºäºæ
ï¼
1.é¦å
ï¼å®å®ä½ä½ å½åæ£åºåæ¯åmasterä¹é´çå
±åç¥å
èç¹ï¼common ancestorï¼ã
2.ç¶åï¼å®å°å½åæ£åºçåæ¯éç½®å°ç¥å
èç¹ï¼ancestorï¼ï¼å¹¶å°åæ¥ææçæ交é½æåèµ·æ¥ã
3.æåï¼å®å°å½åæ£åºåæ¯æ¨è¿è³masteræ«å°¾ï¼åæ¶å¨masteræåä¸æ¬¡æ交ä¹åï¼å次æ交é£äºå¨æååºçåæ´ã
å
«ãæ¹éæ¤é/æ¾å Mass undo/redo
åºæ¯ï¼ä½ å¼å§æä¸ä¸ªæ¢å®ç®æ å¼ååè½ï¼ä½æ¯ä¸éä½ æè§ç¨å¦ä¸ä¸ªæ¹æ³æ´å¥½ãä½ å·²ç»æåå 个æ交ï¼ä½æ¯ä½ åªæ³è¦å
¶ä¸çæå 个ï¼å
¶ä»çé½å¯ä»¥å é¤ä¸è¦ã
使ç¨æ¤éå½ä»¤ï¼git rebase -i
åçäºä»ä¹ï¼-iå°rebases设置为â交äºæ¨¡å¼ï¼interactive modeï¼âãrebaseå¼å§æ§è¡çæä½å°±åä¸æ讨论çä¸æ ·ï¼ä½æ¯å¨éæ°æ§è¡æ个æ交æ¶ï¼å®ä¼æåä¸æ¥ï¼è®©ä½ ä¿®æ¹æ¯ä¸æ¬¡æ交ã
rebase âiå°ä¼æå¼ä½ çé»è®¤ææ¬ç¼è¾å¨ï¼ç¶åååºæ£å¨æ§è¡çæ交ï¼å°±åè¿æ ·ï¼
å两åæå
³é®ï¼ç¬¬ä¸åæ¯éæ©å½ä»¤ï¼å®ä¼æ ¹æ®ç¬¬äºåä¸çSHAç éæ©ç¸åºçæ交ãé»è®¤æ
åµä¸ï¼rebase âiä¼è®¤ä¸ºæ¯ä¸ªæ´æ¹é½æ£éè¿pickå½ä»¤è¢«æ交ã
è¦æ¤éä¸ä¸ªæ交ï¼ç´æ¥å¨ç¼è¾å¨å é¤å¯¹åºçè¡å°±å¯ä»¥äºãå¦æå¨ä½ ç项ç®ä¸åéè¦è¿äºé误çæ交ï¼ä½ å¯ä»¥ç´æ¥å é¤ä¸å¾ä¸ç第1è¡å3-4è¡ã
å¦æä½ æ³ä¿çæ交ä½ä¿®æ¹æ交信æ¯ï¼ä½ å¯ä»¥ä½¿ç¨rewordå½ä»¤ãå³ï¼å°å½ä»¤å
³é®åpickæ¢ærewordï¼æè
rï¼ãä½ ç°å¨å¯è½æ³ç«å»ä¿®æ¹æ交æ¶
æ¯ï¼ä½è¿ä¹åä¸ä¼çæâârebase âiå°å¿½ç¥SHAååçææä¸è¥¿ãç°æçæ交信æ¯ä¼å¸®å©æ们记ä½0835fe2代表ä»ä¹ãå½ä½ æ²å®rebase
âiå½ä»¤åï¼Gitæå¼å§æç¤ºä½ éåé£äºæ°æ交æ¶æ¯ã
å¦æä½ éè¦å°2个æ交å并ï¼ä½ å¯ä»¥ç¨squashæè
fixupå½ä»¤ï¼å¦ä¸å¾ï¼
squashåfixupé½æ¯âåä¸âç»åçââé£äºç¨äºè¿äºå并å½ä»¤ï¼ç¼è
æï¼æsquashãfixupï¼çæ交ï¼å°ä¼åå®ä¹åçæ交å并ï¼ä¸å¾ä¸ï¼0835fe2å6943e85å°ä¼å并æä¸ä¸ªæ交ï¼è38f5e4eåaf67f82å°ä¼å并æå¦ä¸ä¸ªæ交ã
å½ä½ ç¨squashæ¶ï¼Gitå°ä¼æ示æ¯å¦å¡«åæ°çæ交æ¶æ¯ï¼fixupåä¼ç»åºå表ä¸ç¬¬ä¸ä¸ªæ交çæ交信æ¯ãå¨ä¸å¾ä¸ï¼af67f82æ¯ä¸ä¸ª
âOoopsâä¿¡æ¯ï¼å 为è¿ä¸ªæ交信æ¯å·²ç»å38f5e4eä¸æ ·äºãä½æ¯ä½ å¯ä»¥ä¸º0835fe2å6943e85å并çæ°æ交ç¼åæ交信æ¯ã
å½ä½ ä¿å并éåºç¼è¾å¨æ¶ï¼Gitå°ä¼æç
§ä»ä¸å°ä¸ç顺åºæ§è¡ä½ çæ交ãä½ å¯ä»¥å¨ä¿åè¿äºæ交ä¹åï¼ä¿®æ¹æ交çæ§è¡é¡ºåºãå¦ææéè¦ï¼ä½ å¯ä»¥å°af67f82å0835fe2å并ï¼å¹¶ä¸å¯ä»¥è¿æ ·æåºï¼
ä¹ãä¿®å¤æ©å
çæ交 Fix an earlier commit
åºæ¯ï¼ä¹åçæ交éè½ä¸äºä¸ä¸ªæ件ï¼å¦æå
åçæ交è½æä½ çä¸çä¸è¥¿å°±å¥½äºãä½ è¿æ²¡æpushï¼å¹¶ä¸è¿ä¸ªæ交ä¹ä¸æ¯æè¿çæ交ï¼å æ¤ä½ ä¸è½ç¨commit âamendã
使ç¨æ¤éå½ä»¤ï¼git commit --squashågit rebase --autosquash -i
åçäºä»ä¹ï¼git commit âsquashå°ä¼å建ä¸ä¸ªæ°çæ交ï¼è¯¥æ交信æ¯å¯è½åè¿æ ·âsquash! Earlier commitâãï¼ä½ ä¹å¯ä»¥æåè¿äºæ交信æ¯ï¼commit âsquashåªæ¯çå¾è®©ä½ æåäºï¼ã
å¦æä½ ä¸æ³ä¸ºå并çæ交ç¼åä¿¡æ¯ï¼ä¹å¯ä»¥èè使ç¨å½ä»¤git commit --fixupãè¿ç§æ
åµä¸ï¼ä½ å¯è½ä¼ä½¿ç¨commit --fixupï¼å ä¸ºä½ ä»
å¸æå¨rebaseä¸ä½¿ç¨ä¹åçæ交信æ¯ã
rebase --autosquash âiå°ä¼å¯å¨rebase交äºç¼è¾å¨ï¼ç¼è¾å¨ä¼ååºä»»ä½å·²å®æçsquash!åfixup!æ交ï¼å¦ä¸å¾ï¼
å½ä½¿ç¨--squashåâfixupæ¶ï¼ä½ æ许记ä¸æ¸
ä½ æ³ä¿®å¤çæ个æ交çSHAç ââåªç¥éå®å¯è½å¨ä¸ä¸ªæäºä¸ªæ交ä¹åãä½ æ许å¯ä»¥ä½¿ç¨Git
ç^å~æä½ç¬¦æå¨æ¾åãHEAD^表示HEADçåä¸æ¬¡æ交ãHEAD~4表示HEADåç4次æ交ï¼å èµ·æ¥æ»å
±æ¯å5次æ交ã
åãåæ¢è·è¸ªä¸ä¸ªå·²è¢«è·è¸ªçæ件 Stop tracking a tracked file
åºæ¯ï¼ä½ æå¤å°application.logæ·»å å°ä»åºä¸ï¼ç°å¨ä½ æ¯æ¬¡è¿è¡ç¨åºï¼Gité½æ示application.logä¸æunstagedçæ交ãä½ å¨.gitignoreä¸åä¸â*.logâï¼ä½ä»æ§æ²¡ç¨ââææ ·åè¯Gitâæ¤éâè·è¸ªè¿ä¸ªæ件çååå¢ï¼
使ç¨æ¤éå½ä»¤ï¼ git rm --cached application.log
åçäºä»ä¹ï¼å°½ç®¡.gitignoreé»æ¢Gitè·è¸ªæ件çååï¼çè³æ¯ä¹å没被è·è¸ªçæ件æ¯å¦åå¨ï¼ä½æ¯ï¼ä¸æ¦æ件被addæè
commitï¼Gitä¼å¼å§æç»è·è¸ªè¿ä¸ªæ件çååã类似çï¼å¦æä½ ç¨git add
âfæ¥â强å¶âaddï¼æè
è¦ç.gitignoreï¼Gitè¿æ¯ä¼ç»§ç»çè§ååãæ以以åæ好ä¸è¦ä½¿ç¨âfæ¥add .gitignoreæ件ã
å¦æä½ å¸æ移é¤é£äºåºå½è¢«å¿½ç¥çæ件ï¼git rm âcachedå¯ä»¥å¸®å©ä½ ï¼å¹¶å°è¿äºæ件ä¿çå¨ç£çä¸ãå 为è¿ä¸ªæ件ç°å¨è¢«å¿½ç¥äºï¼ä½ å°ä¸ä¼å¨git statusä¸çå°å®ï¼ä¹ä¸ä¼åæè¿ä¸ªæ件commitäºã
以ä¸å°±æ¯å¦ä½å¨Gitä¸æ¤éçæ¹æ³ãå¦æä½ æ³å¦ä¹ æ´å¤Gitå½ä»¤ç¨æ³ï¼å¯ä»¥ç§»æ¥ä¸é¢ç¸å
³çææ¡£ï¼
checkout
commit
rebase
reflog
reset
revert
rm
温馨提示:答案为网友推荐,仅供参考