程式設計師必備基礎:Git 命令全方位學習
阿新 • • 發佈:2020-06-27
## 前言
掌握Git命令是每位程式設計師必備的基礎,之前一直是用smartGit工具,直到看到大佬們都是在用Git命令操作的,回想一下,發現有些Git命令我都忘記了,於是寫了這篇博文,複習一下~
> https://github.com/whx123/JavaHome
**公眾號:撿田螺的小男孩**
**文章目錄**
- Git是什麼?
- Git的相關理論基礎
- 日常開發中,Git的基本常用命令
- Git進階之分支處理
- Git進階之處理衝突
- Git進階之撤銷與回退
- Git進階之標籤tag
- Git其他一些經典命令
## Git是什麼
在回憶Git是什麼的話,我們先來複習這幾個概念哈~
### 什麼是版本控制?
百度百科定義是醬紫的~
> 版本控制是指對軟體開發過程中各種程式程式碼、配置檔案及說明文件等檔案變更的管理,是軟體配置管理的核心思想之一。
那些年,我們的畢業論文,其實就是版本變更的真實寫照...腦洞一下,版本控制就是這些論文變更的管理~
![](https://user-gold-cdn.xitu.io/2020/6/20/172d07667ab32c55?w=783&h=222&f=png&s=42433)
### 什麼是集中化的版本控制系統?
那麼,集中化的版本控制系統又是什麼呢,說白了,就是有一個集中管理的中央伺服器,儲存著所有檔案的修改歷史版本,而協同開發者通過客戶端連線到這臺伺服器,從伺服器上同步更新或上傳自己的修改。
![](https://user-gold-cdn.xitu.io/2020/6/20/172d0caa0af7ca9e?w=1247&h=825&f=png&s=77377)
### 什麼是分散式版本控制系統?
分散式版本控制系統,就是遠端倉庫同步所有版本資訊到本地的每個使用者。嘻嘻,這裡分三點闡述吧:
- 使用者在本地就可以檢視所有的歷史版本資訊,但是偶爾要從遠端更新一下,因為可能別的使用者有檔案修改提交到遠端哦。
- 使用者即使離線也可以本地提交,push推送到遠端伺服器才需要聯網。
- 每個使用者都儲存了歷史版本,所以只要有一個使用者裝置沒問題,就可以恢復資料啦~
![](https://user-gold-cdn.xitu.io/2020/6/21/172d47e8db158f67?w=1453&h=764&f=png&s=95399)
### 什麼是Git?
Git是免費、開源的**分散式版本控制**系統,可以有效、高速地處理從很小到非常大的專案版本管理。
![](https://user-gold-cdn.xitu.io/2020/6/26/172efd2d7e5a8b30?w=220&h=92&f=png&s=9300)
## Git的相關理論基礎
- Git的四大工作區域
- Git的工作流程
- Git檔案的四種狀態
- 一張圖解釋Git的工作原理
### Git的四大工作區域
先複習Git的幾個工作區域哈:
![](https://user-gold-cdn.xitu.io/2020/6/25/172ea283b8925e39?w=1314&h=1027&f=png&s=75979)
- **Workspace**:你電腦本地看到的檔案和目錄,在Git的版本控制下,構成了工作區。
- **Index/Stage**:暫存區,一般存放在 .git目錄下,即.git/index,它又叫待提交更新區,用於臨時存放你未提交的改動。比如,你執行git add,這些改動就新增到這個區域啦。
- **Repository**:本地倉庫,你執行git clone 地址,就是把遠端倉庫克隆到本地倉庫。它是一個存放在本地的版本庫,其中**HEAD指向最新放入倉庫的版本**。當你執行git commit,檔案改動就到本地倉庫來了~
- **Remote**:遠端倉庫,就是類似github,碼雲等網站所提供的倉庫,可以理解為遠端資料交換的倉庫~
### Git的工作流程
上一小節介紹完Git的四大工作區域,這一小節呢,介紹Git的工作流程咯,把git的操作命令和幾個工作區域結合起來,個人覺得更容易理解一些吧,哈哈,看圖:
![](https://user-gold-cdn.xitu.io/2020/6/26/172f02fc758ed96d?w=1254&h=1010&f=png&s=113385)
git 的正向工作流程一般就這樣:
- 從遠端倉庫拉取檔案程式碼回來;
- 在工作目錄,增刪改查檔案;
- 把改動的檔案放入暫存區;
- 將暫存區的檔案提交本地倉庫;
- 將本地倉庫的檔案推送到遠端倉庫;
### Git檔案的四種狀態
根據一個檔案是否已加入版本控制,可以把檔案狀態分為:Tracked(已跟蹤)和Untracked(未跟蹤),而tracked(已跟蹤)又包括三種工作狀態:Unmodified,Modified,Staged
![](https://user-gold-cdn.xitu.io/2020/6/21/172d5ecd2d130275?w=1557&h=820&f=png&s=106243)
- **Untracked**: 檔案還沒有加入到git庫,還沒參與版本控制,即未跟蹤狀態。這時候的檔案,通過git add 狀態,可以變為Staged狀態
- **Unmodified**:檔案已經加入git庫, 但是呢,還沒修改, 就是說版本庫中的檔案快照內容與資料夾中還完全一致。 Unmodified的檔案如果被修改, 就會變為Modified. 如果使用git remove移出版本庫, 則成為Untracked檔案。
- **Modified**:檔案被修改了,就進入modified狀態啦,檔案這個狀態通過stage命令可以進入staged狀態
- **staged**:暫存狀態. 執行git commit則將修改同步到庫中, 這時庫中的檔案和本地檔案又變為一致, 檔案為Unmodified狀態.
### 一張圖解釋Git的工作原理
![](https://user-gold-cdn.xitu.io/2020/6/22/172dc85dbffd9ee9?w=1538&h=828&f=png&s=252469)
## 日常開發中,Git的基本常用命令
- git clone
- git checkout -b dev
- git add
- git commit
- git log
- git diff
- git status
- git pull/git fetch
- git push
這個圖只是模擬一下git基本命令使用的大概流程哈~
![](https://user-gold-cdn.xitu.io/2020/6/25/172ec08ede51d056?w=1562&h=692&f=png&s=136113)
### git clone
當我們要進行開發,第一步就是克隆遠端版本庫到本地呢
```
git clone url 克隆遠端版本庫
```
![](https://user-gold-cdn.xitu.io/2020/6/25/172eac70ddf0000f?w=606&h=119&f=png&s=16710)
### git checkout -b dev
克隆完之後呢,開發新需求的話,我們需要新建一個開發分支,比如新建開發分支dev
建立分支:
```
git checkout -b dev 建立開發分支dev,並切換到該分支下
```
![](https://user-gold-cdn.xitu.io/2020/6/25/172eac94cbf03f92?w=585&h=118&f=png&s=14677)
### git add
git add的使用格式:
```
git add . 添加當前目錄的所有檔案到暫存區
git add [dir] 新增指定目錄到暫存區,包括子目錄
git add [file1] 新增指定檔案到暫存區
```
有了開發分支dev之後,我們就可以開始開發啦,假設我們開發完HelloWorld.java,可以把它加到暫存區,命令如下
```
git add Hello.java 把HelloWorld.java檔案新增到暫存區去
```
![](https://user-gold-cdn.xitu.io/2020/6/25/172ead69113ecab6?w=536&h=57&f=png&s=7135)
### git commit
git commit的使用格式:
```
git commit -m [message] 提交暫存區到倉庫區,message為說明資訊
git commit [file1] -m [message] 提交暫存區的指定檔案到本地倉庫
git commit --amend -m [message] 使用一次新的commit,替代上一次提交
```
把HelloWorld.java檔案加到暫存區後,我們接著可以提交到本地倉庫啦~
```
git commit -m 'helloworld開發'
```
![](https://user-gold-cdn.xitu.io/2020/6/25/172eae180b28d9e7?w=548&h=90&f=png&s=14447)
### git status
git status,表示檢視工作區狀態,使用命令格式:
```
git status 檢視當前工作區暫存區變動
git status -s 檢視當前工作區暫存區變動,概要資訊
git status --show-stash 查詢工作區中是否有stash(暫存的檔案)
```
當你忘記是否已把程式碼檔案新增到暫存區或者是否提交到本地倉庫,都可以用git status看看哦~
![](https://user-gold-cdn.xitu.io/2020/6/25/172eb5ea0d5fde25?w=724&h=195&f=png&s=22238)
### git log
git log,這個命令用得應該比較多,表示檢視提交歷史/提交日誌~
```
git log 檢視提交歷史
git log --oneline 以精簡模式顯示檢視提交歷史
git