7000+ 字帶你全面搞懂 Git 命令+原理!

2021-02-19 數據分析與開發

(給數據分析與開發加星標,提升數據技能)

來源:撿田螺的小男孩 

前言

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

文章目錄

Git是什麼

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

什麼是版本控制?

百度百科定義是醬紫的~

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

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

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

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

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

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

用戶在本地就可以查看所有的歷史版本信息,但是偶爾要從遠程更新一下,因為可能別的用戶有文件修改提交到遠程哦。用戶即使離線也可以本地提交,push推送到遠程伺服器才需要聯網。每個用戶都保存了歷史版本,所以只要有一個用戶設備沒問題,就可以恢復數據啦~什麼是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的基本常用命令

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

git clone

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

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分支合併到當前本地分支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 branch用處多多呢,比如新建分支、查看分支、刪除分支等等

新建分支:

git checkout -b dev2  新建一個分支,並且切換到新的分支dev2git 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  在當前分支上合併遠程分支devgit 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 解決衝突步驟如下:

1.查看衝突文件內容

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

2.確定衝突內容保留哪些部分,修改文件Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容,<<<<<<<HEAD是指主分支修改的內容,>>>>>>> dev是指dev分支上修改的內容

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

3.修改完衝突文件內容,我們重新提交,衝突doneGit進階之撤銷與回退

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

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

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

git checkout

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

git checkout [file]  丟棄某個文件filegit checkout .  丟棄所有文件

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

git resetgit 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_idgit reset --hard commit_id  想回到過去,回到過去的commit_id

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

git loggit reset --hard commit_idgit push origin HEAD --force

git revert

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

revert之前:revert 之後:

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

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

Git進階之標籤tag

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

git tag  列出所有taggit tag [tag] 新建一個tag在當前commitgit tag [tag] [commit] 新建一個tag在指定commitgit tag -d [tag] 刪除本地taggit push origin [tag] 推送tag到遠程git show [tag] 查看taggit 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] 顯示某個遠程倉庫的信息

參考與感謝

感謝各位前輩的文章:

