JB的git之旅-git命令行

前言

關於git的介紹,這裏就不在重複了,感興趣的同窗能夠看下以前寫的文章,有關於git跟svn區別及怎麼配置git;
git

最近在折騰gitlab ci,想作一些工具,其中涉及到用哪些git命令,來回奔波查詢,因此想寫一篇git命令相關的,當作總結備忘,方便後續本身查詢,同時也想加深印象;緩存

關於工具,有不少git圖形化工具,jb一開始也是使用圖形化工具的,可是隨着時間的流逝,在使用圖形化工具遇到很多問題,
好比提交到緩衝區,不想push,怎麼撤回?push後怎麼回滾等等問題,對工具是有學習成本的,
與其熟悉工具,不如花點時間瞭解下Git命令,況且,手動敲命令,看上去很牛逼啊~服務器

本地命令

1.配置文件-git config

通常教程在安裝完git後都會引導配置用戶名跟郵箱,此時就須要git config命令了,而用戶名跟郵箱,都是本地git客戶端的一個變量,不跟隨git庫而改變的~編輯器

區分configlocal
config是表明全局修改:系統中對全部用戶都廣泛使用的配置;對應的文件是**/etc/gitconfig**,
在使用git config --system,讀取的就是這個文件
local是表明用戶修改:用戶目錄下的配置文件,只適用於當前用戶;對應的文件是**~/.gitconfig**,
在使用git config --global,讀取的就是這個文件
工做目錄文件是**.git/config**,這裏的配置僅僅針對當前項目有效svn

從優先級的角度來看,local比config要高工具

git config user.name     #查看用戶名
git config user.email    #查看郵箱
git config --global user.name "your name"    #設置用戶名
git config --global user.email "your email"  #設置郵箱

#其餘配置
git config --global --list   #查看全局設置相關參數列表
git config --local --list   #查看本地設置相關參數列表
git config --system --list  #查看系統設置參數列表
git config --list   #查看全部git的配置(全局+本地+系統)
git config --global core.edit 喜歡的編輯器
複製代碼

2.獲取幫助-git help

git help  #好比,要學習config命令怎麼使用,git help config
複製代碼

3.初始化倉庫-git init

git init 倉庫名 # 建立一個新的帶Git倉庫的項目
git init # 爲已存在的項目生成一個Git倉庫
複製代碼

4.添加文件到暫存區-git add

使用git add文件名,把文件添加到暫存區,支持批量添加gitlab

git add 文件名 # 將工做區的某個文件添加到暫存區   
git add -u # 將已跟蹤文件中的修改和刪除的文件添加到暫存區,不包括新增長的文件
git add -A # 將全部的已跟蹤的文件的修改與刪除和新增的未跟蹤的文件都添加到暫存區
git add . # 將當前工做區的全部文件都加入暫存區
git add -i # 進入交互界面模式,按需添加文件到緩存區
複製代碼

交互模式長這樣:學習

這裏還想介紹一種場景:
假如你修改了文件 a.txt,而後把它 add 進了暫存區:fetch

git add a.txt
git status
複製代碼

而後又往 a.txt 裏寫了幾行東西。這時候你再 status 一下的話:編碼

git status
複製代碼

會發現你的 a.txt 既在 "Changes to be commited" 的暫存區,又在 "Changes not staged for commit"。
不用以爲奇怪,這是由於經過 add 添加進暫存區的不是文件名,而是具體的文件改動內容。
在 add 時的改動都被添加進了暫存區,但在 add 以後的新改動並不會自動被添加進暫存區。在這時若是你提交:

git commit
複製代碼

那麼你那些新的改動是不會被提交的。

因此須要先從新add文件,再commit,才能把最新的內容提交進去~

5.將緩存區的文件提交到本地倉庫-git commit

git commit -m "提交說明" # 將暫存區內容提交到本地倉庫
git commit -a -m "提交說明" # 跳過緩存區操做,直接把工做區內容提交到本地倉庫
git commit -amend #合併上一次提交,在不增長一個新的commit-id的狀況下將新修改的代碼追加到前一次的commit-id中
複製代碼

若是不加-m "提交說明",git會讓用你讓默認編輯器(如vi)來編寫提交說明,

6.查看工做區與緩衝區的狀態-git status

