Git詳解

1、版本控制

什麼是版本控制 版本迭代,新的版本!

版本控制(Revision control)是一種在開發的過程中用於管理我們對文件、目錄或工程等內容的修改歷史,方便查看更改歷史記錄,備份以便恢復以前的版本的軟件工程技術。

  • 實現跨區域多人協同開發
  • 追蹤和記載一個或者多個文件的歷史記錄
  • 組織和保護你的源代碼和文檔
  • 統計工作量
  • 並行開發、提高開發效率
  • 追蹤記錄整個軟件的開發過程
  • 減輕開發人員的負擔,節省時間,同時降低人為錯誤

簡單說就是用於管理多人協同開發項目的技術。

沒有進行版本控制或者版本控制本身缺乏正確的流程管理,在軟件開發過程中將會引入很多問題,如軟件代碼的一致性、軟件內容的冗餘、軟件過程的事務性、軟件開發過程中的並發性、軟件源代碼的安全性,以及軟件的整合等問題。

Git是目前世界上最先進的分佈式版本控制系統。

2、Git環境配置

先卸載

  1. 清除環境變量,環境變量只是為了全局使用而已!
  2. 卸載

下載對應的版本安裝即可!

啟動Git

安裝成功後在開始菜單中會有Git項,菜單下有3個程序:任意文件夾下右鍵也可以看到對應的程序!

Git Bash: Unix與Linux風格的命令行,使用最多,推薦最多

Git CMD: Windows風格的命令行

Git GUI: 圖形界面的Git,不建議初學者使用,盡量先熟悉常用命令

基本的Linux命令學習

平時一定要多使用這些基礎的命令

  1. cd :改變目錄
  2. cd.. :回退到上一個目錄,直接cd進入默認目錄
  3. pwd :顯示當前所在的目錄路徑
  4. ls(II) :都是列出當前目錄中的所有文件,只不過II列出的內容更為詳細
  5. touch :新建一個文件 如 touch index.js 就會在當前目錄下新建一個 index.js 文件
  6. rm :刪除一個文件,rm index.js 就會把 index.js 文件刪除
  7. mkdir :新建一個目錄,就是新建一個文件夾
  8. rm -r :刪除一個文件夾,rm -r src 刪除src目錄
  9. mv 移動文件,mv index.html src index.html 是我們要移動的文件,src是目標文件夾
  10. reset 重新初始化終端/清屏
  11. clear 清屏
  12. history 查看命令歷史
  13. help 幫助
  14. exit 退出
  15. 表示注釋

Git 配置

所有的配置文件,其實都保存在本地

查看配置git config -l

查看系統配置git config --system --list

查看全局配置git config --global --list

Git相關的配置文件:

  1. D:\environment\Git\etc\gitconfig : Git安裝目錄下的 gitconfig –system 系統級
  2. C:\Users\wangyudong.gitconfig : 只適用於當前登錄用戶的配置 –global 全局

這裡可以直接編輯配置文件,通過命令設置後會響應到這裡。

設置用戶名與郵箱(用戶標識,必要)

當你安裝Git後首先要做的事情是設置你的用戶名和email地址。這是非常重要的,因為每次Git提交都會使用該信息。它被永遠的嵌入到了你的提交中:

git config --global user.name "wydilearn" #名稱
git config --global user.email "[email protected]" #郵箱

3、Git基本理論(核心)

工作區域

Git本地有三個工作區域:工作目錄(Working Directory)、暫存區(Stage/Index)、資源庫(Repository或Git Directory)。如果再加上遠程的git倉庫(Remote Directory)就可以分為四個工作區域。文件在這四個區域之間的轉換關係如下:

  • Workspace:工作區,就是你平時存放項目代碼的地方
  • Index/Stage:暫存區,用於臨時存放你的改動,事實上它只是一個文件,保存即將提交到文件列表信息
  • Repository:倉庫區(或本地倉庫),就是安全存放數據的位置,這裏面有你提交到所有版本的數據。其中HEAD指向最新放入倉庫的版本
  • Remote:遠程倉庫,託管代碼的服務器,可以簡單地認為是你項目組中的一台電腦用於遠程數據交換

本地的三個區域確切的說應該是git倉庫中HEAD指向的版本:

  • Directory:使用Git管理的一個目錄,也就是倉庫,包含我們的工作空間和Git的管理空間。
  • WorkSpace:需要通過Git進行版本控制的目錄和文件,這些目錄和文件組成了工作空間。
  • .git:存放Git管理信息的目錄,初始化倉庫的時候自動創建。
  • Index/Stage:暫存區,或者叫待提交更新區,再提交進入repo之前,我們可以把所有的更新放在暫存區。
  • Local Repo:本地倉庫,一個存放在本地的版本庫;HEAD會指示當前的開發分支(branch)。
  • Stash:隱藏,是一個工作狀態保存棧,用於保存/恢復WorkSpace中的臨時狀態。

工作流程

git的工作流程一般是這樣的:

  1. 在工作目錄中添加、修改文件;
  2. 將需要進行版本管理的文件放入暫存區域;
  3. 將暫存區域的文件提交到git倉庫。

因此,git管理的文件有三種狀態:已修改(modified),已暫存(staged),已提交(committed)

4、Git項目搭建

創建工作目錄與常用指令

工作目錄(WorkSpace)一般就是你希望Git幫助你管理的文件夾,可以是你項目的目錄,也可以是一個空目錄,建議不要有中文。

日常使用只要記住下圖6個命令:

跟對人,做對事!

本地倉庫搭建

