程序員必備基礎:Git 命令全方位學習

前言

掌握 Git 命令是每位程序員必備的基礎,之前一直是用 smartGit 工具,直到看到大佬們都是在用 Git 命令操作的,回想一下,發現有些 Git 命令我都忘記了,於是寫了這篇博文,複習一下~

文章目錄

Git 是什麼

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

什麼是版本控制?

百度百科定義是醬紫的~

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

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

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

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

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

分佈式版本控制系統,就是遠程倉庫同步所有版本信息到本地的每個用戶。嘻嘻,這裏分三點闡述吧:

什麼是 Git?

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

Git 的相關理論基礎

Git 的四大工作區域

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

Git 的工作流程

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

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

Git 文件的四種狀態

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

一張圖解釋 Git 的工作原理

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

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

git clone

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

1git clone url  克隆遠程版本庫
2

git checkout -b dev

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

創建分支:

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

git add

git add 的使用格式:

1git add .	添加當前目錄的所有文件到暫存區
2git add [dir]	添加指定目錄到暫存區,包括子目錄
3git add [file1]	添加指定文件到暫存區
4

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

1git add Hello.java  把HelloWorld.java文件添加到暫存區去
2

git commit

git commit 的使用格式:

1git commit -m [message] 提交暫存區到倉庫區,message爲說明信息
2git commit [file1] -m [message] 提交暫存區的指定文件到本地倉庫
3git commit --amend -m [message] 使用一次新的commit,替代上一次提交
4

把 HelloWorld.java 文件加到暫存區後,我們接着可以提交到本地倉庫啦~

1git commit -m 'helloworld開發'
2

git status

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

1git status  查看當前工作區暫存區變動
2git status -s  查看當前工作區暫存區變動,概要信息
3git status  --show-stash 查詢工作區中是否有stash(暫存的文件)
4

當你忘記是否已把代碼文件添加到暫存區或者是否提交到本地倉庫,都可以用 git status 看看哦~

git log

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

1git log  查看提交歷史
2git log --oneline 以精簡模式顯示查看提交歷史
3git log -p <file> 查看指定文件的提交歷史
4git blame <file> 一列表方式查看指定文件的提交歷史
5

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

git diff

1git diff 顯示暫存區和工作區的差異
2git diff filepath   filepath路徑文件中,工作區與暫存區的比較差異
3git diff HEAD filepath 工作區與HEAD ( 當前工作分支)的比較差異
4git diff branchName filepath 當前分支的文件與branchName分支的文件的比較差異
5git diff commitId filepath 與某一次提交的比較差異
6

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

git pull/git fetch

1git pull  拉取遠程倉庫所有分支更新併合併到本地分支。
2git pull origin master 將遠程master分支合併到當前本地分支
3git pull origin master:master 將遠程master分支合併到當前本地master分支,冒號後面表示本地分支
4git fetch --all  拉取所有遠端的最新代碼
5git fetch origin master 拉取遠程最新master分支代碼
6

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

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

git push

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

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

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

Git 進階之分支處理

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

git branch

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

新建分支:

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

查看分支:

1git branch    查看本地所有的分支
2git branch -r  查看所有遠程的分支
3git branch -a  查看所有遠程分支和本地分支
4

刪除分支:

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

git checkout

切換分支:

1git checkout master 切換到master分支
2

git merge

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

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

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

Git 進階之處理衝突

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

Git 合併分支,衝突出現

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

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

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

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

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

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

Git 解決衝突

Git 解決衝突步驟如下:

1. 查看衝突文件內容

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

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

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

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

Git 進階之撤銷與回退

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

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

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

git checkout

如果文件還在工作區,還沒添加到暫存區,可以使用 git checkout 撤銷

1git checkout [file]  丟棄某個文件file
2git checkout .  丟棄所有文件
3

以下 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 的幾種使用模式

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

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

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

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

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

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

1git log
2git reset --hard commit_id
3git push origin HEAD --force
4

git revert

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

revert 之前:revert 之後:

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

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

Git 進階之標籤 tag

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

1git tag  列出所有tag
2git tag [tag] 新建一個tag在當前commit
3git tag [tag] [commit] 新建一個tag在指定commit
4git tag -d [tag] 刪除本地tag
5git push origin [tag] 推送tag到遠程
6git show [tag] 查看tag
7git checkout -b [branch] [tag] 新建一個分支,指向某個tag
8

Git 其他一些經典命令

git rebase

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

假設有兩個分支 master 和 test

1      D---E test
2      /
3 A---B---C---F--- master
4

執行 git merge test 得到的結果

1       D--------E
2      /          \
3 A---B---C---F----G---   test, master
4

執行 git rebase test,得到的結果

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

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

git stash

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

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

git reflog

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

git blame filepath

git blame 記錄了某個文件的更改歷史和更改人,可以查看背鍋人,哈哈

git remote

1git remote   查看關聯的遠程倉庫的名稱
2git remote add url   添加一個遠程倉庫
3git remote show [remote] 顯示某個遠程倉庫的信息
4

參考與感謝

感謝各位前輩的文章:

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/GTjU5u8btIGcLEiM7GnUQQ