本篇文章是摘抄廖雪峰老師 git 教程中的小結(jié)部分
其 git 教程的傳送門:
Git教程
Git 的官方網(wǎng)站:
http://git-scm.com
國(guó)外網(wǎng)友制作的 Git Cheat Sheet,建議打印出來備用:
Git Cheat Sheet

圖片來源于網(wǎng)絡(luò)
1. 創(chuàng)建版本庫(kù)
- 初始化一個(gè) Git 倉(cāng)庫(kù),使用 git init 命令。
- 添加文件到 Git 倉(cāng)庫(kù),分兩步:
(1)第一步,使用命令 git add <file>,注意,可反復(fù)多次使用,添加多個(gè)文件;
(2)第二步,使用命令 git commit,完成。
2. 時(shí)光穿梭機(jī)
- 要隨時(shí)掌握工作區(qū)的狀態(tài),使用 git status 命令。
- 如果 git status 告訴你有文件被修改過,用 git diff 可以查看修改內(nèi)容。
2.1 版本退回
- HEAD 指向的版本就是當(dāng)前版本,因此,Git 允許我們?cè)诎姹镜臍v史之間穿梭,使用命令 git reset --hard commit_id。
- 穿梭前,用 git log 可以查看提交歷史,以便確定要回退到哪個(gè)版本。
- 要重返未來,用 git reflog 查看命令歷史,以便確定要回到未來的哪個(gè)版本。
2.2 工作區(qū)和暫存區(qū)
2.3 管理修改
- 每次修改,如果不add到暫存區(qū),那就不會(huì)加入到 commit 中。
2.4 撤銷修改
- 場(chǎng)景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容,想直接丟棄工作區(qū)的修改時(shí),用命令 git checkout -- file(注:git checkout -- file 命令中若沒有 --,就變成了“切換到另一個(gè)分支”的命令)。
- 場(chǎng)景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容,還添加到了暫存區(qū)時(shí),想丟棄修改,分兩步,第一步用命令 git reset HEAD file,就回到了場(chǎng)景1,第二步按場(chǎng)景1操作。
- 場(chǎng)景3:已經(jīng)提交了不合適的修改到版本庫(kù)時(shí),想要撤銷本次提交,參考版本回退一節(jié),不過前提是沒有推送到遠(yuǎn)程庫(kù)。
2.5 刪除文件
- 確實(shí)要從版本庫(kù)中刪除該文件,那就用命令 git rm file 刪掉,并且 git commit;
- 若刪錯(cuò)了,可以用 ** git checkout -- file** 把誤刪的文件從版本庫(kù)里恢復(fù)到最新版本
(git checkout其實(shí)是用版本庫(kù)里的版本替換工作區(qū)的版本,無論工作區(qū)是修改還是刪除,都可以“一鍵還原”)。 - 命令 git rm 用于刪除一個(gè)文件。如果一個(gè)文件已經(jīng)被提交到版本庫(kù),那么你永遠(yuǎn)不用擔(dān)心誤刪,但是要小心,你只能恢復(fù)文件到最新版本,你會(huì)丟失最近一次提交后你修改的內(nèi)容。
3. 遠(yuǎn)程倉(cāng)庫(kù)
3.1 添加遠(yuǎn)程庫(kù)
- 要關(guān)聯(lián)一個(gè)遠(yuǎn)程庫(kù),使用命令 git remote add origin git@server-name:path/repo-name.git;
- 關(guān)聯(lián)后,使用命令 git push -u origin master 第一次推送master分支的所有內(nèi)容;
- 此后,每次本地提交后,只要有必要,就可以使用命令 git push origin master 推送最新修改;
3.2 從遠(yuǎn)程庫(kù)克隆
- 要克隆一個(gè)倉(cāng)庫(kù),首先必須知道倉(cāng)庫(kù)的地址,然后使用 git clone 命令克隆。
- Git 支持多種協(xié)議,包括 https,但通過 ssh 支持的原生 git 協(xié)議速度最快。
4. 分支管理
4.1 創(chuàng)建與合并分支
- 查看分支:git branch
- 創(chuàng)建分支:git branch <name>
- 切換分支:git checkout <name>
- 創(chuàng)建+切換分支:git checkout -b <name>
- 合并某分支到當(dāng)前分支:git merge <name>
- 刪除分支:git branch -d <name>
4.2 解決沖突
- 當(dāng) Git 無法自動(dòng)合并分支時(shí),就必須首先解決沖突。解決沖突后,再提交,合并完成。
- 用 git log --graph 命令可以看到分支合并圖。
4.3 分支管理策略
- 合并分支時(shí),加上 --no-ff 參數(shù)就可以用普通模式合并,合并后的歷史有分支,能看出來曾經(jīng)做過合并,而 fast forward 合并就看不出來曾經(jīng)做過合并。
4.4 Bug分支
- 修復(fù) bug 時(shí),我們會(huì)通過創(chuàng)建新的 bug分支 進(jìn)行修復(fù),然后合并,最后刪除;
- 當(dāng)手頭工作沒有完成時(shí),先把工作現(xiàn)場(chǎng) git stash 一下,然后去修復(fù)bug,修復(fù)后,再 git stash pop,回到工作現(xiàn)場(chǎng)。
4.5 Feature分支
- 開發(fā)一個(gè)新 feature,最好新建一個(gè)分支;
- 如果要丟棄一個(gè)沒有被合并過的分支,可以通過 git branch -D <name> 強(qiáng)行刪除。
4.6 多人協(xié)作
- 查看遠(yuǎn)程庫(kù)信息,使用 git remote -v;
- 本地新建的分支如果不推送到遠(yuǎn)程,對(duì)其他人就是不可見的;
- 從本地推送分支,使用 git push origin branch-name,如果推送失敗,先用 git pull 抓取遠(yuǎn)程的新提交;
- 在本地創(chuàng)建和遠(yuǎn)程分支對(duì)應(yīng)的分支,使用 git checkout -b branch-name origin/branch-name,本地和遠(yuǎn)程分支的名稱最好一致;
- 建立本地分支和遠(yuǎn)程分支的關(guān)聯(lián),使用 git branch --set-upstream branch-name origin/branch-name;
- 從遠(yuǎn)程抓取分支,使用 git pull,如果有沖突,要先處理沖突。
5. 標(biāo)簽管理
5.1 創(chuàng)建標(biāo)簽
- 命令 git tag <name> 用于新建一個(gè)標(biāo)簽,默認(rèn)為 HEAD,也可以指定一個(gè)commit id;
- git tag -a <tagname> -m "blablabla..."可以指定標(biāo)簽信息;
- git tag -s <tagname> -m "blablabla..."可以用PGP簽名標(biāo)簽;
- 命令 git tag 可以查看所有標(biāo)簽。
5.2 操作標(biāo)簽
- 命令 git push origin <tagname> 可以推送一個(gè)本地標(biāo)簽;
- 命令 git push origin --tags 可以推送全部未推送過的本地標(biāo)簽;
- 命令 git tag -d <tagname> 可以刪除一個(gè)本地標(biāo)簽;
- 命令 git push origin :refs/tags/<tagname> 可以刪除一個(gè)遠(yuǎn)程標(biāo)簽。
6. 自定義Git
6.1 忽略特殊文件
- 忽略某些文件時(shí),需要編寫 .gitignore;
- .gitignore 文件本身要放到版本庫(kù)里,并且可以對(duì) .gitignore 做版本管理!
6.2 配置別名
給Git配置好別名,就可以輸入命令時(shí)偷個(gè)懶
6.3 搭建 Git 服務(wù)器
- 搭建 Git 服務(wù)器非常簡(jiǎn)單,通常10分鐘即可完成;
- 要方便管理公鑰,用 Gitosis;
- 要像 SVN 那樣變態(tài)地控制權(quán)限,用 Gitolite。