git status # 查看工做區與暫存區的當前狀況
git status -s # 讓結果以更簡短的形式輸出
複製代碼

7.差別對比-git diff

git diff # 工做區與緩存區的差別
git diff 分支名 #工做區與某分支的差別,遠程分支這樣寫:remotes/origin/分支名
git diff HEAD  # 工做區與HEAD指針指向的內容差別
git diff 提交id 文件路徑 # 工做區某文件當前版本與歷史版本的差別
git diff --stage # 工做區文件與上次提交的差別(1.6 版本前用 --cached)
git diff 版本TAG # 查看從某個版本後都改動內容
git diff 分支A 分支B # 比較從分支A和分支B的差別(也支持比較兩個TAG)
git diff 分支A...分支B # 比較兩分支在分開後各自的改動
git diff --cached  #顯示全部已添加緩存區但還未提交的變動
複製代碼

8.查看歷史提交記錄-git log

git log # 查看全部commit記錄(SHA-A校驗和做者名稱,郵箱,提交時間,提交說明)
git log -p -次數 # 查看最近多少次的提交記錄
git log --stat # 顯示提交日誌及相關變更文件
git log --name-only # 僅顯示已修改的文件清單
git log --name-status # 顯示新增,修改,刪除的文件清單
git log --oneline # 讓提交記錄以精簡的一行輸出
git log –graph –all --online # 圖形展現分支的合併歷史
git log --author=做者  # 查詢做者的提交記錄(和grep同時使用要加一個--all--match參數)
git log --grep=過濾信息 # 列出提交信息中包含過濾信息的提交記錄
git log -S查詢內容 # 和--grep相似,S和查詢內容間沒有空格
git log fileName # 查看某文件的修改記錄
複製代碼

若是想定製化顯示提交記錄信息,也是支持的,使用-pretty進行定製:

git log --pretty=format:\"%an-%h-%s-%H\" -1
複製代碼

format是一個佔位符,能夠定製要顯示的記錄格式,方便後期提取分析;

如下爲經常使用的格式佔位符寫法以及表明的意義:

選項 說明 選項 說明
%H 提交對象(commit)的完整哈希字串 %h 提交對象的簡短哈希字串
%T 樹對象(tree)的完整哈希字串 %t 樹對象的簡短哈希字串
%P 父對象(parent)的完整哈希字串 %p 父對象的簡短哈希字串
%an 做者(author)的名字 %ae 做者的電子郵件地址
%ad 做者修訂日期(能夠用 -date= 選項定製格式) %ar 做者修訂日期,按多久之前的方式顯示
%cn 提交者(committer)的名字 %ce 提交者的電子郵件地址
%cd 提交日期 %cr 提交日期,按多久之前的方式顯示
%s 提交說明

用 oneline 或 format 時結合 --graph 選項,能夠看到開頭多出一些 ASCII 字符串表示的簡單圖形,形象地展現了每一個提交所在的分支及其分化衍合狀況。

以上只是簡單介紹了一些 git log 命令支持的選項,下面還有一些其餘經常使用的選項及其釋義;

選項 說明
-p 按補丁格式顯示每一個更新之間的差別。
--word-diff 按 word diff 格式顯示差別。
--stat 顯示每次更新的文件修改統計信息。
--shortstat 只顯示 --stat 中最後的行數修改添加移除統計。
--name-only 僅在提交信息後顯示已修改的文件清單。
--name-status 顯示新增、修改、刪除的文件清單。
--abbrev-commit 僅顯示 SHA-1 的前幾個字符,而非全部的 40 個字符。
--relative-date 使用較短的相對時間顯示(好比,「2 weeks ago」)。
--graph 顯示 ASCII 圖形表示的分支合併歷史。
--pretty 使用其餘格式顯示歷史提交信息。可用的選項包括 oneline,short,full,fuller 和 format(後跟指定格式)。
--oneline --pretty=oneline --abbrev-commit 的簡化用法。

還有一些限制輸出長度的方案,好比只想看最近1天或者最新一條的日誌等等;

git log --since=2.weeks  #最近兩週內的提交
複製代碼
選項 說明
-(n) 僅顯示最近的 n 條提交
--since, --after 僅顯示指定時間以後的提交。
--until, --before 僅顯示指定時間以前的提交。
--author 僅顯示指定做者相關的提交。
--committer 僅顯示指定提交者相關的提交。
–grep 僅顯示含指定關鍵字的提交
-S 僅顯示添加或移除了某個關鍵字的提交

