本文通過學習廖雪峯老師的git教程整理而成,文章幾處引用教程中的圖,侵刪,老師的git教程鏈接:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
概念簡單介紹
在A目錄使用git進行版本管理,A目錄即爲工作區,我們在工作區上面操作文件(創建、修改、刪除等等),A目錄下的隱藏目錄.git是版本庫,.git目錄下主要有暫存區(stage)和當前分支(默認的git會自動創建master分支,不指定時當前分支指向master)兩部分,如下圖
常用操作
- 在指定目錄下創建版本庫:
cd <DIR> git init
- 創建一個新目錄,並創建版本庫:
git init <DIR>
- 將文件添加至版本庫:
git add <FILE> //將文件修改添加到暫存區中; git commit -m 'MESSAGE' //將stage中的所有修改提交到當前分支上;
- 查看目錄文件狀態是否與版本庫一致:
git status
- 查看目錄文件與版本庫中的不同點:
git diff <FILE>
- 查看提交日誌(可用於版本回滾):
git log
- 回滾至某個版本:
git reset <commit_id>
(回滾至A版本後,再次git log時沒法查到A版本之後的版本的commit id,此時如果想回到A版本之後的版本B時,可使用git reflog查看B版本的commitid)
- 撤銷工作區的修改:
git checkout -- <FILE>
結果說明:
當FILE修改後未add到暫存區時,此時撤銷結果會將回到跟版本庫中的狀態。
當FILE已經add到暫存區後,又對FILE進行修改,此時撤銷結果會回到跟暫存區一樣的狀態。
總結:先查看暫存區中是否有FILE,有則將暫存區中的FILE狀態同步到工作區,否則將當前版本的FILE狀態同步到工作區 - 撤銷暫存區中的修改:
git reset HEAD <FILE>
結果說明:
暫存區中沒有FILE的修改,工作區FILE還是保持修改狀態的。 - 刪除文件三步驟:
rm <FILE> //刪除工作區中的FILE git rm <FILE> //刪除版本庫中的FILE git commit -m 'MESSAGE' //提交修改
(誤刪時,只需git checkout -- <FILE>即可恢復文件)
遠程管理
將本地git倉庫推送同步到遠程倉庫
- 在github上創建一個新倉庫(此時爲空的)
- 將遠程庫和本地庫關聯起來
git remote add origin [email protected]:lzs666/gittest.git
(origin:遠程庫的名稱,[email protected]:lzs666/gittest.git:在github上創建的新倉庫的地址)
- 本地庫的所有內容推送到遠程庫上
git push -u origin master
(會將本地庫的master分支內容推送到遠程庫的master分支上,-u參數會將本地的master分支與遠程庫的master分支關聯起來,之後再push就不需要添加這個參數了)
推送本地分支內容同步到遠程git push origin <name> //將本地指定<name>分支同步到遠程庫的<name>分支
抓取分支
使用git clone時,本地默認只能看到master分支,若想在dev上開發,必須手動抓取origin的dev分支到本地。git checkout -b dev origin/dev
之後開發完push到origin的dev分支上:
git push origin dev
若此時push時,若發現已經有其他人push過了且與你推送的內容有衝突,會導致推送失敗,解決如下:
- 指定本地dev分支與遠程origin/dev分支的鏈接
git branch --set-upstream-to=origin/dev dev
- 將最新的origin/dev抓取下來,此時工作區內容會變成origin/dev的狀態
git pull
- 修改後commit,再push
分支管理
- 創建一個分支:
git branch dev
- 切換到指定分支(切換後,會將工作區同步到dev分支的狀態):
git checkout dev
- 創建dev分支並切換到dev分支上(相當於上面兩個步驟):
git checkout -b dev
- 查看當前所在分支:
git branch //會列出所有分支,當前分支面前會有一個*號
- 合併指定分支到當前分支:
git merge dev
說明:
git merge dev執行時,只是將當前head指針移動到dev所在的位置,如下圖
此時如果將dev分支刪除,之後git log無法查看分支歷史,所以合併時可使用--no-ff參數修改合併模式,在merge時不是簡單移動指針,而是生成一個commit至內容與dev一致。這種方式merge後便可通過git log查看分支合併歷史。git merge --no-ff -m 'COMMIT_MESSAGE' dev
此時的merge過程如下圖,其中結點1和結點2的內容是一樣的。
- 刪除指定分支(當前分支不能是dev):
git branch -d dev
-
刪除一個沒有被合併過的分支
git branch -D <name>
標籤管理
標籤作用:對應一個commitid,方便版本跳轉。
標籤特性:一個標籤對應一個commit版本,同一分支上不能出現兩個相同的標籤名。 - 創建標籤
git tag <tagname> //爲當前版本庫中最新版本打上標籤,即當前HEAD指向的版本 git tag <tagname> <commitid> //爲指定版本打上標籤 git tag -a <tagname> -m "message" //打上標籤時添加說明信息
- 查看指定標籤的信息
git show <tagname>
- 查看已打標籤
git tag
- 刪除指定標籤
git tag -d <tagname>
- 推送指定標籤到遠程
git push origin <tagname>
- 推送全部未推送到遠程的標籤
git push origin --tags
- 當標籤已經被推送到遠程,此時想刪除
1、git tag -d <tagname> 刪除本地的標籤 2、git push origin :refs/tags/<tagname> 刪除遠程標籤
特殊場景
當由於某種情況無法提交,此時又得新建一個分支處理其他事情時,可使用stash功能將工作區的改變先儲存起來,等其他事情處理完後再恢復現場。
假設當前master分支的test.txt內容如下:
cat test.txt
this is for git test in master
當前我們在dev分支,且將test.txt內容修改如下:
cat text.txt
this is for git test in dev
但我們還不能提交改變。此時要求我們新建一個新的分支去處理其他事情。
處理方法如下:
- 儲藏工作區的改變
git stash
執行後,工作區狀態會變成當前分支最新版本的狀態,即test.txt內容爲"this is for git test in master",之前所做的改變被儲藏起來了。
- 創建新分支區處理其他事情。
git checkout -b forotherthing
- 處理完後切回dev分支
git checkout dev
- 恢復現場,並將stash內容刪除
git stash pop
說明:
修改A文件--->git stash--->再次修改A文件--->git stash
此時git stash list會查到多個stash,可通過git stash apply stash@{N}恢復指定的stash,從而恢復到指定的狀態。git stash drop 刪除stash內容
歡迎掃碼關注公衆號“KeepCode”,分享更多技術好文,並提供技術電子書籍免費下載,每天進步一點點~~~~