廖雪峯的官方網站http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
Git官方學習網站:
http://git-scm.com/book/zh/v2
一. 本地使用
1.初始化
初始化一個Git倉庫,使用git init
命令。
2.添加文件到Git倉庫,分兩步:
第一步,使用命令git add <file>
,注意,可反覆多次使用,添加多個文件;
第二步,使用命令git commit
,完成。
3.查看代碼狀態和不同
要隨時掌握工作區的狀態,使用git status
命令。
如果git status
告訴你有文件被修改過,用git diff可以查看修改內容。
用git diff HEAD -- readme.txt
命令可以查看工作區和版本庫裏面最新版本的區別
4.版本回退
HEAD指向的版本就是當前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id
。
穿梭前,用git log
可以查看提交歷史,以便確定要回退到哪個版本。
要重返未來,用git reflog
查看命令歷史,以便確定要回到未來的哪個版本。
5.撤銷修改
場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout -- file
。
場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file
,就回到了場景1,第二步按場景1操作。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。
6.刪除文件
命令git rm用於刪除一個文件。如果一個文件已經被提交到版本庫,那麼你永遠不用擔心誤刪,但是要小心,你只能恢復文件到最新版本,你會丟失最近一次提交後你修改的內容。
二. 遠程倉庫
1.SSH KEY 配置
創建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是公鑰,可以放心地告訴任何人。
配置多個公鑰
/*製造第一把公鑰:
ssh-keygen -t rsa -C "[email protected]"
# 設置名稱爲id_rsa_derek
Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa): id_rsa_derek
#添加到SSH agent中
ssh-add id_rsa_derek
製造第二把公鑰:
ssh-keygen -t rsa -C "[email protected]"
# 設置名稱爲id_rsa_ranpop
Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa): id_rsa_ranpop
#添加到SSH agent中
ssh-add id_rsa_ranpop
將id_rsa_derek.pub添加到derek帳號的後臺ssh。
將id_rsa_ranpop.pub添加到ranpop帳號的後臺ssh。
在.ssh目錄下配置config文件:(如果沒有需要自己手動創建)
Host derek
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_derek
Host ranpop
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_ranpop
對於derek帳號下的倉庫:
git clone derek:githubname/repository.git
(原地址是:git@github.com:githubname/repository.git,替換後應該是:derek:githubname/repository.git)
對於ranpop帳號下的倉庫:
git clone ranpop::githubname/repository.git
(原地址是:git@github.com:githubname/repository.git,替換後應該是:ranpop:githubname/repository.git)
測試:
ssh -T derek
Hi derek! You've successfully authenticated, but GitHub does not provide shel l access.
ssh -T ranpop
Hi ranpop! You've successfully authenticated, but GitHub does not provide shel l access.
說明OK。
如果已經使用原地址克隆過了,可以使用命令修改:
git remote set-url origin derek:githubname/repository.git
相關原理:
1、一把公鑰只能被一個GITHUB帳號擁有->因此必須爲不同的帳號創建公鑰。
2、交互時需要本地私鑰與GITHUB帳號的公鑰配對。
因此,要在同一臺電腦上給兩個屬於不同帳號的倉庫提交時,必須在本地創建兩對公/私鑰匙,分別把兩把公鑰給兩個帳號,提交時根據要提交的倉庫所屬帳號選擇相應的本地私鑰即可;
當我們要在一個倉庫上PUSH提交的內容時,使用以上的步驟可以選擇對應的公鑰,GITHUB服務器收到提交的內容時,先解析出倉庫地址,然後從該倉庫的所屬帳號中找到一把能解鎖該提交的公鑰。*/
2.添加遠程庫
要關聯一個遠程庫,使用命令git remote add origin git@server-name:path/repo-name.git
;
關聯後,使用命令git push -u origin master
第一次推送master分支的所有內容;
此後,每次本地提交後,只要有必要,就可以使用命令git push origin master
推送最新修改;
分佈式版本系統的最大好處之一是在本地工作完全不需要考慮遠程庫的存在,也就是有沒有聯網都可以正常工作,而SVN在沒有聯網的時候是拒絕幹活的!當有網絡的時候,再把本地提交推送一下就完成了同步,真是太方便了!
3.從遠程庫克隆
要克隆一個倉庫,首先必須知道倉庫的地址,然後使用git clone命令克隆。
Git支持多種協議,包括https,但通過ssh支持的原生git協議速度最快
三. 分支管理
1.創建分支與合併分支
查看分支:git branch
創建分支:git branch <name>
切換分支:git checkout <name>
創建+切換分支:git checkout -b <name>
合併某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
2.解決衝突
當Git無法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。
用git log --graph
命令可以看到分支合併圖
$ git log --graph --pretty=oneline --abbrev-commit
3.分支管理策略
準備合併dev分支,請注意–no-ff參數,表示禁用Fast forward:
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 +
1 file changed, 1 insertion(+)
因爲本次合併要創建一個新的commit,所以加上-m參數,把commit描述寫進去。
合併後,我們用git log看看分支歷史:
$ git log --graph --pretty=oneline --abbrev-commit
* 7825a50 merge with no-ff
|\
| * 6224937 add merge
|/
* 59bc1cb conflict fixed
...
4.bug分支
修復bug時,我們會通過創建新的bug分支進行修復,然後合併,最後刪除;
當手頭工作沒有完成時,先把工作現場git stash一下,然後去修復bug,修復後,再git stash pop,回到工作現場。
$ git stash
Saved working directory and index state WIP on dev: 6224937 add merge
HEAD is now at 6224937 add merge
現在,用git status查看工作區,就是乾淨的(除非有沒有被Git管理的文件),因此可以放心地創建分支來修復bug。
用git stash list命令看看:
$ git stash list
stash@{0}: WIP on dev: 6224937 add merge
工作現場還在,Git把stash內容存在某個地方了,但是需要恢復一下,有兩個辦法:
一是用git stash apply
恢復,但是恢復後,stash內容並不刪除,你需要用git stash drop
來刪除;
另一種方式是用git stash pop,恢復的同時把stash內容也刪了:
$ git stash pop
# On branch dev
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: hello.py
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: readme.txt
#
Dropped refs/stash@{0} (f624f8e5f082f2df2bed8a4e09c12fd2943bdd40)
再用git stash list
查看,就看不到任何stash內容了:
$ git stash list
你可以多次stash,恢復的時候,先用git stash list
查看,然後恢復指定的stash,用命令:
$ git stash apply stash@{0}
5.新功能分支
開發一個新feature,最好新建一個分支;
如果要丟棄一個沒有被合併過的分支,可以通過git branch -D 強行刪除。
6.多人協作
多人協作的工作模式通常是這樣:
首先,可以試圖用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
,如果有衝突,要先處理衝突。
四. 標籤管理
1.創建標籤
命令git tag <name>
用於新建一個標籤,默認爲HEAD,也可以指定一個commit id;
git tag -a <tagname> -m "blablabla..."
可以指定標籤信息;
git tag -s <tagname> -m "blablabla..."
可以用PGP簽名標籤;
命令git tag
可以查看所有標籤。
2.操作標籤
命令git push origin <tagname>
可以推送一個本地標籤;
命令git push origin --tags
可以推送全部未推送過的本地標籤;
命令git tag -d <tagname>
可以刪除一個本地標籤;
命令git push origin :refs/tags/<tagname>
可以刪除一個遠程標籤。