創建本地倉庫的方法有兩種:一種是創建全新的倉庫,另一種是克隆遠程倉庫。

  1. 創建全新的倉庫,需要用GIT管理的項目的根目錄執行:

    # 在當前目錄新建一個Git代碼庫
    $ git init
    
  2. 執行後可以看到,僅僅在項目目錄多出了一個.git目錄,關於版本等的所有信息都在這個目錄裏面。

克隆遠程倉庫

  1. 另一種方式是克隆遠程目錄,由於是將遠程服務器上的倉庫完全鏡像一份至本地!

    # 克隆一個項目和它的整個代碼歷史(版本信息)
    $ git clone [url]
    
  2. 去gitee或者github上克隆一個測試!

5、GIT文件操作

文件4種狀態

版本控制就是對文件的版本控制,要對文件進行修改、提交等操作,首先要知道文件當前在什麼狀態,不然可能會提交了現在還不想提交的文件,或者要提交的文件沒提交上。

  • Untracked:為跟蹤,此文件在文件夾中,但並沒有加入到git庫,不參與版本控制,通過git add狀態變為Staged
  • Unmodify:文件已經入庫,未修改,即版本庫中的文件快照內容與文件夾中完全一致。這種類型的文件有兩種去處,如果它被修改,而變為Modified。如果使用git rm移出版本庫,則成為Untracked文件。
  • Modified:文件已修改,僅僅是修改,並沒有進行其他的操作。這個文件也有兩個去處,通過git add可進入暫存staged狀態,使用給git checkout則丟棄修改過,返回到unmodify狀態,這個git checkout即從庫中取出文件,覆蓋當前修改!
  • Staged:暫存狀態。執行git commit則將修改同步到庫中,這時庫中的文件和本地文件又變為一致,文件為Unmodify狀態。執行git reset HEAD filename取消暫存,文件狀態為Modified

查看文件狀態

上面說文件有4種狀態,通過如下命令可以查看到文件的狀態:

#查看指定文件狀態
git status [filename]

#查看所有文件狀態
git status

# git add .               添加所有文件到暫存區
# git commit -m "消息內容" 提交暫存區中的內容到本地倉庫 -m 提交信息

忽略文件

有些時候我們不想把某些文件納入版本控制中,比如數據庫文件,臨時文件,設計文件等

在主目錄下簡歷”.gitignore”文件,此文件有如下規則:

  1. 忽略文件中的空行或以#開始的行將會被忽略
  2. 可以使用Linux通配符。例如:星號(*)代表任意多個字符,問好(?)代表一個字符,方括號([abc])代表可選字符範圍,大括號({string1,string2,……})代表可選的字符串等
  3. 如果名稱的最前面有一個感嘆號(!),表示例外規則,將不被忽略
  4. 如果名稱最前面是一個路徑分隔符(/),表示要忽略的文件在此目錄下,而子目錄中的文件不忽略
  5. 如果名稱的最後面是一個路徑分隔符(/),表示要忽略的是此目錄下該名稱的子目錄,而非文件(默認文件或目錄都忽略)
#為注釋
*.txt       #忽略所有 .txt結尾的文件,這樣的話上傳就不會被選中!
!lib.txt    #但lib.txt除外
/temp       #僅忽略項目根目錄下的TODO文件,不包括其它目錄temp
build/      #忽略build/目錄下的所有文件
doc/*.txt   #會忽略 doc/notes.txt 但不包括 doc/server/arch.txt

.gitignore

*.class
*.log
*.lock

# Package Files #
*.jar
*.war
*.ear
target/

# idea
.idea/
*.iml

*velocity.log*

### STS ###
.apt_generated
.factorypath
.springBeans

### IntelliJ IDEA ###
*.iml
*.ipr
*.iws
.idea
.classpath
.project
.settings/
bin/


*.log
tmp/

#rebel
*rebel.xml*

6、使用碼雲

詳見SpringCloud文檔最後一部分

7、IDEA中集成Git

  1. 新建項目,綁定git

    • 將我們遠程的git文件目錄拷貝到項目中即可

    • 注意觀察idea中的變化

  2. 修改文件,使用IDEA操作git

    • 添加到暫存區
    • commit 提交
    • push 到遠程倉庫
  3. 提交測試

這些都是單個人的操作!

8、說明:GIT分支

分支在GIT中相對較難,分支就是科幻電影裏面的平行宇宙,如果兩個平行宇宙互不干擾,那對現在的你也沒啥影響。不過,在某個時間點,兩個平行宇宙合併了,我們就需要處理一些問題了!

git分支中常用指令:

# 列出所有本地分支
git branch

# 列出所有遠程分支
git branch -r

# 新建一個分支,但依然停留在當前分支
git branch [branch-name]

# 新建一個分支,並切換到該分支
git checkout -b [branch]

# 合併指定分支到當前分支
$ git merge [branch]

# 刪除分支
$ git branch -d [branch-name]

# 刪除遠程分支
$ git push orgin --delete [branch-name]
$ git branch -dr [remote/branch]

多個分支如果並行執行,就會導致我們代碼衝突,也就是同時存在多個版本!

如果同一個文件在合併分支時都被修改了則會引起衝突:解決的辦法是我們可以修改衝突文件後重新提交!選擇要保留他的代碼還是你的代碼!

master主分支應該非常穩定,用來發佈新版本,一般情況下不允許在上面工作,工作一般情況下在新建的dev分支上工作,工作完後,比如要發佈,或者說dev分支代碼穩定後可以合併到主分支master上來git merge [branch]

Tags: