一、Git安裝
二、生成密鑰
??? Git關(guān)聯(lián)遠(yuǎn)端倉(cāng)庫(kù)時(shí)候需要提供公鑰,本地保存私鑰,每次與遠(yuǎn)端倉(cāng)庫(kù)交互時(shí)候,遠(yuǎn)端倉(cāng)庫(kù)會(huì)用公鑰來驗(yàn)證交互者身份。
??? 生成密鑰ssh-keygen -t rsa -C "email address",根據(jù)提示需要選擇密鑰存放路徑。
??? 生成密鑰后,在路徑下生成兩個(gè)文件id_rsa、id_rsa.pub,其中id_rsa文件保存的是私鑰,放在本地,id_rsa.pub文件是公鑰,需要將公鑰內(nèi)容上傳到遠(yuǎn)端倉(cāng)庫(kù),Mac 下直接用文本編輯打開公鑰文件。
三、配置提交文件時(shí)的用戶信息
git config --global user.name "name"
git config --global user.email "email address"
配置信息也可以修改,指令與上面的指令相同。使用git config --list查看Git的配置信息。
四、本地關(guān)聯(lián)遠(yuǎn)端倉(cāng)庫(kù)
- 打開本地文件夾,執(zhí)行
git init命令,初始化文件夾作為本地的一個(gè)倉(cāng)庫(kù)。 - 將遠(yuǎn)端文件 clone 到本地目錄,
git clone 遠(yuǎn)端文件URL。
五、常用指令

