1. 程式人生 > 實用技巧 >Git 命令全方位學習

Git 命令全方位學習

Git是什麼

在回憶Git是什麼的話,我們先來複習這幾個概念哈~

什麼是版本控制?

百度百科定義是醬紫的~

版本控制是指對軟體開發過程中各種程式程式碼、配置檔案及說明文件等檔案變更的管理,是軟體配置管理的核心思想之一。

那些年,我們的畢業論文,其實就是版本變更的真實寫照...腦洞一下,版本控制就是這些論文變更的管理~

什麼是集中化的版本控制系統?

那麼,集中化的版本控制系統又是什麼呢,說白了,就是有一個集中管理的中央伺服器,儲存著所有檔案的修改歷史版本,而協同開發者通過客戶端連線到這臺伺服器,從伺服器上同步更新或上傳自己的修改。

什麼是分散式版本控制系統?

分散式版本控制系統,就是遠端倉庫同步所有版本資訊到本地的每個使用者。嘻嘻,這裡分三點闡述吧:

  • 使用者在本地就可以檢視所有的歷史版本資訊,但是偶爾要從遠端更新一下,因為可能別的使用者有檔案修改提交到遠端哦。
  • 使用者即使離線也可以本地提交,push推送到遠端伺服器才需要聯網。
  • 每個使用者都儲存了歷史版本,所以只要有一個使用者裝置沒問題,就可以恢復資料啦~

什麼是Git?

Git是免費、開源的分散式版本控制系統,可以有效、高速地處理從很小到非常大的專案版本管理。

Git的相關理論基礎

  • Git的四大工作區域
  • Git的工作流程
  • Git檔案的四種狀態
  • 一張圖解釋Git的工作原理

Git的四大工作區域

先複習Git的幾個工作區域哈:

  • Workspace:你電腦本地看到的檔案和目錄,在Git的版本控制下,構成了工作區。
  • Index/Stage:暫存區,一般存放在 .git目錄下,即.git/index,它又叫待提交更新區,用於臨時存放你未提交的改動。比如,你執行git add,這些改動就新增到這個區域啦。
  • Repository:本地倉庫,你執行git clone 地址,就是把遠端倉庫克隆到本地倉庫。它是一個存放在本地的版本庫,其中HEAD指向最新放入倉庫的版本。當你執行git commit,檔案改動就到本地倉庫來了~
  • Remote:遠端倉庫,就是類似github,碼雲等網站所提供的倉庫,可以理解為遠端資料交換的倉庫~

Git的工作流程

上一小節介紹完Git的四大工作區域,這一小節呢,介紹Git的工作流程咯,把git的操作命令和幾個工作區域結合起來,個人覺得更容易理解一些吧,哈哈,看圖:


git 的正向工作流程一般就這樣:

  • 從遠端倉庫拉取檔案程式碼回來;
  • 在工作目錄,增刪改查檔案;
  • 把改動的檔案放入暫存區;
  • 將暫存區的檔案提交本地倉庫;
  • 將本地倉庫的檔案推送到遠端倉庫;

Git檔案的四種狀態

根據一個檔案是否已加入版本控制,可以把檔案狀態分為:Tracked(已跟蹤)和Untracked(未跟蹤),而tracked(已跟蹤)又包括三種工作狀態:Unmodified,Modified,Staged

  • Untracked: 檔案還沒有加入到git庫,還沒參與版本控制,即未跟蹤狀態。這時候的檔案,通過git add 狀態,可以變為Staged狀態
  • Unmodified:檔案已經加入git庫, 但是呢,還沒修改, 就是說版本庫中的檔案快照內容與資料夾中還完全一致。 Unmodified的檔案如果被修改, 就會變為Modified. 如果使用git remove移出版本庫, 則成為Untracked檔案。
  • Modified:檔案被修改了,就進入modified狀態啦,檔案這個狀態通過stage命令可以進入staged狀態
  • staged:暫存狀態. 執行git commit則將修改同步到庫中, 這時庫中的檔案和本地檔案又變為一致, 檔案為Unmodified狀態.

一張圖解釋Git的工作原理

git安裝

  我用的電腦是windons系統,請根據你們自己的電腦紫銅安裝對應的git版本,去Git官網上下載安裝即可,在這裡將不給大家做詳細的說明,安裝步驟請自行百度。

