Git學習筆記&總結
原文廖老師的Git教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
一、Git的安裝
1.在Windows上安裝Git
從https://git-scm.com/downloads下載,然後按默認選項安裝即可。
2.安裝完後的簡單設置
安裝完成後,還需要最後一步設置,在命令?輸?:
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
二、創建版本庫
版本庫(repository)又名倉庫,可以簡單理解成一個目錄,這個目錄面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。
首先在一個合適的位置創建一個空目錄:$ mkdir GitRepository
進入該目錄後,執行命令:$ git init
三、版本的回退與切換
1、添加文件到Git倉庫
第一步添加:git add readme.txt
第二步提交:git commit –m “wrote a readme file”
註:首先需要在git倉庫目錄下新建一個readme.txt文件;
執行第一步後,沒有消息顯示說明添加成功,使用add可以一次提交多個文件;
-m後面的參數是對本次提交的說明;
$ git status可以命令查看當前Git倉庫狀態,有哪些文件需要add和commit;
$ git diff 可以查看修改過的內容;
2、版本回退
應用場景:文件丟失的情況下,從最近的一次commit中恢復文件。
$ git log 以倒序的方式查看提交日誌;
$ git reset --hard HEAD^ 回退到當前版本的上一個版本;
$ git reset --hard “commitID”回退到具體哪次提交,commitID代表具體commit的版本號;
$ git reflog 查看每一次命令,第一列顯示有commit版本號
3、工作區和版本庫
工作區:我們看到的目錄,剛剛我們創建的GitRepository文件夾;
版本庫:我們執行git init後在生成的隱藏的.git文件夾;
暫存區:.git目錄下有一個stage或index目錄即為暫存區;
4、管理修改
Git跟蹤並管理的是修改,而非文件。未add到暫存區的修改是不能夠提交到版本庫的;
$ git diff HEAD -- readme.txt 查看工作區和版本庫裏最新版本的區別
5、撤銷修改
應用場景:把修改錯誤的文件add到了暫存區,但還未commit到版本庫,想撤回本次add。
(1)$ git reset HEAD readme.txt
把暫存區的修改撤銷掉,重新放回到工作區。
(2)$ git checkout -- readme.txt
丟棄工作區的修改,讓該文件回退到最近一次的git add或git commit時的狀態這裏有兩種情況:
一種是readme.txt修改後還沒有add到暫存區,命令執行後回到和版本庫一樣的狀態。
二種是readme.txt已經添加到暫存區,之後又做了修改,命令執行後,文件恢復為添加到暫存區的狀態。
6、刪除文件
(1)應用場景:確定要從版本庫中刪除某個文件
第一步:$ git rm readme.txt
第二步:$ git commit –m “delete readme.txt”
(2)應用場景:工作區誤刪某文件,可以從版本庫中恢復
$ git checkout – readme.txt
四、遠程倉庫
1、添加公鑰到github
首先註冊GitHub賬號並登錄,然後將自己的公鑰添加到GitHub上。公鑰即電腦用戶名目錄下的.ssh目錄下id_rsa.pub文件裏的內容。如果沒有該目錄,需要我們手動生成:
$ ssh-keygen -t rsa -C "[email protected]"
然後在github裏點擊account setting --> SSH Keys à Add SSH Key --> title隨意寫,將密鑰粘貼進去。
2、添加遠程倉庫
第1步:在GitHub上創建一個遠程庫:右上角“+” --> “New repositories ”;
第2步:將本地庫與遠程庫關聯:
$ git remote add origin [email protected]:你的用戶名/learngit.git
註:遠程庫的名字就是origin,這是Git默認的叫法,也可以改成別的。
第3步:將本地內容推送到遠程庫:
$ git push -u origin master
註:用 git push命令,實際上是把當前分支master推送到遠程。由於遠程庫是空的,我們第一次推送master分支時,加上了 -u參數,Git不但會把本地的master分支內容推送的遠程master分支,還會把本地的master分支和遠程的master分支關聯起來,在以後的推送或者拉取時就可以簡化命令。
3、從遠程庫克隆
執行命令:$ git clone [email protected]:你的用戶名/gitskills.git
註:Git支持多種協議,還可以用 https://github.com/huozf/gitskills.git這樣的地址。默認的git://使用ssh,但也可以使用https等其他協議。使用https除了速度慢以外,還有個最大的麻煩是每次推送都必須輸入口令,但是在某些只開放http端口的公司內部就無法使用ssh協議而只能用https。
五、分支管理
1、創建與合並分支
Git都把它們串成一條時間線,這條時間線就是一個分支。截?止到目前,只有一條時間線,在Git裏,這個分支叫主分支,即 master分支。HEAD嚴格來說不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當前分支。一開始的時候,master分支是一條線,Git用master指向最新的提交,再用HEAD指向master,就能確定當前分支,以及當前分支的提交點:
(1) 創建並切換分支:$ git checkout –b dev
當我們創建新的分支dev時,Git新建了一個指針叫dev,令dev指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上:
註:“-b”參數表示創建並切換分支,相當於命令(2)、(3)之和。
(2) 創建分支:$ git branch dev
(3) 切換分支:$ git checkout dev
(4) 查看當前分支: $ git branch
註:該命令會列出所有分支,前邊標有 * 的表示當前所在分支。
(5) 合並指定分支到當前分支:$ git merge master
(6) 刪除分支: $ git branch –d dev
2、解決沖突
當我們新建一個分支後,master分支新建分支各自都分別有新的提交,這種情況下,Git?無法執行“快速合並”,只能試圖把各自的修改合並起來,但這種合並就可能會有沖突
這時候需要我們手動解決沖突,然後才能合並。合並後,查看分支合並圖:
$ git log --graph --pretty=oneline --abbrev-commit
3、分支管理策略
通常,合並分支時,如果可能,Git會用“Fast forward”模式,但這種模式下,刪除分支後,會丟掉分支信息。如果要強制禁用“Fast forward”模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支信息。
例如,新建並切換一個分支dev,修改文件並提交。然後切換回master分支,將dev分支合並到master分支:
$ git merge --no-ff -m "merge with no-ff" dev
註:“—no-ff”表示禁用“Fast forword”模式。
此時,分支合並圖變成:
4、Bug分支
支上合並就可以了。所以,團隊合作的分支看起來就像這樣:
應用場景:當前工作還未完成且不能夠提交,但上級要求立即修復項目中出現的bug,需要我們停下手頭的工作。
(1)$ git stash 將“工作現場”儲存起來;
(2)$ git stash list 列出所有已儲存的“工作現場”;
(3)$ git stash pop 恢復“工作現場”,且將stash裏的最上一層內容刪除,等同於(4)、(5)命令之和;
(4)$ git stash apply 恢復“工作現場”,但stash裏的內容並未刪除;
(5)$ git stash drop 刪除最上一層“工作現場”;
(6) $ git stash apply stash@{0} 恢復指定的stash內容;
5、多人協作
(1) $ git remote 查看遠程庫信息;
(2) $ git remote –v 顯示遠程庫更詳細信息;
(3) $ git push origin branch_name 推送到遠程庫的指定分支
(4) $ git pull 從遠程庫拉取更新
(5) git branch --set-upstream dev origin/<branch> 將本地庫的分支與遠程庫指定分支關聯起來
註:多人協作的工作模式
1. 首先,可以試圖用 git push origin branch-name推送?自己的修改;
2. 如果推送失敗,則因為遠程分支比你的本地更新,需要先用 git pull試圖合並;
3. 如果合並有沖突,則解決沖突,並在本地提交;
4. 沒有沖突或者解決掉沖突後,再用$ git push origin branch-name推送就能成功!
5. 如果git pull提示“no tracking information”,則說明本地分支和遠程分支的鏈接關系沒有創建,用命令git branch --set-upstream branch-name origin/branch-name。
六、標簽管理
1、創建標簽
(1) $ git tag v1.0 默認給最近以此提交創建標簽
(2) $ git tag v0.9 66756 給指定的提交創建標簽,66756為提交id
(3) $ git tag -a v0.1 -m "version 0.1 released" 3628164 給指定的提交創建標簽,-a 指定標簽名,-m指定標簽信息
(4) $ git tag 列出所有標簽
(5) $ git show v0.1 查看指定標簽的具體信息
2、操作標簽
(1) $ git tag -d v0.1 刪除指定標簽
(2) $ git push origin v1.0 推送某個標簽到遠程
(3) $ git push origin --tags 一次性推送全部尚未推送到遠程的本地標簽
(4) 如果標簽已經推送到遠程,要刪除遠程標簽:
① 先從本地庫刪除:$ git tag -d v0.9
② 再從遠程庫刪除:$ git push origin :refs/tags/v0.9
Git學習筆記&總結