詳細的,能夠看看git官網的介紹,點擊這裏~

9.查看某行代碼誰提交的-get blame

git blame 文件名 # 查看某文件的每一行代碼的做者,最新commit和提交時間
複製代碼

10.設置Git命令別名-git config –global alias

每次都要輸入完整的命令,挺麻煩的,好比checkout,那有沒有辦法直接輸入co就能夠達到checkout呢?

git config --global alias.st status #此處設置st爲別名,做用就是status
複製代碼

11.給重要的commit打標籤-git tag

通常重要的提交,好比版本發佈的,都須要打上一個標記,以便後續作回滾處理~
列出標籤:

git tag # 在控制檯打印出當前倉庫的全部標籤
git tag -l ‘v0.1.*’ # 搜索符合模式的標籤
複製代碼

打標籤:
git標籤分爲兩種類型:輕量標籤和附註標籤
輕量標籤是指向提交對象的引用,附註標籤則是倉庫中的一個獨立對象
簡單說,前者只是在提交上加個TAG,指向提交的Hash值;
後者還會保存打標籤者的信息,時間和附加信息;
建議使用附註標籤。

git tag 標記內容 # 輕量標籤
git tag -a 標記內容 -m "附加信息" # 附加標籤
複製代碼

建立輕量標籤不須要傳遞參數,直接指定標籤名稱便可。
建立附註標籤時,參數a即annotated的縮寫,指定標籤類型,後附標籤名。
參數m指定標籤說明,說明信息會保存在標籤對象中。
若是想爲以前的某次commit打TAG的話,能夠先找出SHA1值,設置調下述命令:

git tag -a 標記內容 版本id # 好比:git tag -a v1.1 9202ff53
複製代碼

切換標籤
與切換分支命令相同:

git checkout [tagname]
複製代碼

新建分支的時候也加上TAG:

git checkout -b 分支名 標記內容
複製代碼

用show命令查看標籤對應的信息:

git show 標記內容
複製代碼

刪除本地Tag:

git tag -d 標記內容
複製代碼

刪除遠程Tag:

git push origin --delete tag 標記內容
複製代碼

默認狀況,git push不會把標籤推送TAG到遠程倉庫,若是想推送到服務器,能夠:

git push origin 標記內容 # 推送某標籤到

# 刪除全部本地倉庫中不存在的TAG:
git push origin --tags 
複製代碼

補打標籤:

git tag -a v0.1.1 9fbc3d0
複製代碼

12.Git命令自動補全-輸命令的時候按兩次tab鍵

13.臨時存放工做目錄的改動-git stash

平常生活中,總會遇到須要救火的事情,好比當你在一個分支上編碼時,隔壁同窗說,jb,你那個模塊有BUG,趕忙修復提交下,固然,也能夠commit全部文件,而後等處理完事情後再commit撤銷回來,但這裏要介紹的是更好用的命令-git stash;

在 Git 中,stash 指令能夠幫你把工做目錄的內容所有放在你本地的一個獨立的地方,它不會被提交,也不會被刪除,你把東西放起來以後就能夠去作你的臨時工做了,作完之後再來取走,就能夠繼續以前手頭的事了。

具體說來,stash 的用法很簡單。當你手頭有一件臨時工做要作,須要把工做目錄暫時清理乾淨,那麼你能夠:

git stash
複製代碼

就這麼簡單,你的工做目錄的改動就被清空了,全部改動都被存了起來。

當你忙完的時候,切回你的分支,而後:

git stash pop
複製代碼

以前存儲的東西就都回來了。很方便吧?

注意:沒有被 add 過的文件不會被 stash 起來,由於 Git 會忽略它們。若是想把這些文件也一塊兒 stash,能夠加上 -u 參數,它是 --include-untracked 的簡寫。就像這樣:

git stash -u
複製代碼

文件恢復/版本回滾

1.文件恢復-已經add到暫存區,但未commit-get checkout

假如說,一個文件被add到暫存區,可是未commit,此時不當心被刪除了,怎麼恢復?

