1. 程式人生 > >看完這篇還不會用Git,那我就哭了!

看完這篇還不會用Git,那我就哭了!

你使用過 Git 嗎?也許你已經使用了一段時間,但它的許多奧祕仍然令人困惑。

Git 是一個版本控制系統,是任何軟體開發專案中的主要內容。通常有兩個主要用途:程式碼備份和程式碼版本控制。你可以逐步處理程式碼,在需要回滾到備份副本的過程中儲存每一步的進度!

常見的問題是 Git 很難使用。有時版本和分支不同步,你會花很長時間試圖推送程式碼!更糟糕的是,不知道某些命令的確切工作方式很容易導致意外刪除或覆蓋部分程式碼!

這就是我寫本文的原因,從而學習到如何正確使用 Git,以便在開發中共同進行編碼!

安裝和配置

Git 安裝

首先,我們必須安裝 Git 才能使用它!這裡分 Linux 和 Windows 來演示:

在 Linux 上安裝 Git

我們可以使用 yum 輕鬆快速地做到這一點:

sudo yum install git

在 Windows 上安裝 Git

直接在 https://git-scm.com/downloads 裡面,下載最新版的 Git,預設安裝就可以了。

安裝完成後,在開始選單裡找到 Git->Git Bash,點選後出現一個類似命令列視窗的東西,就說明 Git 安裝成功。

Git 配置

可以儲存 Git 使用者名稱和電子郵件,這樣就不必在以後的 Git 命令中再次輸入它們。

在命令列中配置本地倉庫的賬號和郵箱:

$ git config --global user.name "wupx"  
$ git config --global user.email "[email protected]"  

好多人都不知道的小技巧是,你可以為 Git 啟用一些額外的顏色,這樣就可以更容易地閱讀命令的輸出!

git config --global color.ui true

Git 基本版本控制

初始化 Git

現在,我們可以開始對專案進行版本控制。使用 cd 命令導航到要在終端中設定版本控制的目錄,現在你可以像這樣初始化 Git 儲存庫:

git init

這將建立一個名為 .git 的新子目錄(Windows 下該目錄為隱藏的),其中包含所有必需的儲存庫檔案(Git 儲存庫框架)。至此,你的專案中尚未跟蹤任何內容。

新增並提交

要開始對現有檔案進行版本控制,你應該先跟蹤這些檔案並進行初始提交。要做到這一點,你首先需要將檔案新增到 Git 中,並將它們附加到 Git 專案中。

git add <file>
git commit -m 'first commit'

遠端備份

很棒!你現在已經開始在本地對專案進行版本控制。如果你想遠端儲存和備份專案,則需要在 GitHub 上建立一個遠端儲存庫(它是免費的!)。因此,首先轉到 github.com 並建立一個儲存庫。然後,使用儲存庫的連結將其新增為本地 git 專案的來源,即該程式碼的儲存位置。

# 示例
git remote add origin \
https://github.com/wupeixuan/repo.git 
# 以我的一個倉庫為例
git remote add origin \
https://github.com/wupeixuan/JDKSourceCode1.8.git

然後,你可以繼續將程式碼推送到 GitHub!哇,你已經成功備份了你的程式碼!

git push origin master

處理檔案

狀態檢查

git status 命令用於確定哪些檔案處於哪種狀態,它使你可以檢視哪些檔案已提交,哪些檔案尚未提交。如果在所有檔案都已提交併推送後執行此命令,則應該看到類似以下內容:

$ git status
# On branch master
nothing to commit (working directory clean)

如果你將新檔案新增到專案中,而該檔案之前不存在,則在執行 git status 時,你應該看到未跟蹤的檔案,如下所示:

$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   README
nothing added to commit but untracked files present (use "git add" to track)

使用 git status 對於快速檢查你已經備份的內容和你僅在本地擁有的內容非常有用。

高階檔案新增

還有一些更高階的方法可以將檔案新增到 Git 中,從而使你的工作流程更高效。我們可以執行以下操作,而不是試圖查詢所有有更改的檔案並逐個新增它們:

# 逐個新增檔案
git add filename

# 添加當前目錄中的所有檔案
git add -A

# 添加當前目錄中的所有檔案更改
git add .

# 選擇要新增的更改(你可以 Y 或 N 完成所有更改)
git add -p

高階提交

我們可以使用 git commit -m '提交資訊' 來將檔案提交到 Git。對於提交簡短訊息來說,這一切都很好,但是如果你想做一些更精細的事情,你需要來學習更多的操作:

### 提交暫存檔案,通常用於較短的提交訊息
git commit -m 'commit message'

