# Git åºç¡ ## è·å Git ä»åº å¨ç°æç®å½ä¸åå§åä»åºï¼è¿å ¥é¡¹ç®ç®å½å¹¶è¾å ¥`git init` å éç°æçä»åºï¼ ```bash git clone https://github.com/... ``` ## æä»¶ç¶æ æ¥çæä»¶ç¶æï¼`git status`  > å¾çæ¥æºï¼`https://img2018.cnblogs.com/blog/1252910/201907/1252910-20190726163854195-886320537.png` **ç¶æè¯´æï¼** æ°æ·»å çæªè·è¸ªæä»¶å颿 ?? æ è®°ï¼æ°æ·»å å°æååºä¸çæä»¶å颿 A æ è®°ï¼ä¿®æ¹è¿çæä»¶å颿 M æ è®°ï¼å¦ä¸å¾ï¼`MM Rakefile`åºç°ä¸¤ä¸ªMï¼å ¶ä¸åºç°å¨é 左边ç M 表示该æä»¶è¢«ä¿®æ¹äºå¹¶æ¾å ¥äºæååºï¼åºç°å¨å³è¾¹ç M 表示该æä»¶è¢«ä¿®æ¹äºä½æ¯è¿æ²¡æ¾å ¥æååºã ```bash $ git status -s M README # å³è¾¹ç M 表示该æä»¶è¢«ä¿®æ¹äºä½æ¯è¿æ²¡æ¾å ¥æååº MM Rakefile # 左边ç M 表示该æä»¶è¢«ä¿®æ¹äºå¹¶æ¾å ¥äºæååºï¼å³è¾¹ç M 表示该æä»¶è¢«ä¿®æ¹äºä½æ¯è¿æ²¡æ¾å ¥æååº A lib/git.rb # Aè¡¨ç¤ºæ°æ·»å å°æååºä¸çæä»¶ ?? LICENSE.txt # ??è¡¨ç¤ºæ°æ·»å çæªè·è¸ªæä»¶ ``` ## é ç½®å«å æäºäººå¯è½ç»å¸¸æ²éå½ä»¤ï¼éè¿é ç½®å«åå¯ä»¥ç®åå½ä»¤ï¼ éè¿å½ä»¤ `git config --global alias.st status ` å° å½ä»¤`git status` ç®å为 `git st`ï¼ ```bash $ git config --global alias.st status $ git st On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree clean ``` ## å·¥ä½åº æ¥çå·¥ä½åºä¿®æ¹ï¼`git diff` ```bash $ git diff diff --git a/md/leetcodeå·é¢ç¬è®°.md b/md/leetcodeå·é¢ç¬è®°.md deleted file mode 100644 index 63a7c90..0000000 --- a/md/leetcodeå·é¢ç¬è®°.md +++ /dev/null ``` æ¤éå·¥ä½åºä¿®æ¹ï¼ ```bash git checkout -- file_name ``` æ¤å½ä»¤ä¼æ¤éå·¥ä½åºçä¿®æ¹ï¼ä¸å¯æ¢å¤ï¼ä¸ä¼æ¤éæååºä¿®æ¹ã æ¤éä¿®æ¹è¿å¯ä»¥ä½¿ç¨ restore å½ä»¤ï¼git2.23çæ¬å¼å ¥ï¼ã ```java git restore --worktree demo.txt //æ¤éæä»¶å·¥ä½åºçä¿®æ¹ git restore --staged demo.txt //æ¤éæååºçä¿®æ¹ï¼å°æä»¶ç¶ææ¢å¤å°æªaddä¹å git restore -s HEAD~1 demo.txt //å°å½åå·¥ä½åºåæ¢å°ä¸ä¸ª commit çæ¬ï¼-sç¸å½äº--source git restore -s hadn12 demo.txt //å°å½åå·¥ä½åºåæ¢å°æå® commit id ççæ¬ ``` ## æååº éè¿`git add filename` å°å·¥ä½åºçæä»¶æ¾å°æååºã ```bash git add README.md ``` æ¥çæååºä¿®æ¹ï¼ ```bash $ git diff --staged diff --git a/README.md b/README.md index ecd6c7a..653f001 100644 --- a/README.md +++ b/README.md ``` å¯ä»¥çå°æååºä¸æ README.md æä»¶ï¼è¯´æREADME.mdæä»¶è¢«æ¾å°äºæååºã æ¤éæååºä¿®æ¹ä½¿ç¨unstageï¼ ```bash git reset HEAD file_name ``` å°æä»¶ä¿®æ¹ç§»åºæååºï¼æ¾å°å·¥ä½åºã **git reset å ä¸ --hard é项ä¼å¯¼è´å·¥ä½ç®å½ä¸ææä¿®æ¹ä¸¢å¤±ã** ## æäº¤ 任使ªæäº¤çä¿®æ¹ä¸¢å¤±åå¾å¯è½ä¸å¯æ¢å¤ãæäº¤å½ä»¤ï¼ ```bash git commit -m "add readme.md" ``` `git commit -a -m "xxx"` ç¸å½äº`git add`å`git commit -m "xxx"`ï¼å° tracked çæä»¶ç´æ¥æäº¤ãuntracked çæä»¶æ æ³ä½¿ç¨æ¤å½ä»¤ç´æ¥æäº¤ï¼éå æ§è¡ git add å½ä»¤ï¼åæ§è¡ git commitã åç¬æ§è¡`git commit`ï¼ä¸å¸¦ä¸-måæ°ï¼ä¼è¿å ¥ vim ç¼è¾å¨çé¢ï¼  æ¤æ¶åºè¯¥è¿ä¹æä½ï¼ 1. æä¸åæ¯é®`i`æ`a`æ`o`ï¼è¿å ¥å°å¯ç¼è¾ç¶æ 2. è¾å ¥commitä¿¡æ¯ä¹åï¼æä¸`Esc`é®å°±å¯éåºç¼è¾ç¶æï¼åå°ä¸è¬æ¨¡å¼ 3. è¾å ¥:wq ï¼ä¿åéåºï¼æ :wq!ï¼å¼ºè¡éåºï¼ä¸ä¿åï¼ ### ä¿®æ¹commitä¿¡æ¯ å¦ææäº¤ååç°æ¼ææäºæä»¶æè æäº¤ä¿¡æ¯åéï¼ä½¿ç¨`git commit --amend`éæ°æäº¤ï¼ ```bash git commit -m 'initial commit' git add forgotten_file git commit --amend ``` ### æ¥çæäº¤åå² `git log`ååºæææäº¤çæ´æ°ã `git log -p -2`ï¼-p ç¨æ¥æ¾ç¤ºæ¯æ¬¡æäº¤çå 容差å¼ï¼-2表示æ¾ç¤ºæè¿ä¸¤æ¬¡æäº¤ã `git log --stat`æ¯æ¬¡æäº¤ä¸é¢é½ä¼ååºææè¢«ä¿®æ¹çæä»¶ãæå¤å°æä»¶è¢«ä¿®æ¹ååªäºè¡è¢«ä¿®æ¹çã `git log --pretty=oneline`å°æ¯ä¸ªæäº¤æ¾å¨ä¸è¡æ¾ç¤ºã `git log --pretty=format:"%h %s" --graph` format è¡¨ç¤ºæ ¼å¼åè¾åºï¼%h æäº¤å¯¹è±¡çç®çåå¸ä¸²ï¼%s æ¯æäº¤è¯´æï¼--graph å¯ä»¥æ´å½¢è±¡çå±ç¤ºåæ¯ãåå¹¶åå²ã ```bash $ git log --pretty=format:"%h %s" --graph * 75f8b36 update * cd72e4f å 餿¥è¯¢æ§è½ä¼å * 6bddc95 MySQLæ»ç»æ´ç * f8ace0e java常è§å ³é®åæ»ç» * 0c4efeb å é¤android * 4844de5 mysqlæ§è¡è®¡å * 635c140 redisåå¸å¼é * 7b65bc3 update * e563eec update * 67e1cf7 update readme * 218f353 è°æ´ç®å½ç»æ * 9428314 æ´çJavaåºç¡å 容 ``` `git log --since=2.weeks` æç §æ¶é´ä½éå¶ã ## çæ¬åé çæ¬åé使ç¨`git reset`å½ä»¤ã ```bash git reset --hard commit_id git reset --hard HEAD^ # åéææå 容å°ä¸ä¸ä¸ªçæ¬ git reset --hard HEAD^^ # åéææå 容å°ä¸ä¸ä¸ä¸ªçæ¬ git reset --hard HEAD~100 # åéå°ä¹å第100ä¸ªçæ¬ git reset HEAD readme.txt # ææååºçä¿®æ¹æ¤éæï¼unstageï¼, éæ°æ¾å°å·¥ä½åº ``` ## stash å°æªæäº¤çä¿®æ¹ä¿åèµ·æ¥ãç¨äºåç»æ¢å¤å½åå·¥ä½ç®å½ã ```bash git stash git stash pop stash@{id} //æ¢å¤åå é¤ git stash apply stash@{id} //æ¢å¤åä¸å é¤ï¼éæå¨å é¤ git stage drop git stash list //æ¥çstash å表 git stash show -p stash@{0} //æ¥çstashå ·ä½å 容ï¼-pæ¥çdiffï¼stash@{0}å¯ä»¥çç¥ ``` ## rmåmv `git rm readme.md`ï¼æä»¶æªè¢«ä¿®æ¹è¿ï¼ä»æååºç§»é¤æä»¶ï¼ç¶åæäº¤ï¼ç¸å½äº `rm readme.md`å`git add .`ãå¦æåªæ¯ç®åå°ä»å·¥ä½ç®å½ä¸æå·¥å 餿件ï¼è¿è¡ git status æ¶å°±ä¼å¨ âChanges not staged for commitâã `git rm --cached README.md`ï¼è®©æä»¶ä¿çå¨å·¥ä½åºï¼ä½æ¯ä¸æ³è®© Git ç»§ç»è·è¸ªãå¯ä»¥ä½¿ç¨ --cached é项æ¥å®ç°ãæä»¶è¢«ä¿®æ¹è¿ï¼è¿æ²¡ææ¾è¿æååºï¼åå¿ é¡»è¦ç¨å¼ºå¶å é¤é项 -f ï¼ä»¥é²æ¢è¯¯å è¿æ²¡ææ·»å å°æååºçæ°æ®ï¼è¿æ ·çæ°æ®ä¸è½è¢« Git æ¢å¤ã git rm æ¯ææ£å表达å¼ï¼ ```bash git rm log/\*.log ``` 对æä»¶æ¹åï¼ ```bash git mv README.md README ``` ç¸å½äºè¿è¡ä¸ä¸ä¸æ¡å½ä»¤ï¼ ```bash mv README.md README git rm README.md git add README ``` ## å¿½ç¥æä»¶ .gitignore åªè½å¿½ç¥æªè·è¸ªç¶æçæä»¶ã 妿è¿ç¨ä»åºå·²ç»æäºlogsæä»¶å¤¹ï¼ä½¿ç¨ä»¥ä¸å½ä»¤å¯ä»¥å 餿件çè·è¸ªç¶æã ```bash git rm --cached logs/xx.log ``` æ¤æ¶æ¬å°å·¥ä½åºä¿®æ¹è¿å¨ãç¶åæ´æ° .gitignore æä»¶ï¼æå使ç¨ä¸é¢çå½ä»¤å é¤è¿ç¨ä»åºå¯¹åºçæä»¶ã ```bash git add . & git commit -m "xx" & git push ``` ### skip-worktreeåassume-unchanged skip-worktreeï¼ - skip-worktree å¯ä»¥å®ç°ä¿®æ¹æ¬å°æä»¶ä¸ä¼è¢«æäº¤ï¼ä½åå¯ä»¥æåææ°æ´æ¹çéæ±ãéç¨äºä¸äºä¸ç»å¸¸åå¨ï¼ä½æ¯å¿ é¡»æ¬å°å设置çæä»¶ã ```bash git update-index --skip-worktree [file] ``` - åæ¶skip-worktreeï¼ ```bash git update-index --no-skip-worktree [file] ``` - æ¥ç skip-worktree åè¡¨ï¼ ```bash git ls-files -v | grep '^S\ ' ``` assume-unchanged: - 该å½ä»¤åªæ¯å设æä»¶æ²¡æåå¨ï¼ä½¿ç¨resetæ¶ï¼ä¼å°æä»¶ä¿®æ¹åå»ãå½è¿ç¨ä»åºç¸åºçæä»¶è¢«ä¿®æ¹æ¶ï¼pullæ´æ°ä¹åï¼--assume-unchanged ä¼è¢«æ¸ é¤ã ```bash git update-index --assume-unchanged [file] ``` - åæ¶å¿½ç¥ï¼ ```bash git update-index --no-assume-unchanged file/path ``` - æ¥ç忽ç¥äºåªäºæä»¶ï¼ ```bash git ls-files -v | grep '^h\ ' ```