ssh -key配置

  在這一步我已經預設你安裝好了Git,開啟Git,在Git命令列輸入cd ~/.ssh檢查電腦本機是否有ssh key設定,注意:.ssh是隱藏檔案,一般在電腦C/使用者/Administrator下面就能夠找到。

  一般情況下 ,之前沒有用過git的同學電腦本機一般不會 有ssh key 的,下面我講給大家介紹如何配置ssh key

  1、進入~路徑下,必須保證當前路徑在~路徑下

  在git命令列敲擊注意:在敲程式碼是不要將雙引號也敲擊進去。

ssh-keygen -t  rsa -C "[email protected]" //建議寫自己真實有效的郵箱地址。

  然後命令列會出現如下程式碼:

  Enter file in which to save the key (/c/Users/xxxx_000/.ssh/id_rsa):   //此時我們什麼都不需要操作,直接回車就好

  Enter passphrase (empty for no passphrase):            //此時要你輸入碼(可以為空,直接回車就好,也可以輸入你的密碼,這個密碼在你最後把本地資源推送到github上面的時候回會讓你填寫密碼,此時密碼隱藏,你輸入進去是看不到的)

  Enter same passphrase again: //再次確認密碼(如果你第一次有輸入密碼,這次就再輸一次,如果沒有直接回車就行了)

  Your identification has been saved in /c/Users/xxxx_000/.ssh/id_rsa. //生成的金鑰

  Your public key has been saved in /c/Users/xxxx_000/.ssh/id_rsa.pub. //生成的公鑰

  The key fingerprint is:

  e3:51:33:xx:xx:xx:xx:xxx:61:28:83:e2:81 [email protected]

  *本機已完成ssh key設定,其存放路徑為:c:/Users/xxxx_000/.ssh/下。其中xxxx_000為你的使用者名稱。

  2、新增ssh key 到Github上

  首先登陸Github,點選右上角的“▼”→Settings→SSH kyes→Add SSH key。
  然後在開啟c:/Users/xxxx_000/.ssh裡面的id_rsa.pub檔案,(記事本開啟即可)全選複製公鑰內容
  也可以在git bush中的命令列輸入cat ~/.ssh/id_rsa.pub,將得到公鑰

  Title自定義,將公鑰貼上到GitHub中Add an SSH key的key輸入框,最後“Add Key“

  3、配置賬戶

  開啟cmd順序執行下述命令

$ git config --global user.name “your_username” #設定使用者名稱

$ git config --global user.email “your_registered_github_Email” #設定郵箱地址(建議用註冊giuhub的郵箱)

  4、測試ssh keys是否設定成功。

  ssh -T [email protected]

  The authenticity of host 'github.com (192.30.252.129)' can't be established.

  RSA key fingerprint is 16:27:xx:xx:xx:xx:xx:4d:eb:df:a6:48.

  Are you sure you want to continue connecting (yes/no)? yes #確認你是否繼續聯絡,輸入yes

  Warning: Permanently added 'github.com,192.30.252.129' (RSA) to the list of known hosts.

  Enter passphrase for key '/c/Users/xxxx_000/.ssh/id_rsa': #生成ssh kye是密碼為空則無此項,若設定有密碼則有此項且,輸入生成ssh key時設定的密碼即可。

  Hi xxx! You've successfully authenticated, but GitHub does not provide shell access. #出現此句話,說明設定成功。

  到這裡,git相關的所有配置已經完成

日常開發中,Git的基本常用命令

  • git clone
  • git checkout -b dev
  • git add
  • git commit
  • git log
  • git diff
  • git status
  • git pull/git fetch
  • git push

這個圖只是模擬一下git基本命令使用的大概流程哈~

git clone

當我們要進行開發,第一步就是克隆遠端版本庫到本地呢

git clone url  克隆遠端版本庫

git checkout -b dev

克隆完之後呢,開發新需求的話,我們需要新建一個開發分支,比如新建開發分支dev

建立分支:

git checkout -b dev   建立開發分支dev,並切換到該分支下

git add

git add的使用格式:

git add .	添加當前目錄的所有檔案到暫存區
git add [dir]	新增指定目錄到暫存區,包括子目錄
git add [file1]	新增指定檔案到暫存區

有了開發分支dev之後,我們就可以開始開發啦,假設我們開發完HelloWorld.java,可以把它加到暫存區,命令如下

git add Hello.java  把HelloWorld.java檔案新增到暫存區去

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開發'

git status

git status,表示檢視工作區狀態,使用命令格式:

git status  檢視當前工作區暫存區變動
git status -s  檢視當前工作區暫存區變動,概要資訊
git status  --show-stash 查詢工作區中是否有stash(暫存的檔案)

當你忘記是否已把程式碼檔案新增到暫存區或者是否提交到本地倉庫,都可以用git status看看哦~

git log

git log,這個命令用得應該比較多,表示檢視提交歷史/提交日誌~