### 新增檔案並提交一次
git commit filename -m 'commit message'

### 新增檔案並提交暫存檔案
git commit -am 'insert commit message'

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

# 將一系列提交合併為一個提交,你可能會用它來組織混亂的提交歷史記錄
git rebase -i
### 這將為你提供核心編輯器上的介面:
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell

分支與合併

GitHub儲存庫的master分支應始終包含有效且穩定的程式碼。但是,你可能還希望備份一些當前正在處理的程式碼,但這些程式碼並不完全穩定。也許你要新增一個新功能,你正在嘗試和破壞很多程式碼,但是你仍然希望保留備份以儲存進度!

分支使你可以在不影響master分支的情況下處理程式碼的單獨副本。首次建立分支時,將以新名稱建立master分支的完整克隆。然後,你可以獨立地在此新分支中修改程式碼,包括提交檔案等。一旦你的新功能已完全整合並且程式碼穩定,就可以將其合併到master分支中!

分支

這是你在分支上建立和工作所需的所有東西:

### 建立一個本地分支
git checkout -b branchname

### 在2個分支之間切換
git checkout prc/dev-wupx
git checkout master

### 將新的本地分支作為備份
git push -u origin branch_2

### 刪除本地分支,這不會讓你刪除尚未合併的分支
git branch -d branch_2

### 刪除本地分支,即使尚未合併,這也會刪除該分支!
git branch -D branch_2

### Viewing all current branches for the repository, including both ### local and remote branches. Great to see if you already have a ### branch for a particular feature addition, especially on bigger ### projects
### 檢視儲存庫的所有當前分支,包括本地和遠端分支。
git branch -a

### 檢視已合併到您當前分支中的所有分支,包括本地和遠端。 非常適合檢視所有程式碼的來源!
git branch -a --merged

### 檢視尚未合併到當前分支中的所有分支,包括本地和遠端
git branch -a --no-merged

### 檢視所有本地分支
git branch

### 檢視所有遠端分支
git branch -r

# 將主分支重新設定為本地分支
$ git rebase origin/master

# 將分支推送到遠端儲存庫源並對其進行跟蹤
$ git push origin branchname

合併

很棒!現在,你已經學習瞭如何建立分支並開始敲程式碼!將新功能新增到分支中之後,你需要將其合併回master分支,以便您的master具有所有最新的程式碼功能。

方法如下:

### 首先確保你正在檢視 master 分支
git checkout master

### 現在將你的分支合併到 master 
git merge prc/dev-wupx

你可能必須修復分支與主伺服器之間的任何程式碼衝突,但是 Git 將向你展示在鍵入該 merge 命令後如何執行所有這些操作。

修復錯誤和回溯

發生錯誤......它們經常在編碼中發生!重要的是我們能夠修復它們。

不要慌!Git 提供了你所需的一切,以防你在所推送的程式碼中犯錯,改寫某些內容或者只是想對所推送的內容進行更正。

### 切換到最新提交的程式碼版本
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

對 Git 有用的提示和技巧

我們已經完成了所有細節部分!以下是一些 Git 提示和技巧,你可能會發現它們對改善工作流程非常有用!

搜尋

### 搜尋目錄中的字串部分
git grep 'project'

### 在目錄中搜索部分字串,-n 打印出 git 找到匹配項的行號
git grep -n 'project'

### git grep -C <行數> 'something' 搜尋帶有某些上下文的字串部分(某些行在我們正在尋找的字串之前和之後)
git grep -C<number of lines> 'project'

### 搜尋字串的一部分,並在字串之前顯示行
git grep -B<number of lines> 'project'

### 搜尋字串的一部分,並在字串之後顯示行
git grep -A<number of lines> 'something'

看誰寫了什麼

### 顯示帶有作者姓名的檔案的更改歷史記錄
git blame 'filename'

### 顯示帶有作者姓名和 git commit ID 的檔案的更改歷史記錄
git blame 'filename' -l

日誌

### 顯示儲存庫中所有提交的列表 該命令顯示有關提交的所有資訊,例如提交ID,作者,日期和提交訊息
git log

### 提交列表僅顯示提交訊息和更改
git log -p

### 包含您要查詢的特定字串的提交列表
git log -S 'project'

### 作者提交的清單
git log --author 'wupx'

### 顯示儲存庫中提交列表的摘要。顯示提交ID和提交訊息的較短版本。
git log --oneline

### 顯示昨天以來倉庫中的提交列表
git log --since=yesterday

### 顯示作者日誌,並在提交訊息中搜索特定術語
git log --grep "project" --author "wupx"