上面的截圖是從一個新建文件到add到再到刪除,能夠看的出,工做區的jb.txt被刪除了,可是暫存區裏的jb.txt還未刪除;

# 刪除暫存區中的文件:
git rm 文件名

#同時刪除工做區和暫存區中的文件
git rm -f 文件名

#刪除暫存區的文件,不刪除工做區的文件
git rm -cached 文件名

# 誤刪恢復文件
git checkout -- 文件名
複製代碼

2,撤銷操做

撤銷操做通常有兩種狀況:

  • 文件修改後尚未提交到暫存區,進行撤銷操做以後,文件恢復到和版本庫中如出一轍

  • 文件修改後提交到了暫存區,進行撤銷以後,文件恢復到在提交到暫存區以前的狀態

    git checkout --文件名
    複製代碼

3.

1.撤銷操做-git checkout

撤銷操做通常有兩種狀況:

  • 文件修改後尚未提交到暫存區,進行撤銷操做以後,文件恢復到和版本庫中如出一轍
  • 文件修改後提交到了暫存區,進行撤銷以後,文件恢復到在提交到暫存區以前的狀態

文件未提交到暫存區

git checkout --文件名
複製代碼

文件提交到了暫存區,但未提交到本地倉庫
若是某個文件寫錯了,想要修改,可是已經add到了暫存區,那須要先撤銷到工做區

git reset HEAD 文件名
複製代碼

此時文件已經撤銷到工做區,可是文件內容是沒變化,若是想要恢復到修改以前的狀態,就要使用:

git checkout -- 文件名
複製代碼

2.刪除文件-git rm

# 刪除暫存區中的文件:
git rm 文件名
    
#同時刪除工做區和暫存區中的文件
git rm -f 文件名
    
#刪除暫存區的文件,不刪除工做區的文件
git rm -cached 文件名
複製代碼

3.恢復文件-git reset

若是想要將某個文件恢復到某個版本時的狀態,可使用如下的命令:

git checkout id 文件名
複製代碼

id就是使用git log時的commit id,取前7位便可~

若是要將全部我呢見都恢復到某個版本,能夠用下面的命令:

git checkout id 文件名
複製代碼

除了用id恢復到某個版本庫時的狀態,還有別的寫法:

//恢復到上一個版本
git reset --hard HEAD^ 
// 恢復到前兩個版本
git reset --hard HEAD~2   或者  git reset --hard HEAD^^
# git log查看到的commit值,取前七位便可
git reset --hard 版本號 
複製代碼

4.查看輸入指令記錄-git reflog

git reflog 能夠查看全部分支的全部操做記錄(包括commit和reset的操做),包括已經被刪除的commit記錄,git log則不能察看已經刪除了的commit記錄,

5.撤銷某次提交-git revert

有時可能想撤銷某次提交所作的更改,可使用revert命令

git revert HEAD # 撤銷最近的一個提交
git revert 版本號 # 撤銷某次commit
複製代碼

特別注意,這裏的撤銷不是真的撤銷,並且生成一個新的提交覆蓋舊的提交,而提交的內容是以前的內容而已,因此,提交記錄仍是會存在的,別僥倖哦~

6.查看某次提交修改內存-git slow

git show 提交id # 查看某次commit的修改內容
複製代碼

7.查看某個分支的版本號-git rev-parse

git rev-parse 分支名 # 查看分支commit的版本號,能夠寫HEAD
複製代碼

8.找回文件象-git fsck

git fsck --lost-found  #能夠查到丟失的記錄
複製代碼

本地分支

1.分支建立與切換-git branch

git branch 分支名 # 建立分支
git branch # 查看本地分支

git checkout 分支名 # 切換分支
git checkout -b 分支名 # 建立分支同時切換到這個分支
複製代碼

2.合併分支-git merge

git merge <name> #合併某分支到當前分支
複製代碼

3.衝突處理

當在提交一個文件或者merge的時候,若是也有對應修改的地方,就會出現衝突,與svn不一樣的是,git就算衝突,內容也是被合併的,此時就須要處理衝突文件;

打開文件後會發現,代碼中會被<<<<<<< 、=======、>>>>>>>包圍,這是衝突標記:
衝突標記<<<<<<< 與=======之間的內容是個人修改,=======與>>>>>>>之間的內容是別人的修改。

那就要處理,最後記得把符號都幹掉便可~

