Git基操
一、git簡介
1.1、git概述
Git是分散式版本控制系統(Distributed Version Control System,簡稱 DVCS) ,分為兩種型別的倉庫:本地倉庫和遠端倉庫。 下載地址:https://git-scm.com/download
-
本地倉庫:是在開發人員自己電腦上的Git倉庫
-
遠端倉庫:是在遠端伺服器上的Git倉庫
1.2、git工作流程
- 從遠端倉庫中克隆程式碼到本地倉庫(git clone)
- 從本地倉庫中checkout程式碼然後進行程式碼修改(checkout)
- 在提交前先將程式碼提交到暫存區(add)
- 提交到本地倉庫。本地倉庫中儲存修改的各個歷史版本(commit)
- 修改完成後,需要和團隊成員共享程式碼時,將程式碼push到遠端倉庫(push)
1.3、Git常用的程式碼託管平臺
我們的遠端倉庫就建立在程式碼託管平臺上,常見的有GitHub,GitLab,還有碼雲等
- itHub( 地址:https://github.com/ )是一個面向開源及私有軟體專案的託管平臺,因為只支援Git 作為唯一的版本庫格式進行託管,故名gitHub
- 碼雲(地址: https://gitee.com/ )是國內的一個程式碼託管平臺,由於伺服器在國內,所以相比於GitHub,碼雲速度會更快
- GitLab (地址: https://about.gitlab.com/ )是一個用於倉庫管理系統的開源專案,使用Git作為程式碼管理工具,並在此基礎上搭建起來的web服務
二、Git常用命令
2.1、環境配置
-
設定使用者資訊
git config --global user.name "name" # 設定git使用者名稱 git config --global user.name "email"# 設定git郵箱
-
檢視使用者的配置資訊
git config --list # 檢視git的配置 git config user.name # 檢視git的使用者名稱 git config user.email #檢視郵箱
通過上面的命令設定的資訊會儲存在C盤使用者目錄下的.gitconfig檔案中
2.2、獲取Git倉庫
要使用Git對我們的程式碼進行版本控制,首先需要獲得Git倉庫
-
可以通過clone命令從遠端倉庫克隆一個到本地
-
可以通過init命令在本地初始化一個Git倉庫
通過以上兩種方式都可以在本地撞見一個倉庫,它會生成一個.git的檔案,有這個檔案代表著是一個git本地倉庫
2.3、工作目錄、暫存區和版本庫
- 前面看到的.git隱藏資料夾就是版本庫,版本庫中儲存了很多配置資訊、日誌資訊和檔案版本資訊等
- 包含.git資料夾的目錄就是工作目錄,主要用於存放開發的程式碼
- .git資料夾中有很多檔案,其中有一個index檔案就是暫存區,也可以叫做stage。暫存區是一個臨時儲存修改檔案的地方
Git工作目錄下的檔案存在兩種狀態:
- untracked未跟蹤狀態(未被納入版本控制)
- tracked已跟蹤(被納入版本控制)
- unmodified 未修改狀態
- modified 已修改狀態
- staged已暫存狀態
2.4、本地倉庫操作
- git status 檢視檔案狀態
我們新建了一個.gitignore檔案(可以在這個檔案裡面配置哪些檔案不必納入版本控制),此時檢視檔案狀態發現.gitignore是未被跟蹤狀態,也可以使用git status -s 命令簡介的顯示檔案狀態
2. git add 將檔案新增到暫存區
此時檢視再次檢視檔案狀態
- git reset 將暫存區的檔案取消暫存
我們新增到暫存取得檔案並沒有提交到本地的倉庫,可以通過git reset命令取消暫存,再次檢視檔案,檔案又處於未被跟蹤狀態.
- git commit 將暫存區檔案提交到倉庫
引數-m的意思是記錄提交的日誌,想要commit必需要經過add
-
git rm 刪除檔案
此時顯示.gitignore檔案已經被刪除,但是這只是刪除了工作區的檔案並沒有刪除本地倉庫的檔案。
將刪除操作提交到本地倉庫
注意:使用git rm 刪除後預設進入暫存區可以直接commit,但是如果在windows中刪除則需要add
-
.gitignore忽略檔案
一般我們總會有些檔案無需納入Git 的管理,也不希望它們總出現在未跟蹤檔案列表。 通常都是些自動生成的檔案,比如日誌檔案,或者編譯過程中建立的臨時檔案等。 在這種情況下,我們可以在工作目錄中建立一個名為 .gitignore 的檔案
7.git log 檢視日誌記錄
2.5、遠端倉庫操作
-
git remote 檢視遠端倉庫
如果本地倉庫是直接從遠端倉庫clone的,我們可以看到一個origin 。這是Git克隆的倉庫伺服器的預設名字。
如果沒有指定遠端倉庫,則啥也沒有
-
新增和斷開遠端倉庫
git remote add
新增一個新的遠端 Git 倉庫,同時指定一個可以引用的簡寫 如果想要斷開與遠端倉庫的連線可以使用git remote remove [倉庫(origin)]注意:此命令只是從本地移除遠端倉庫的記錄,並不會真正影響到遠端倉庫
遠端倉庫可以新增多個
-
從遠端倉庫克隆
如果你想獲得一份已經存在了的 Git 倉庫的拷貝,這時就要用到 git clone 命令。 Git 克隆的是該 Git 倉庫伺服器上的幾乎所有資料(包括日誌資訊、歷史記錄等),而不僅僅是複製工作所需要的檔案。 當你執行 git clone 命令的時候,預設配置下遠端 Git 倉庫中的每一個檔案的每一個版本都將被拉取下來。
命令形式:git clone [url]
-
從遠端倉庫fetch
git fetch 是從遠端倉庫獲取最新版本到本地倉庫,它會將資料放在git檔案的object檔案裡面,我們找不到,它不會自動merge,fetch過後需要使用merge命令將本地倉庫的資料和fetch來的資料合併。
命令形式:git fetch[remote-name] [branch-name]
git merge[remote-name]/ [branch-name]
注意:如果本地倉庫不是從遠端倉庫克隆而來而是init初始化而來。則第一次合併或者提交的時候會出現fatal:refusing to merge unrelated histories,我們需要在命令後面加上--allow-unrelated-histories,表示允許不相關的歷史
-
從遠端倉庫pull
命令形式:git push [remote-name] [branch-name]
如果第一次出現出現fatal:refusing to merge unrelated histories,也需要加上--allow-unrelated-histories
-
將本地倉庫程式碼推送到遠端倉庫
當你想分享你的程式碼時,可以將其推送到遠端倉庫。 命令形式:git push [remote-name] [branch-name]
2.6、Git分支
幾乎所有的版本控制系統都以某種形式支援分支。 使用分支意味著你可以把你的工作從開發主線上分離開來,以免影響開發主線。master分支是git倉庫的預設分支。
-
檢視分支
列出所有本地分支:git branch
列出所有遠端的分支:git branch -r
列出所有本地分支和遠端分支:git branch -a
-
建立分支
命令格式:git branch [branch_name]
-
切換分支
使用git checkout [branch_name]可以切換分支,前面的*和綠色就表示當前分支
在當前分支下建立一個檔案master2.txt並push到遠端倉庫maste2分支,此時master分支沒有master2.txt檔案。
當我們切換到master分支沒有master2.txt檔案
當我們切換到master2分支,發現master2.txt檔案
-
git合併分支
命令格式:git merge [branch_name]
注意:如果你在兩個不同的分支中,對同一個檔案的同一個部分進行了不同的修改,Git 就沒辦法合併它們,同時會提示檔案衝突。此時需要我們開啟衝突的檔案並修復衝突內容,最後執行git add命令來標識衝突已解決
-
刪除分支
git branch -d [branch_name]
如果要刪除的分支中進行了一些開發動作,此時執行上面的刪除命令並不會刪除分支,如果堅持要刪除此分支,可以將命令中的-d引數改為-D
git branch -D [branch_name]
如果要刪除遠端倉庫中的分支,可以使用命令git push origin –d [branch_name]
此時遠端倉庫只剩下master分支,沒有master2分支
2.7、Git標籤
Git 可以給歷史中的某一個提交打上標籤,以示重要。 比較有代表性的是人們會使用這個功能來標記釋出結點(v1.0 、v1.2等)。標籤指的是某個分支某個特定時間點的狀態。通過標籤,可以很方便的切換到標記時的狀態。
-
建立標籤
git tag [tag_name]建立一個新的標籤
-
列出標籤
git tag檢視有哪些標籤
git show [tag_name] 檢視標籤的詳細資訊
-
將標籤推送到倉庫
git push [remote] [brance] [tag_name]
可以看到遠端倉庫多了一個v1.0標籤
-
新建一個分支,指向某個標籤
命令格式:git checkout -b [branch] [tag]
-
刪除標籤
git tag -d [tag_name] 刪除本地標籤
git push [remote] [branch] :refs/taags/[tag_name] 刪除遠端標籤
三、Git時光機
3.1、reset和checkout
在工作中,一旦誤刪了檔案或者是把檔案弄亂了,我們可以從最近的一個commit版本恢復。git log命令 顯示從最近到最遠的提交日誌,可以見看到我們各個版本的日誌每個版本都有一個commit id,其HEAD表示當前版本,HEAD表示上一個版本,HEAD表示上上一個版本,往上100個版本可以寫成HEAD加連續100個,也可以寫成:HEAD~100。
git log :顯示從最近到最遠的提交日誌
git log --pretty=oneline:將只會顯示提交的commit id號和對應的註釋。
回退到上一個版本
git reset --hard HEAD^
已經成功回退到上一個版本,此時執行以此git log,已經沒有第三個版本的資訊
此時我們如果想要恢復到第三個版本,我們需要使用 git reflog來檢視過的你使用過的每一條命令
執行命令 git reset --hard [commitId]
已經回到第三個版本!
git reset --soft [id] :最近一次提交節點的提交記錄回退到暫存區。此時a.txt已經新增到暫存區但是未被提交
git reset --mixed HEAD^ :將最近一次提交節點的提交記錄回退到工作區
如果想要將暫存區的內容回退到工作區直接使用git reset 命令。
如果想要清除工作區某個檔案的修改可以使用 git checkout -- [file_name]命令,git checkout其實是用版本庫裡的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。
3.2、revert
git revert是用於“反做”某一個版本,以達到撤銷該版本的修改的目的。比如,我們commit了三個版本(版本一、版本二、 版本三),突然發現版本二不行(如:有bug),想要撤銷版本二,但又不想影響撤銷版本三的提交,就可以用 git revert 命令來反做版本二,生成新的版本四,這個版本四里會保留版本三的東西,但撤銷了版本二的東西。