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

前言

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

github.com/whx123/Java…前端

公衆號:撿田螺的小男孩java

文章目錄git

  • Git是什麼?
  • Git的相關理論基礎
  • 平常開發中,Git的基本經常使用命令
  • Git進階之分支處理
  • Git進階之處理衝突
  • Git進階之撤銷與回退
  • Git進階之標籤tag
  • Git其餘一些經典命令

Git是什麼

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

什麼是版本控制?

百度百科定義是醬紫的~github

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

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

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

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

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

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

  • 用戶在本地就能夠查看全部的歷史版本信息,可是偶爾要從遠程更新一下,由於可能別的用戶有文件修改提交到遠程哦。
  • 用戶即便離線也能夠本地提交,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的基本經常使用命令

  • 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] 顯示某個遠程倉庫的信息
複製代碼

參考與感謝

感謝各位前輩的文章:

公衆號

  • 歡迎關注我我的公衆號,交個朋友,一塊兒學習哈~
  • 若是文章有錯誤,歡迎指出哈,感激涕零~
相關文章
相關標籤/搜索