git log  檢視提交歷史
git log --oneline 以精簡模式顯示檢視提交歷史
git log -p <file> 檢視指定檔案的提交歷史
git blame <file> 一列表方式檢視指定檔案的提交歷史

嘻嘻,看看dev分支上的提交歷史吧要回滾程式碼就經常用它喵喵提交歷史

git diff

git diff 顯示暫存區和工作區的差異
git diff filepath   filepath路徑檔案中,工作區與暫存區的比較差異
git diff HEAD filepath 工作區與HEAD ( 當前工作分支)的比較差異
git diff branchName filepath 當前分支的檔案與branchName分支的檔案的比較差異
git diff commitId filepath 與某一次提交的比較差異

如果你想對比一下你改了哪些內容,可以用git diff對比一下檔案修改差異哦

git pull/git fetch

git pull  拉取遠端倉庫所有分支更新併合併到本地分支。
git pull origin master 將遠端master分支合併到當前本地master分支
git pull origin master:master 將遠端master分支合併到當前本地master分支,冒號後面表示本地分支

git fetch --all  拉取所有遠端的最新程式碼
git fetch origin master 拉取遠端最新master分支程式碼

我們一般都會用git pull拉取最新程式碼看看的,解決一下衝突,再推送程式碼到遠端倉庫的。

有些夥伴可能對使用git pull還是git fetch有點疑惑,其實
git pull = git fetch+ git merge。pull的話,拉取遠端分支並與本地分支合併,fetch只是拉遠端分支,怎麼合併,可以自己再做選擇。

git push

git push 可以推送本地分支、標籤到遠端倉庫,也可以刪除遠端分支哦。

git push origin master 將本地分支的更新全部推送到遠端倉庫master分支。
git push origin -d <branchname>   刪除遠端branchname分支
git push --tags 推送所有標籤

如果我們在dev開發完,或者就想把檔案推送到遠端倉庫,給別的夥伴看看,就可以使用git push origin dev~

Git進階之分支處理

Git一般都是存在多個分支的,開發分支,迴歸測試分支以及主幹分支等,所以Git分支處理的命令也需要很熟悉的呀~

  • git branch
  • git checkout
  • git merge

git branch

git branch用處多多呢,比如新建分支、檢視分支、刪除分支等等

新建分支:

git checkout -b dev2  新建一個分支,並且切換到新的分支dev2
git branch dev2 新建一個分支,但是仍停留在原來分支

檢視分支:

git branch    檢視本地所有的分支
git branch -r  檢視所有遠端的分支
git branch -a  檢視所有遠端分支和本地分支

刪除分支:

git branch -D <branchname>  刪除本地branchname分支

git checkout

切換分支:

git checkout master 切換到master分支

git merge

我們在開發分支dev開發、測試完成在釋出之前,我們一般需要把開發分支dev程式碼合併到master,所以git merge也是程式設計師必備的一個命令。

git merge master  在當前分支上合併master分支過來
git merge --no-ff origin/dev  在當前分支上合併遠端分支dev
git merge --abort 終止本次merge,並回到merge前的狀態

比如,你開發完需求後,發版全需要把程式碼合到主幹master分支,如下:

Git進階之處理衝突

Git版本控制,還是多個人一起搞的,多個分支並存的,這就難免會有衝突出現~

Git合併分支,衝突出現

同一個檔案,在合併分支的時候,如果同一行被多個分支或者不同人都修改了,合併的時候就會出現衝突。

舉個粟子吧,我們現在在dev分支,修改HelloWorld.java檔案,假設修改了第三行,並且commit提交到本地倉庫,修改內容如下:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello,撿田螺的小男孩!");
    }
}

我們切回到master分支,也修改HelloWorld.java同一位置內容,如下:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello,jay!!");
    }
}

再然後呢,我們提交一下master分支的這個改動,並把dev分支合併過下,就出現衝突啦,如圖所示:

Git解決衝突

Git 解決衝突步驟如下:

  • 檢視衝突檔案內容
  • 確定衝突內容保留哪些部分,修改檔案
  • 重新提交,done

1.檢視衝突檔案內容

git merge提示衝突後,我們切換到對應檔案,看看衝突內容哈,,如下:

2.確定衝突內容保留哪些部分,修改檔案

  • Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容,
  • <<<<<<<HEAD是指主分支修改的內容,>>>>>>> dev是指dev分支上修改的內容

所以呢,我們確定到底保留哪個分支內容,還是兩個分支內容都保留呢,然後再去修改檔案衝突內容~

3.修改完衝突檔案內容,我們重新提交,衝突done