一個小時學會Git(https://www.cnblogs.com/best/p/7474442.html#_label3_4_0_4)【Git】(1)---工作區、暫存區、版本庫、遠程倉庫(https://www.cnblogs.com/qdhxhz/p/9757390.html)Git Reset 三種模式(https://www.jianshu.com/p/c2ec5f06cf1a)Git恢復之前版本的兩種方法reset、revert(圖文詳解)(https://blog.csdn.net/yxlshk/article/details/79944535)Git撤銷&回滾操作(git reset 和 get revert)(https://blog.csdn.net/asoar/article/details/84111841)為什麼要使用git pull --rebase?(https://www.jianshu.com/p/dc367c8dca8e)

- EOF -

看完本文有收穫?請轉發分享給更多人

關注「數據分析與開發」加星標,提升數據技能

點讚和在看就是最大的支持❤️

相關焦點

  • 20 分鐘教你搞懂 Git!
    以下為譯文:儘管每天你都會用到Git,但也有可能搞不懂它的工作原理。為什麼Git可以管理版本?如果你知道該二進位對象名,就可以查看.git/objects子目錄中該文件的內容。git status命令可以輸出更多可讀的結果。
  • 1小時搞懂 Git 版本控制
    起初因為沒有接觸過 Git,覺得這玩意很難學,又是一大堆命令需要記憶,在他教我的時候內心是牴觸的,當時覺得為什麼不把寫好的代碼發送給我呢?你是否也有過這樣的疑問呢?學習 Git 的時候,因為沒有和他認真學,在他教過我一遍之後還是一臉懵逼,寫命令的時候也是不時地回頭查看。因為不懂得 Git 版本控制的原理,總是將代碼推送不到遠程伺服器,同時還出現一大堆錯誤,只好不停地去詢問他原因。
  • Git分支原理命令圖文解析
    現在,讓我們看看與git分支有關的操作命令: 1、git branch [option] [name] 如果不使用任何參數,它可以用來查看所有的分支,而在分支名前有*標記的則為主分支,如果加上name為創建新分支,,如git branch child,則會創建一個名為child的分支,此外,它有一些常用的參數:
  • Git: 聊聊Rebase命令
    先切換會origin分支,通過pull指令將origjn分支上的最新改動拉取下來。然後在用git checkout mywork切換會mywork分支,到這裡就能用git rebase orgin來進行變基了。
  • git底層原理,從常見操作解釋git的底層原理,再也不怯
    要為這個項目做貢獻,你需要從該項目克隆出一個自己的公開倉庫,然後將自己的修改推送上去。接著你可以請求官方倉庫的維護者拉取更新合併到主項目。維護者可以將你的倉庫作為遠程倉庫添加進來,在本地測試你的變更,將其合併入他們的分支並推送回官方倉庫。在這裡插入圖片描述項目維護者推送到主倉庫。貢獻者克隆此倉庫,做出修改。貢獻者將數據推送到自己的公開倉庫。
  • 帶你深入理解 Git 原理
    本文譯自:https://dev.to/unseenwizzard/learn-git-concepts-not-commands-4gjc此交互式 Git 教程旨在教會你 Git 的工作原理,而不僅僅是執行哪些命令。
  • 我說小夥子,你死記Git命令,不好使
    來源 l 經授權轉自 編程充電寶作者 l 在所不辭很多Git命令靠死記硬背很難徹底掌握,本文我們就從常用命令的工作原理角度入手,來徹底掌握這些命令。add命令把當前文件加入暫存區,然後git commit把暫存區生成的快照提交到本地倉庫,最後再用git push命令把本地倉庫的提交複製到遠程倉庫,也就是Github之類的在線倉庫。
  • Git 常用命令清單筆記
    分享出來方便自己查看,也許能幫助到你。git pull origin next # 遠程分支是與當前分支合併上面一條命令等同於下面兩條命令git fetch origingit merge origin/next如果遠程主機刪除了某個分支,默認情況下,git pull 不會在拉取遠程分支的時候,刪除對應的本地分支。
  • Git命令解析 - merge、rebase
    如下圖:branch命令可以輕鬆創建一個新分支,就像這樣:$ git branch new_branch這一命令實際是為當前提交對象添加了一個新的指針。這種分支形式比大多數版本控制系統更為輕量,無論是創建還是切換都幾乎可以在瞬間完成。
  • 圖文詳解 Git 工作原理
    本文圖解Git中的最常用命令。如果你稍微理解Git的工作原理,這篇文章能夠讓你理解的更透徹。
  • Git 常用命令及使用
    Git 常用命令使用1)、本地庫初始化 git init2)、設置籤名作用:區分不同開發人員的身份。說明:這裡設置的籤名和登錄遠程庫(代碼託管中心)的帳戶沒有關係。a)、項目級別籤名:git config user.name [AAA]git config user.email [郵箱地址]籤名信息位置:cat .git/configb)、系統級別籤名:git config --globaluser.name [AAA]git config --global user.email
  • Python 命令行之旅:使用 docopt 實現 git 命令
    作者:HelloGitHub-Prodesire一、前言 在前面兩篇介紹 docopt 的文章中,我們全面了解了 docopt 的能力。按照慣例,我們要像使用 argparse 一樣使用 docopt 來實現 git 命令。
  • Git命令的動畫展示,讓我們學習Git事半功倍
    Git幾乎是每個程式設計師的標配,當然有時候也是噩夢,因為如果不是對他的各種命令非常熟悉的話,各種繞腦的命令會把我們弄暈,因為很多時候我們並不知道這個命令內部到底是怎麼樣的,如果每一個命令都有相對應的動畫,我們是不是理解起來更容易一些呢?
  • Git命令的用法小結
    git命令的基本數據流Git架構倉庫一個git倉庫包含工作目錄,與.git目錄。也可以通過命令行設置,如$ git config --global user.email 郵箱機制$ git config --global user.name 用戶名幫助(help)有多種方式獲取git的整體幫助,或者某個命令的幫助。
  • git在項目中的常用命令
    其中.git文件夾中包含了兩個部分,一個是暫存區(Index或者Stage),顧名思義就是暫時存放文件的地方,通常使用add命令將工作區的文件添加到暫存區裡;本地倉庫:.git文件夾裡還包括git自動創建的master分支,並且將HEAD指針指向master分支。
  • 熟悉Git使用的一些實操練習命令
    所以今天蟲蟲就給你總結了這樣一份材料,供你跟著實際操作聯繫。1.交互式添加文件的選定部分git add -padd -p(或-patch)允許交互選擇要提交的每個跟蹤文件的各個變化內容。只提交選定的更改。
  • 你應該知道的10個Git命令(附連結)
    如果你只是處理尚未合併到協作遠程工作的本地提交,則可以使用這些命令中的任何一個。如果你正在協同工作並且需要中和遠程分支中的提交,那麼git revert就是你的工具。這些命令中的每一個都可以採用多種選擇。
  • 一學就會的git命令
    導讀使用git 已不知好幾年,最近想著把常用的一些git 命令做個總結,本文主要寫的是git常用的命令。>git config --global user.name 'your name' // 全局配置用戶名git help (查看文檔)查看常見的命令;查看git全部的命令;查看git命令某個文檔, 舉個慄子:
  • Git新手使用命令集合-初級
    哈哈當然,對於使用命令操作來講,一般只要記住幾個就可以了,如果要熟練使用,那麼至少得60~~100+吧!不然也不能算熟練吧!所以要全部一下記住,常人來講,還是有一些難度吧!那麼,如果命令行操作還有難度的朋友們注意了,本文就是你的福音,我這裡也主要寫給各種會使用到命令行操作GIT的小猿們。
  • 你可能不太會用的 10 個 Git 命令
    如果你不熟悉基本的 git 命令,在閱讀本文前可以先參考我之前寫的關於 Git 工作流程的文章。地址:https://towardsdatascience.com/learn-enough-git-to-be-useful-281561eef959本文介紹了 10 個常見的命令以及它們的一些參數。