Git學習整理

user-Mars發表於2020-11-18

Git學習整理


在這裡插入圖片描述


1. 前言

  在實習的期間,需要頻繁使用git工具,維護原生程式碼與遠端庫程式碼的版本統一,提高開發的效率。但在使用的過程中,產生了使用不規範、理解不準確等問題,導致了提交message不規範,分支紊亂,甚至原生程式碼丟失等問題。所以有必要寫一篇有關Git的文章,整理記錄一下Git的學習過程與感悟,不過分關注具體實現方法,突出自己感覺比較重要的部分,加深一下對git瞭解。如果大家有什麼疑問困惑,發現什麼問題錯誤,歡迎一起討論。



2. Git 定義、安裝與配置


2.1 Git 定義

  這部分內容不多贅述,詳細內容可以百度一下,瞭解一下GIT (分散式版本控制系統)。一言以蔽之,git是一種開源分散式的版本管理系統,可以有效、高速地處理從很小到非常大的專案版本管理。

2.2 Git 安裝與配置

  我工作的環境是ubuntu18, 在linux環境下安裝git比較簡單。網上相關的資料也比較多,不是本文主要重點,不多展開:

相關參考網址

  1. Ubuntu18 安裝git
  2. Windows 安裝git

2.3 Git 與 Github

  我們使用Git是為了維護一個專案開發版本統一,Github 是基於Git的程式碼託管服務。我們可以通過git實現將我們本地的程式碼與github遠端的程式碼版本進行控制。
   俗一點就是 ? :
在這裡插入圖片描述
開個玩笑,可以去這裡看看: 知乎Git 跟 GitHub 是什麼關係
   gitee 平臺與 github 類似,前者是國內,速度會快一點吧,不過後者資源豐富的多。可以按照自己的喜好選擇。gitlab 是企業用的比較多,允許建立私有倉庫。
   知道了兩者的關係,我們就可以嘗試的將本地git與各github進行連線.

   立個 FLAG 後期做一個自己本地git和github連線的日誌過程吧. ?



3. Git 常用指令

   git 指令不少,但常用的其實就那麼幾條,多次使用就能很快掌握。

推薦幾篇非常不錯的文章,對我的幫助很大,建議按照順序閱讀:

  1. 看完這篇還不會用Git,那我就哭了!
  2. 知乎: 動圖表現 git 指令
  3. git 官網文件

第三個是git的官方文件,主要是當作字典來使用,用到了可以去檢視一下。

有幾條指令我覺得還是挺重要的,記錄一下:

3.1 git add -u

  git add . : 新增當前目錄中的所有檔案更改,雖然很方便,但是有很多沒有改動的檔案起始沒有必要上傳。-u可以只新增當前目錄改動檔案。

# 新增當前目錄中的改動檔案更改
git add -u

3.2 git commit --amend

   commit程式碼之後,發現某個地方出錯,或者你commit message的描述有誤,但是你下次提交時不想保留上一次的記錄(別人能在git log中看到,過多的commit會不簡潔);這時候你可以使用接下來的這個命令:git commit --amend。

# --amend 更改你的最新提交訊息
git commit --amend 'new commit message' 

3.3 git rebase -i

git 變基操作真的非常有用,比如說,你的分支上面有多個commit,但是每個commit其實都是很小的改動,當然可以把他們合併在一起作為一個commit提交, -i 屬性就是互動式變基。具體的內容可以看第二篇文章。

在這裡插入圖片描述

3.4 git fetch/ git merge/ git pull

   這三條指令還是挺重要的,而且相互之間存在聯絡,我實習的過程中就遇到原生程式碼與遠端程式碼進度不一致,無法被merge的情況,還是挺尷尬。
  首先我們看一張git 幾個指令的圖片:

在這裡插入圖片描述
我們可以看到其中:

  1. fetch 指令在Remote與Repository之間,其作用是拉取遠端主機分支到本地倉庫,然後可以由使用者檢查是否合併到工作區的分支之中。這不會以任何方式影響你的本地分支:fetch 只是單純地下載新的資料而已。

  2. merge 指令圖中沒有標出來,它作用的範圍是Repository與Workspace之間,是根據使用者的指示,將本地倉庫的分支與當前工作區的分支合併,會有一個新的commit。merge結束後,工作區的程式碼才和遠端主機保持一致。

  3. pull 是 fetch 與 pull兩個指令的結合,意味著將遠端主機的分支拉取到工作區分支。

## fetch 部分
# 這個命令將某個遠端主機的更新全部取回本地
git fetch <遠端主機名>

# 取回特定分支的更新,可以指定分支名,注意空格
git fetch <遠端主機名> <分支名> 

# 例子
# 拉取遠端origin 所有分支提交
git fetch origin
# 拉取遠端origin 的master分支
git fetch origin master

## merge 部分
# 切換到master分支,合併dev分支
git checkout master  //選擇or切換到master分支
git merge dev        //將dev分支合併到當前分支(master)中

		A----C----E(master)
		 \
		  B---D---F(dev)
	  
		 (merge 結果,注意G為新的commit)
	 
		A---C---E---G(master)
		 \         /
		  B---D---F(dev)	
## pull 部分
git pull <遠端主機名> <遠端分支名>:<本地分支名>
# 將遠端主機 origin 的 master 分支拉取過來與本地的 brantest 分支合併
git pull origin master:brantest
# 遠端分支與當前分支合併,則冒號後面的部分可以省略
git pull origin master

3.5 git log 和 git revert

  在使用git的過程中,肯定會有錯誤的commit,這個時候需要我們修復錯誤並進行回溯。同時 git status 和 git log 我覺得是非常有用的指令。
  git status 可以檢視當前的狀態,監視未提交的檔案,建議執行指令前要status一下檢視當前狀態,避免程式碼丟失。
   git log 可以檢視之前commit的資訊,有助於我們檢視當前的版本,git relog 指令可以幫助我們檢視已經執行過的所有動作的日誌。包括合併、重置、還原,基本上包含你對你的分支所做的任何修改。

## 切換到最新提交的程式碼版本
git reset HEAD 
git reset HEAD -- filename # for a specific file
## 切換到最新提交之前的程式碼版本
git reset HEAD^ -- filename
git reset HEAD^ -- filename # for a specific file
## 切換回3或5次提交
git reset HEAD~3 -- filename
git reset HEAD~3 -- filename # for a specific file
git reset HEAD~5 -- filename
git reset HEAD~5 -- filename # for a specific file
## 切換回特定的提交,其中 0766c053 為提交 ID
git reset 0766c053 -- filename
git reset 0766c053 -- filename # for a specific file
## 先前的命令是所謂的軟重置。 你的程式碼已重置,但是git仍會保留其他程式碼的副本,以備你需要時使用。 另一方面,--hard 標誌告訴Git覆蓋工作目錄中的所有更改。
git reset --hard 0766c053

4. IDEA中的git工具

<待續>


參考網站

以下是一些比較有幫助的網站

  1. git 官網文件
  2. 知乎: 動圖表現 git 指令
  3. 看完這篇還不會用Git,那我就哭了!