Git進階之撤銷與回退

Git的撤銷與回退,在日常工作中使用的比較頻繁。比如我們想將某個修改後的檔案撤銷到上一個版本,或者想撤銷某次多餘的提交,都要用到git的撤銷和回退操作。

程式碼在Git的每個工作區域都是用哪些命令撤銷或者回退的呢,如下圖所示:

有關於Git的撤銷與回退,一般就以下幾個核心命令

  • git checkout
  • git reset
  • git revert

git checkout

如果檔案還在工作區,還沒新增到暫存區,可以使用git checkout撤銷

git checkout [file]  丟棄某個檔案file
git checkout .  丟棄所有檔案

以下demo,使用git checkout -- test.txt 撤銷了暫存區test.txt的修改

git reset

git reset的理解

git reset的作用是修改HEAD的位置,即將HEAD指向的位置改變為之前存在的某個版本.

為了更好地理解git reset,我們來回顧一下,Git的版本管理及HEAD的理解

Git的所有提交,會連成一條時間軸線,這就是分支。如果當前分支是master,HEAD指標一般指向當前分支,如下:

假設執行git reset,回退到版本二之後,版本三不見了哦,如下:

git reset的使用

Git Reset的幾種使用模式

git reset HEAD --file
回退暫存區裡的某個檔案,回退到當前版本工作區狀態
git reset –-soft 目標版本號 可以把版本庫上的提交回退到暫存區,修改記錄保留
git reset –-mixed 目標版本號 可以把版本庫上的提交回退到工作區,修改記錄保留
git reset –-hard  可以把版本庫上的提交徹底回退,修改的記錄全部revert。

先看一個粟子demo吧,程式碼git add到暫存區,並未commit提交,就以下醬紫回退,如下:

git reset HEAD file 取消暫存
git checkout file 撤銷修改

再看另外一個粟子吧,程式碼已經git commit了,但是還沒有push:

git log  獲取到想要回退的commit_id
git reset --hard commit_id  想回到過去,回到過去的commit_id

如果程式碼已經push到遠端倉庫了呢,也可以使用reset回滾哦(這裡大家可以自己操作實踐一下哦)~

git log
git reset --hard commit_id
git push origin HEAD --force

git revert

與git reset不同的是,revert複製了那個想要回退到的歷史版本,將它加在當前分支的最前端。

revert之前:

revert 之後:

當然,如果程式碼已經推送到遠端的話,還可以考慮revert回滾呢

git log  得到你需要回退一次提交的commit id
git revert -n <commit_id>  撤銷指定的版本,撤銷也會作為一次提交進行儲存

Git進階之標籤tag

打tag就是對釋出的版本標註一個版本號,如果版本釋出有問題,就把該版本拉取出來,修復bug,再合回去。

git tag  列出所有tag
git tag [tag] 新建一個tag在當前commit
git tag [tag] [commit] 新建一個tag在指定commit
git tag -d [tag] 刪除本地tag
git push origin [tag] 推送tag到遠端
git show [tag] 檢視tag
git checkout -b [branch] [tag] 新建一個分支,指向某個tag

Git其他一些經典命令

git rebase

rebase又稱為衍合,是合併的另外一種選擇。

假設有兩個分支master和test

      D---E test
      /
 A---B---C---F--- master

執行 git merge test得到的結果

       D--------E
      /          \
 A---B---C---F----G---   test, master

執行git rebase test,得到的結果

A---B---D---E---C‘---F‘---   test, master

rebase好處是:獲得更優雅的提交樹,可以線性的看到每一次提交,並且沒有增加提交節點。所以很多時候,看到有些夥伴都是這個命令拉程式碼:git pull --rebase

git stash

stash命令可用於臨時儲存和恢復修改

git stash  把當前的工作隱藏起來 等以後恢復現場後繼續工作
git stash list 顯示儲存的工作進度列表
git stash pop stash@{num} 恢復工作進度到工作區
git stash show :顯示做了哪些改動
git stash drop stash@{num} :刪除一條儲存的工作進度
git stash clear 刪除所有快取的stash。

git reflog

顯示當前分支的最近幾次提交

git blame filepath

git blame 記錄了某個檔案的更改歷史和更改人,可以檢視背鍋人,哈哈

git remote

git remote   檢視關聯的遠端倉庫的名稱
git remote add url   新增一個遠端倉庫
git remote show [remote] 顯示某個遠端倉庫的資訊


文章內容轉載,參考連結:
https://www.cnblogs.com/hexiaobao/p/8134829.html
https://www.cnblogs.com/jay-huaxiao/p/13198979.html