4.取消merge

當在處理衝突的時候,忽然不想merge了,怎麼辦?能夠用git merge --abort手動取消~

git merge --abort
複製代碼

輸入這行代碼,Git 倉庫就會回到 merge 前的狀態

5.刪除分支

git branch -d 分支名 # 刪除分支,分支上有未提交更改是不能刪除的
git branch -D 分支名 # 強行刪除分支,儘管這個分支上有未提交的更改
複製代碼

這裏說明下,不能直接刪除當前所在的分支,若是要刪除當前所在的分支,必需要先checkout到別的分支,再刪除以前的分支~

6.恢復誤刪分支

git log --branches="被刪除的分支名" # 找到被刪分支最新的commitb版本號
git branch 分支名 版本號(前七位便可) # 恢復被刪分支
複製代碼

7.分支重命名

git branch -m 老分支名 新分支名 # 分支重命名
複製代碼

遠程倉庫與遠程分支

1.推送本地倉庫到遠程倉庫-git push

git remote add origin 遠程倉庫地址  #關聯本地與遠程倉庫
    
    git push -u origin master  
    #將本地倉庫推送到遠程倉庫,-u是首次提交須要,後續都不須要
    git remote set-url origin 遠程倉庫地址 #修改遠程倉庫地址
    
    # 也能夠先刪除origin後再添加
    git remote rm origin    # 刪除倉庫關聯
    git remote add origin 遠程倉庫地址 # 添加倉庫關聯
複製代碼

2.克隆遠程倉庫-git clone

git clone 倉庫地址 # 克隆項目到當前文件夾下
git clone 倉庫地址 目錄名 # 克隆項目到特定目錄下
複製代碼

3.同步遠程倉庫更新-git pull

git pull #在當前分支直接輸入git pull便可
複製代碼

4.查看遠程分支

git branch -r # 查看全部分支
複製代碼

5.拉取遠程分支到本地倉庫

git checkout -b 本地分支 遠程分支 # 會在本地新建分支,並自動切換到該分支
git fetch origin 遠程分支:本地分支 # 會在本地新建分支,但不會自動切換,還需checkout
git branch --set-upstream 本地分支 遠程分支 # 創建本地分支與遠程分支的連接
複製代碼

6.刪除遠程分支

git push origin :分支名 
複製代碼

關於命令行,大體就介紹到這裏吧,詳細點的信息,就請移步到git官方查詢文吧:
git-scm.com/book/zh/v2

項目遷移

平常工做中,可能會出現項目遷移的狀況,簡單說就是把gitlab項目遷移到其餘倉庫那;

這裏先假設,原gitlab地址:git.jbold.com,新gitlab地址:git.jbnew.com

遷移步驟

  1. 查看目前舊倉庫的gitlab地址

    $ git remote -v
     origin  git.jbold.com:jb/jbtest.git (fetch)
     origin  git.jbold.com:jb/jbtest.git (push)
    複製代碼
  2. 在新gitlab上新建new項目,生成gitlab地址:

    git@git.jbnew.com/jb/jbtest-new.git
    複製代碼
  3. 設置本地gitlab地址替換成新的gitlab地址

    jb@LAPTOP-2R0431R1 MINGW64 ~/gitprojects/jbtest (master)
     $ git remote set-url origin git@git.jbnew.com/jb/jbtest-new.git
     
     jb@LAPTOP-2R0431R1 MINGW64 ~/gitprojects/jbtest (master)
     $ git remote -v
     origin  git@git.jbnew.com/jb/jbtest-new.git (fetch)
     origin  git@git.jbnew.com/jb/jbtest-new.git (push)
    複製代碼
  4. 查看分支狀況

    $ git branch -a
     * master
       remotes/origin/HEAD -> origin/master
       remotes/origin/master
     這裏只有一個master,所以直接推送master
    複製代碼
  5. 把本地指定分支,推送到集團遠程代碼倉庫

    $ git push origin master:master
    複製代碼

就這樣,代碼就從舊的倉庫地址遷移到新的倉庫地址了

小結

本文主要介紹了常見的git命令,覆蓋到文件操做,本地分支以及遠程分支相關的操做;
感觸最深的就是git log的定製化功能,真的對於提取內容很方便~

謝謝你們~

相關文章
相關標籤/搜索