本篇爲廖雪峯的官方網站Git教程的學習筆記,完整版可鏈接去學習。
版本庫的創建
初始化一個Git倉庫,使用git init
命令。
添加文件到Git倉庫,分兩步:
第一步,使用命令
git add <file>
,注意,可反覆多次使用,添加多個文件;第二步,使用命令
git commit -m "註釋"
,完成。
版本管理
要隨時掌握工作區的狀態,使用git status
命令。
如果git status
告訴你有文件被修改過,用git diff <file name>
可以查看修改內容。
HEAD
指向的版本就是當前版本,上一個版本就是HEAD^
,上上一個版本就是HEAD^^
,上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100
。
把當前版本回退到上一個版本,就可以使用git reset --hard HEAD^
命令。
Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id
如git reset --hard 3628164
。
穿梭前,用git log
可以查看提交歷史,以便確定要回退到哪個版本。
如果嫌輸出信息太多,看得眼花繚亂的,可以試試加上--pretty=oneline
參數
要重返未來,用git reflog
查看命令歷史,以便確定要回到未來的哪個版本。
場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout -- file
。
場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file
,就回到了場景1,第二步按場景1操作。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。
刪錯文件了,版本庫裏有的話,可以輕鬆地把誤刪的文件恢復到最新版本git checkout -- test.txt
。git checkout
其實是用版本庫裏的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。
命令git rm
用於刪除一個文件。如果一個文件已經被提交到版本庫,那麼你永遠不用擔心誤刪,但是要小心,你只能恢復文件到最新版本,你會丟失最近一次提交後你修改的內容。
遠程倉庫
本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的,需要一點設置:
- 第1步:創建SSH Key。在用戶主目錄下,看看有沒有
.ssh
目錄,如果有,再看看這個目錄下有沒有id_rsa
和id_rsa.pub
這兩個文件,如果已經有了,可直接跳到下一步。如果沒有,打開Shell(Windows下打開Git Bash),創建SSH Key:
$ ssh-keygen -t rsa -C "[email protected]"
需要把郵件地址換成你自己的郵件地址,然後一路回車,使用默認值即可,由於這個Key也不是用於軍事目的,所以也無需設置密碼。
如果一切順利的話,可以在用戶主目錄裏找到.ssh
目錄,裏面有id_rsa
和id_rsa.pub
兩個文件,這兩個就是SSH Key的祕鑰對,id_rsa
是私鑰,不能泄露出去,id_rsa.pub
是公鑰,可以放心地告訴任何人。
- 第2步:登陸GitHub,打開“Account settings”,“SSH Keys”頁面然後,點“Add SSH Key”,填上任意Title,在Key文本框裏粘貼id_rsa.pub文件的內容,點“Add Key”,就應該看到已經添加的Key。
要關聯一個遠程庫,使用命令
git remote add origin git@server-name:path/repo-name.git
;關聯後,使用命令
git push -u origin master
第一次推送master
分支的所有內容;此後,每次本地提交後,只要有必要,就可以使用命令
git push origin master
推送最新修改;要克隆一個倉庫,首先必須知道倉庫的地址,然後使用git clone命令克隆。
> Git支持多種協議,包括https,但通過ssh支持的原生git協議速度最快。
> 例:git clone [email protected]:name/gitskills.git
分支管理
Git鼓勵大量使用分支:
查看分支:git branch
創建分支:git branch <name>
切換分支:git checkout <name>
創建+切換分支:git checkout -b <name>
合併某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
當Git無法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。
用git log --graph
或git log --graph --pretty=oneline --abbrev-commit
命令可以看到分支合併圖。
合併分支時,加上--no-ff
參數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併,而fast forward合併就看不出來曾經做過合併。
修復bug時,我們會通過創建新的bug分支進行修復,然後合併,最後刪除;
當手頭工作沒有完成時,先把工作現場git stash
一下,然後去修復bug,修復後,再git stash pop
,回到工作現場。
開發一個新feature,最好新建一個分支;
如果要丟棄一個沒有被合併過的分支,可以通過git branch -D <name>
強行刪除。
因此,多人協作的工作模式通常是這樣:
首先,可以試圖用
git push origin branch-name
推送自己的修改;如果推送失敗,則因爲遠程分支比你的本地更新,需要先用
git pull
試圖合併;如果合併有衝突,則解決衝突,並在本地提交;
沒有衝突或者解決掉衝突後,再用
git push origin branch-name
推送就能成功!如果
git pull
提示“no tracking information”,則說明本地分支和遠程分支的鏈接關係沒有創建,用命令git branch --set-upstream branch-name origin/branch-name
。
查看遠程庫信息,使用git remote -v
;
本地新建的分支如果不推送到遠程,對其他人就是不可見的;
從本地推送分支,使用git push origin branch-name
,如果推送失敗,先用git pull
抓取遠程的新提交;
在本地創建和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name
,本地和遠程分支的名稱最好一致;
建立本地分支和遠程分支的關聯,使用git branch --set-upstream branch-name origin/branch-name
;
從遠程抓取分支,使用git pull
,如果有衝突,要先處理衝突。
標籤
命令git tag <name>
用於新建一個標籤,默認爲HEAD
,也可以指定一個commit id
;
git tag -a <tagname> -m "blablabla..."
可以指定標籤信息;
git tag -s <tagname> -m "blablabla..."
可以用PGP簽名標籤;
命令git tag
可以查看所有標籤。
命令git push origin <tagname>
可以推送一個本地標籤;
命令git push origin --tags
可以推送全部未推送過的本地標籤;
命令git tag -d <tagname>
可以刪除一個本地標籤;
命令git push origin :refs/tags/<tagname>
可以刪除一個遠程標籤。
自定義
忽略某些文件時,需要編寫.gitignore
;
.gitignore
文件本身要放到版本庫裏,並且可以對.gitignore
做版本管理!
我們只需要敲一行命令以後st就表示status:
$ git config --global alias.st status