名詞解釋:
Workspace:工作區(qū)
Index / Stage:暫存區(qū)
Repository:倉(cāng)庫(kù)區(qū)(或本地倉(cāng)庫(kù))
Remote:遠(yuǎn)程倉(cāng)庫(kù)生成密鑰
ssh-keygen -t rsa -C "email address"配置
// 顯示當(dāng)前Git 配置
git config --list
// 編輯Git配置文件
git config -e --global
// 配置提交文件時(shí)的用戶信息
git config --global user.name "name"
git config --global user.email "email address"
- 新建一個(gè)倉(cāng)庫(kù)
// 在當(dāng)前目錄新建一個(gè) Git 倉(cāng)庫(kù)
git init
// 下載項(xiàng)目
git clone 遠(yuǎn)端文件URL
- 添加/刪除文件
// 添加指定文件到暫存區(qū)
git add filename1 filename2 .....
// 添加指定目錄及其子目錄到暫存區(qū)
git add dir
// 刪除工作區(qū)文件,并且將這次刪除放入暫存區(qū)
git rm filename1 filename2 .....
// 停止追蹤指定文件,但該文件會(huì)保留在工作區(qū)
git rm --cached filename
- 代碼提交
// 提交暫存區(qū)到倉(cāng)庫(kù)區(qū)
git commit -m "message"
// 提交暫存區(qū)的指定文件到倉(cāng)庫(kù)區(qū)
git commit filename1 filename2 ..... -m "message"
// 提交工作區(qū)自上次commit之后的變化,直接到倉(cāng)庫(kù)區(qū)
git commit -a
// 提交時(shí)顯示所有diff信息
git commit -v
// 使用一次新的commit,替代上一次提交
// 如果代碼沒有任何新變化,則用來改寫上一次commit的提交信息
git commit --amend -m "message"
// 重做上一次commit,并包括指定文件的新變化
git commit --amend filename1 filename2 .....
- 分支
// 列出所有本地分支
git branch
// 列出所有遠(yuǎn)程分支
git branch -r
// 列出所有本地分支和遠(yuǎn)程分支
git branch -a
// 新建一個(gè)分支,但依然停留在當(dāng)前分支
git branch branchname
// 新建一個(gè)分支,并切換到該分支
git checkout -b branchname
// 新建一個(gè)分支,指向指定commit
git branch branchname commitname
// 新建一個(gè)分支,與指定的遠(yuǎn)程分支建立追蹤關(guān)系
git branch --track branchname remotebranch
// 切換到指定分支,并更新工作區(qū)
git checkout branchname
// 切換到上一個(gè)分支
git checkout -
// 建立追蹤關(guān)系,在現(xiàn)有分支與指定的遠(yuǎn)程分支之間
git branch --set-upstream branchname remotebranch
// 合并指定分支到當(dāng)前分支
git merge branchname
// 選擇一個(gè)commit,合并進(jìn)當(dāng)前分支
git cherry-pick commitname
// 刪除分支
git branch -D branchname
// 刪除遠(yuǎn)程分支
git push origin --delete branchname
git branch -dr [remote/branch]
- 查看 log
// 顯示有變更的文件
git status
// 顯示當(dāng)前分支的版本歷史
git log
// 顯示commit歷史,以及每次commit發(fā)生變更的文件
git log --stat
// 搜索提交歷史,根據(jù)關(guān)鍵詞
git log -S keyword
// 顯示某個(gè)文件的版本歷史,包括文件改名
git log --follow filename
git whatchanged filename
// 顯示指定文件相關(guān)的每一次diff
git log -p filename
// 顯示過去5次提交
git log -5 --pretty --oneline
// 顯示所有提交過的用戶,按提交次數(shù)排序
git shortlog -sn
// 顯示指定文件是什么人在什么時(shí)間修改過
git blame filename
// 顯示暫存區(qū)和工作區(qū)的差異
git diff
// 顯示暫存區(qū)和上一個(gè)commit的差異
git diff --cached filename
// 顯示工作區(qū)與當(dāng)前分支最新commit之間的差異
git diff HEAD
// 顯示兩次提交之間的差異
git diff [first-branch]...[second-branch]
// 顯示今天你寫了多少行代碼
git diff --shortstat "@{0 day ago}"
// 顯示某次提交的元數(shù)據(jù)和內(nèi)容變化
git show [commit]
// 顯示某次提交發(fā)生變化的文件
git show --name-only [commit]
// 顯示某次提交時(shí),某個(gè)文件的內(nèi)容
git show [commit]: filename
// 顯示當(dāng)前分支的最近幾次提交
git reflog
- 遠(yuǎn)程同步
// 下載遠(yuǎn)程倉(cāng)庫(kù)的所有變動(dòng)
git fetch [remote]
// 顯示所有遠(yuǎn)程倉(cāng)庫(kù)
git remote -v
// 顯示某個(gè)遠(yuǎn)程倉(cāng)庫(kù)的信息
git remote show [remote]
// 增加一個(gè)新的遠(yuǎn)程倉(cāng)庫(kù),并命名
git remote add [shortname] [url]
// 取回遠(yuǎn)程倉(cāng)庫(kù)的變化,并與本地分支合并
git pull [remote] branchname
// 上傳本地指定分支到遠(yuǎn)程倉(cāng)庫(kù)
git push [remote] branchname
// 強(qiáng)行推送當(dāng)前分支到遠(yuǎn)程倉(cāng)庫(kù),即使有沖突
git push [remote] --force
// 推送所有分支到遠(yuǎn)程倉(cāng)庫(kù)
git push [remote] --all
- 撤銷
// 恢復(fù)暫存區(qū)的指定文件到工作區(qū)
git checkout filename
// 恢復(fù)某個(gè)commit的指定文件到暫存區(qū)和工作區(qū)
git checkout [commit] filename
// 恢復(fù)暫存區(qū)的所有文件到工作區(qū)
git checkout .
// 重置暫存區(qū)的指定文件,與上一次commit保持一致,但工作區(qū)不變
git reset filename
// 重置暫存區(qū)與工作區(qū),與上一次commit保持一致
git reset --hard
// 重置當(dāng)前分支的指針為指定commit,同時(shí)重置暫存區(qū),但工作區(qū)不變
git reset [commit]
// 重置當(dāng)前分支的HEAD為指定commit,同時(shí)重置暫存區(qū)和工作區(qū),與指定commit一致
git reset --hard [commit]
// 重置當(dāng)前HEAD為指定commit,但保持暫存區(qū)和工作區(qū)不變
git reset --keep [commit]
// 新建一個(gè)commit,用來撤銷指定commit
// 后者的所有變化都將被前者抵消,并且應(yīng)用到當(dāng)前分支
git revert [commit]
// 暫時(shí)將未提交的變化移除,稍后再移入
git stash
git stash pop
六、遇到的問題
- 拒絕訪問
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
解決方法:ssh-add 私鑰路徑,其中ssh-add命令是把專用密鑰添加到ssh-agent的高速緩存中。
- 執(zhí)行
git branch -a看不到新創(chuàng)建的分支
原因:這條命令并沒有每一次都從遠(yuǎn)程更新倉(cāng)庫(kù)信息。
解決方法:手動(dòng)刷新倉(cāng)庫(kù)信息git fetch origin。