æ¤éä¸ä¸ªâå·²å
¬å¼âçæ¹å
åºæ¯: ä½ å·²ç»æ§è¡äº git push, æä½ çä¿®æ¹åéå°äº GitHubï¼ç°å¨ä½ æè¯å°è¿äº commit çå
¶ä¸ä¸ä¸ªæ¯æé®é¢çï¼ä½ éè¦æ¤éé£ä¸ä¸ª commit.
æ¹æ³: git revert <SHA>
åç: git revert ä¼äº§çä¸ä¸ªæ°ç commitï¼å®åæå® SHA
对åºç commit æ¯ç¸åçï¼æè
说æ¯å转çï¼ãå¦æåå
ç commit æ¯âç©è´¨âï¼æ°ç commit å°±æ¯âåç©è´¨â â ä»»ä½ä»åå
ç
commit éå é¤çå
容ä¼å¨æ°ç commit é被å åå»ï¼ä»»ä½å¨åå
ç commit éå å
¥çå
容ä¼å¨æ°ç commit é被å é¤ã
è¿æ¯ Git æå®å
¨ãæåºæ¬çæ¤éåºæ¯ï¼å 为å®å¹¶ä¸ä¼æ¹ååå² â æä»¥ä½ ç°å¨å¯ä»¥ git push æ°çâå转â commit æ¥æµæ¶ä½ é误æ交ç commitã
ä¿®æ£æåä¸ä¸ª commit æ¶æ¯
åºæ¯: ä½ å¨æåä¸æ¡ commit æ¶æ¯éæ个ç¬è¯¯ï¼å·²ç»æ§è¡äº git commit -m "Fxies bug #42"ï¼ä½å¨ git push ä¹åä½ æè¯å°æ¶æ¯åºè¯¥æ¯ âFixes bug #42â³ã
æ¹æ³: git commit --amend æ git commit --amend -m "Fixes bug #42"
åç: git commit --amend ä¼ç¨ä¸ä¸ªæ°ç commit æ´æ°å¹¶æ¿æ¢æè¿ç commit ï¼è¿ä¸ªæ°ç commit ä¼æä»»ä½ä¿®æ¹å
容åä¸ä¸ä¸ª commit çå
容ç»åèµ·æ¥ãå¦æå½å没ææåºä»»ä½ä¿®æ¹ï¼è¿ä¸ªæä½å°±åªä¼æä¸æ¬¡ç commit æ¶æ¯éåä¸éã
æ¤éâæ¬å°çâä¿®æ¹
åºæ¯: ä¸åªç«ä»é®çä¸èµ°è¿ï¼æ æä¸ä¿åäºä¿®æ¹ï¼ç¶åç ´åäºç¼è¾å¨ãä¸è¿ï¼ä½ è¿æ²¡æ commit è¿äºä¿®æ¹ãä½ æ³è¦æ¢å¤è¢«ä¿®æ¹æ件éçææå
容 â å°±åä¸æ¬¡ commit çæ¶åä¸æ¨¡ä¸æ ·ã
æ¹æ³: git checkout -- <bad filename>
åç: git checkout ä¼æå·¥ä½ç®å½éçæ件修æ¹å° Git ä¹åè®°å½çæ个ç¶æãä½ å¯ä»¥æä¾ä¸ä¸ªä½ æ³è¿åçåæ¯åæç¹å® SHA ï¼æè
å¨ç¼ºçæ
åµä¸ï¼Git ä¼è®¤ä¸ºä½ å¸æ checkout çæ¯ HEADï¼å½å checkout åæ¯çæåä¸æ¬¡ commitã
è®°ä½ï¼ä½ ç¨è¿ç§æ¹æ³âæ¤éâçä»»ä½ä¿®æ¹ççä¼å®å
¨æ¶å¤±ãå 为å®ä»¬ä»æ¥æ²¡æ被æ交è¿ï¼æ以ä¹å Git ä¹æ æ³å¸®å©æ们æ¢å¤å®ä»¬ãä½ è¦ç¡®ä¿èªå·±äºè§£ä½ å¨è¿ä¸ªæä½éææçä¸è¥¿æ¯ä»ä¹ï¼ï¼ä¹è®¸å¯ä»¥å
å©ç¨ git diff 确认ä¸ä¸ï¼
éç½®âæ¬å°çâä¿®æ¹
åºæ¯: ä½ å¨æ¬å°æ交äºä¸äºä¸è¥¿ï¼è¿æ²¡æ pushï¼ï¼ä½æ¯ææè¿äºä¸è¥¿é½å¾ç³ç³ï¼ä½ å¸ææ¤éåé¢çä¸æ¬¡æ交 â å°±åå®ä»¬ä»æ¥æ²¡æåçè¿ä¸æ ·ã
æ¹æ³: git reset <last good SHA> æ git reset --hard <last good SHA>
åç: git reset ä¼æä½ ç代ç åºåå²è¿åå°æå®ç SHA ç¶æã è¿æ ·å°±åæ¯è¿äºæ交ä»æ¥æ²¡æåçè¿ã缺çæ
åµä¸ï¼ git reset ä¼ä¿çå·¥ä½ç®å½ãè¿æ ·ï¼æ交æ¯æ²¡æäºï¼ä½æ¯ä¿®æ¹å
容è¿å¨ç£çä¸ãè¿æ¯ä¸ç§å®å
¨çéæ©ï¼ä½é常æ们ä¼å¸æä¸æ¥å°±âæ¤éâæ交以åä¿®æ¹å
容 â è¿å°±æ¯ --hard é项çåè½ã
å¨æ¤éâæ¬å°ä¿®æ¹âä¹ååæ¢å¤
åºæ¯: ä½ æ交äºå 个 commitï¼ç¶åç¨ git reset --hard æ¤éäºè¿äºä¿®æ¹ï¼è§ä¸ä¸æ®µï¼ï¼æ¥çä½ åæè¯å°ï¼ä½ å¸æè¿åè¿äºä¿®æ¹ï¼
æ¹æ³: git reflog å git reset æ git checkout
åç: git reflog 对äºæ¢å¤é¡¹ç®åå²æ¯ä¸ä¸ªè¶
æ£çèµæºãä½ å¯ä»¥æ¢å¤å ä¹ ä»»ä½ä¸è¥¿ â ä»»ä½ä½ commit è¿çä¸è¥¿ â åªè¦éè¿ reflogã
ä½ å¯è½å·²ç»çæäº git log å½ä»¤ï¼å®ä¼æ¾ç¤º commit çå表ã git reflog ä¹æ¯ç±»ä¼¼çï¼ä¸è¿å®æ¾ç¤ºçæ¯ä¸ä¸ª HEAD åçæ¹åçæ¶é´å表.
ä¸äºæ³¨æäºé¡¹ï¼
å®æ¶åçåªæ¯ HEAD çæ¹åãå¨ä½ åæ¢åæ¯ãç¨ git commit è¿è¡æ交ã以åç¨ git reset æ¤é commit æ¶ï¼HEAD ä¼æ¹åï¼ä½å½ä½ ç¨ git checkout -- <bad filename> æ¤éæ¶ï¼æ£å¦æ们å¨åé¢è®²å°çæ
åµï¼ï¼HEAD 并ä¸ä¼æ¹å â å¦åæè¿°ï¼è¿äºä¿®æ¹ä»æ¥æ²¡æ被æ交è¿ï¼å æ¤ reflog ä¹æ æ³å¸®å©æ们æ¢å¤å®ä»¬ã
git reflog ä¸ä¼æ°¸è¿ä¿æãGit ä¼å®ææ¸
çé£äº âç¨ä¸å°çâ 对象ãä¸è¦ææå 个æåçæ交è¿ä¸ç´èººå¨é£éã
ä½ ç reflog å°±æ¯ä½ çï¼åªæ¯ä½ çãä½ ä¸è½ç¨ git reflog æ¥æ¢å¤å¦ä¸ä¸ªå¼åè
没æ push è¿ç commitã
é£ä¹â¦ä½ æä¹å©ç¨ reflog æ¥âæ¢å¤âä¹åâæ¤éâç commit å¢ï¼å®åå³äºä½ æ³åå°çå°åºæ¯ä»ä¹ï¼
å¦æä½ å¸æåç¡®å°æ¢å¤é¡¹ç®çåå²å°æ个æ¶é´ç¹ï¼ç¨ git reset --hard <SHA>
å¦æä½ å¸æé建工ä½ç®å½éçä¸ä¸ªæå¤ä¸ªæ件ï¼è®©å®ä»¬æ¢å¤å°æ个æ¶é´ç¹çç¶æï¼ç¨ git checkout <SHA> -- <filename>
å¦æä½ å¸ææè¿äº commit éçæä¸ä¸ªéæ°æ交å°ä½ ç代ç åºéï¼ç¨ git cherry-pick <SHA>
å©ç¨åæ¯çå¦ä¸ç§åæ³
åºæ¯: ä½ è¿è¡äºä¸äºæ交ï¼ç¶åæè¯å°ä½ å¼å§ check out çæ¯ master åæ¯ãä½ å¸æè¿äºæ交è¿å°å¦ä¸ä¸ªç¹æ§ï¼featureï¼åæ¯éã
æ¹æ³: git branch feature, git reset --hard origin/master, and git checkout feature
åç: ä½ å¯è½ä¹ æ¯äºç¨ git checkout -b <name> å建æ°çåæ¯ â è¿æ¯å建æ°åæ¯å¹¶é©¬ä¸ check out çæµè¡æ·å¾ â ä½æ¯ä½ ä¸å¸æ马ä¸åæ¢åæ¯ãè¿éï¼ git branch feature å建ä¸ä¸ªå«å feature çæ°åæ¯å¹¶æåä½ æè¿ç commitï¼ä½è¿æ¯è®©ä½ check out å¨ master åæ¯ä¸ã
ä¸ä¸æ¥ï¼å¨æ交任ä½æ°ç commit ä¹åï¼ç¨ git reset --hard æ master åæ¯åå origin/master ãä¸è¿å«æ
å¿ï¼é£äº commit è¿å¨ feature åæ¯éã
æåï¼ç¨ git checkout åæ¢å°æ°ç feature åæ¯ï¼å¹¶ä¸è®©ä½ æè¿ææçå·¥ä½ææé½å®å¥½æ æã
åæ¶åæ¯ï¼çå»ç¹ç
åºæ¯: ä½ å¨ master åæ¯çåºç¡ä¸åå»ºäº feature åæ¯ï¼ä½ master åæ¯å·²ç»æ»åäº origin/master å¾å¤ãç°å¨ master åæ¯å·²ç»å origin/master åæ¥ï¼ä½ å¸æå¨ feature ä¸çæ交æ¯ä»ç°å¨å¼å§ï¼èä¸æ¯ä¹ä»æ»åå¾å¤çå°æ¹å¼å§ã
æ¹æ³: git checkout feature å git rebase master
åç: è¦è¾¾å°è¿ä¸ªææï¼ä½ æ¬æ¥å¯ä»¥éè¿ git reset (ä¸å --hard, è¿æ ·å¯ä»¥å¨ç£çä¸ä¿çä¿®æ¹) å git checkout -b <new branch name> ç¶ååéæ°æ交修æ¹ï¼ä¸è¿è¿æ ·åçè¯ï¼ä½ å°±ä¼å¤±å»æ交åå²ãæ们ææ´å¥½çåæ³ã
git rebase master ä¼åå¦ä¸çäºæ
ï¼
é¦å
å®ä¼æ¾å°ä½ å½å check out çåæ¯å master åæ¯çå
±åç¥å
ã
ç¶åå® reset å½å check out çåæ¯å°é£ä¸ªå
±åç¥å
ï¼å¨ä¸ä¸ªä¸´æ¶ä¿ååºåæ¾ææä¹åçæ交ã
ç¶åå®æå½å check out çåæ¯æå° master çæ«å°¾é¨åï¼å¹¶ä»ä¸´æ¶ä¿ååºéæ°æåæ¾ç commit æäº¤å° master åæ¯çæåä¸ä¸ª commit ä¹åã
大éçæ¤é/æ¢å¤
åºæ¯: ä½ åæ个æ¹åå¼å§å®ç°ä¸ä¸ªç¹æ§ï¼ä½æ¯åè·¯ä½ æè¯å°å¦ä¸ä¸ªæ¹æ¡æ´å¥½ãä½ å·²ç»è¿è¡äºåå 次æ交ï¼ä½ä½ ç°å¨åªéè¦å
¶ä¸çä¸é¨åãä½ å¸æå
¶ä»ä¸éè¦çæ交ç»ç»æ¶å¤±ã
æ¹æ³: git rebase -i <earlier SHA>
åç: -i åæ°è®© rebase è¿å
¥â交äºæ¨¡å¼âãå®å¼å§ç±»ä¼¼äºåé¢è®¨è®ºç rebaseï¼ä½å¨éæ°è¿è¡ä»»ä½æ交ä¹åï¼å®ä¼æåä¸æ¥å¹¶å
è®¸ä½ è¯¦ç»å°ä¿®æ¹æ¯ä¸ªæ交ã
rebase -i ä¼æå¼ä½ ç缺çææ¬ç¼è¾å¨ï¼éé¢ååºåéçæ交ãå¦ä¸æ示ï¼
åé¢ä¸¤åæ¯é®ï¼ç¬¬ä¸ä¸ªæ¯éå®çå½ä»¤ï¼å¯¹åºç¬¬äºåéç SHA ç¡®å®ç commitã缺çæ
åµä¸ï¼ rebase -i åå®æ¯ä¸ª commit é½è¦éè¿ pick å½ä»¤è¢«è¿ç¨ã
è¦ä¸¢å¼ä¸ä¸ª commitï¼åªè¦å¨ç¼è¾å¨éå é¤é£ä¸è¡å°±è¡äºãå¦æä½ ä¸åéè¦é¡¹ç®éçé£å 个é误çæ交ï¼ä½ å¯ä»¥å é¤ä¸ä¾ä¸ç1ã3ã4è¡ã
å¦æä½ éè¦ä¿ç commit çå
容ï¼èæ¯å¯¹ commit æ¶æ¯è¿è¡ç¼è¾ï¼ä½ å¯ä»¥ä½¿ç¨ reword å½ä»¤ã æ第ä¸åéç pick æ¿æ¢ä¸º reword (æè
ç´æ¥ç¨ r)ãæ人ä¼è§å¾å¨è¿éç´æ¥éå commit æ¶æ¯å°±è¡äºï¼ä½æ¯è¿æ ·ä¸ç®¡ç¨ ârebase -i ä¼å¿½ç¥ SHA ååé¢çä»»ä½ä¸è¥¿ãå®åé¢çææ¬åªæ¯ç¨æ¥å¸®å©æä»¬è®°ä½ 0835fe2 æ¯å¹²å¥çãå½ä½ å®æ rebase -i çæä½ä¹åï¼ä½ ä¼è¢«æ示è¾å
¥éè¦ç¼åçä»»ä½ commit æ¶æ¯ã
å¦æä½ éè¦æ两个 commit å并å°ä¸èµ·ï¼ä½ å¯ä»¥ä½¿ç¨ squash æ fixup å½ä»¤ï¼å¦ä¸æ示ï¼
squash å fixup ä¼âåä¸âå并 â 带æè¿ä¸¤ä¸ªå½ä»¤ç commit ä¼è¢«å并å°å®çåä¸ä¸ª commit éãå¨è¿ä¸ªä¾åéï¼ 0835fe2 å 6943e85 ä¼è¢«å并æä¸ä¸ª commitï¼ 38f5e4e å af67f82 ä¼è¢«å并æå¦ä¸ä¸ªã
å¦æä½ éæ©äº squashï¼ Git ä¼æ示æ们ç»æ°å并ç commit ä¸ä¸ªæ°ç commit æ¶æ¯ï¼ fixup åä¼æå并æ¸
åé第ä¸ä¸ª commit çæ¶æ¯ç´æ¥ç»æ°å并ç commit ã è¿éï¼ä½ ç¥é af67f82 æ¯ä¸ä¸ªâå®äºå®äºâ¦.â ç commitï¼æä»¥ä½ ä¼çç 38f5e4e asç commit æ¶æ¯ï¼ä½ä½ ä¼ç»åå¹¶äº 0835fe2 å 6943e85 çæ° commit ç¼åä¸ä¸ªæ°çæ¶æ¯ã
å¨ä½ ä¿å并éåºç¼è¾å¨çæ¶åï¼Git ä¼æä»é¡¶é¨å°åºé¨ç顺åºè¿ç¨ä½ ç commitãä½ å¯ä»¥éè¿å¨ä¿ååä¿®æ¹ commit 顺åºæ¥æ¹åè¿ç¨ç顺åºãå¦æä½ æ¿æï¼ä½ ä¹å¯ä»¥éè¿å¦ä¸å®ææ af67f82 å 0835fe2 å并å°ä¸èµ·ï¼
ä¿®å¤æ´æ©æç commit
åºæ¯: ä½ å¨ä¸ä¸ªæ´æ©æç commit éå¿è®°äºå å
¥ä¸ä¸ªæ件ï¼å¦ææ´æ©ç commit è½å
å«è¿ä¸ªå¿è®°çæ件就太æ£äºãä½ è¿æ²¡æ pushï¼ä½è¿ä¸ª commit ä¸æ¯æè¿çï¼æä»¥ä½ æ²¡æ³ç¨ commit --amend.
æ¹æ³: git commit --squash <SHA of the earlier commit> å git rebase --autosquash -i <even earlier SHA>
åç: git commit --squash ä¼å建ä¸ä¸ªæ°ç commit ï¼å®å¸¦æä¸ä¸ª commit æ¶æ¯ï¼ç±»ä¼¼äº squash! Earlier commitã (ä½ ä¹å¯ä»¥æå·¥å建ä¸ä¸ªå¸¦æ类似 commit æ¶æ¯ç commitï¼ä½æ¯ commit --squash å¯ä»¥å¸®ä½ çä¸è¾å
¥çå·¥ä½ã)
å¦æä½ ä¸æ³è¢«æ示为æ°å并ç commit è¾å
¥ä¸æ¡æ°ç commit æ¶æ¯ï¼ä½ ä¹å¯ä»¥å©ç¨ git commit --fixup ãå¨è¿ä¸ªæ
åµä¸ï¼ä½ å¾å¯è½ä¼ç¨commit --fixup ï¼å ä¸ºä½ åªæ¯å¸æå¨ rebase çæ¶å使ç¨æ©æ commit ç commit æ¶æ¯ã
rebase --autosquash -i ä¼æ¿æ´»ä¸ä¸ªäº¤äºå¼ç rebase ç¼è¾å¨ï¼ä½æ¯ç¼è¾å¨æå¼çæ¶åï¼å¨ commit æ¸
åéä»»ä½ squash! å fixup! ç commit é½å·²ç»é
对å°ç®æ commit ä¸äºï¼å¦ä¸æ示ï¼
å¨ä½¿ç¨ --squash å --fixup çæ¶åï¼ä½ å¯è½ä¸è®°å¾æ³è¦ä¿®æ£ç commit ç SHA äºâ åªè®°å¾å®æ¯åé¢ç¬¬ 1 个æ第 5 个 commitãä½ ä¼åç° Git ç ^ å ~ æä½ç¬¦ç¹å«å¥½ç¨ãHEAD^ æ¯ HEAD çåä¸ä¸ª commitã HEAD~4 æ¯ HEAD å¾å第 4 个 â æè
ä¸èµ·ç®ï¼åæ°ç¬¬ 5 个 commitã
åæ¢è¿½è¸ªä¸ä¸ªæ件
åºæ¯: ä½ å¶ç¶æ application.log å å°ä»£ç åºéäºï¼ç°å¨æ¯æ¬¡ä½ è¿è¡åºç¨ï¼Git é½ä¼æ¥åå¨ application.log éææªæ交çä¿®æ¹ãä½ æ *.login æ¾å°äº .gitignore æ件éï¼å¯æ件è¿æ¯å¨ä»£ç åºé â ä½ æä¹æè½åè¯ Git âæ¤éâ 对è¿ä¸ªæ件ç追踪å¢ï¼
æ¹æ³: git rm --cached application.log
åç: è½ç¶ .gitignore ä¼é»æ¢ Git 追踪æ件çä¿®æ¹ï¼çè³ä¸å
³æ³¨æ件æ¯å¦åå¨ï¼ä½è¿åªæ¯é对é£äºä»¥åä»æ¥æ²¡æ追踪è¿çæ件ãä¸æ¦æ个æ件被å å
¥å¹¶æ交äºï¼Git å°±ä¼æç»å
³æ³¨è¯¥æ件çæ¹åã类似å°ï¼å¦æä½ å©ç¨ git add -f æ¥å¼ºå¶æè¦çäº .gitignoreï¼ Git è¿ä¼æç»è¿½è¸ªæ¹åçæ
åµãä¹åä½ å°±ä¸å¿
ç¨-f æ¥æ·»å è¿ä¸ªæ件äºã
å¦æä½ å¸æä» Git ç追踪对象ä¸å é¤é£ä¸ªæ¬åºå¿½ç¥çæä»¶ï¼ git rm --cached ä¼ä»è¿½è¸ªå¯¹è±¡ä¸å é¤å®ï¼ä½è®©æ件å¨ç£çä¸ä¿æåå°ä¸å¨ãå 为ç°å¨å®å·²ç»è¢«å¿½ç¥äºï¼ä½ å¨ git status éå°±ä¸ä¼åçè§è¿ä¸ªæ件ï¼ä¹ä¸ä¼åå¶ç¶æ交该æ件çä¿®æ¹äºã
温馨提示:答案为网友推荐,仅供参考