git 詳細教程和經常使用操做指令

git 內部工做原理圖

  

  如上圖,git 通常能夠分爲三個區;工做區、暫存區、版本庫,一般相似 git add等命令都是與index 暫存區的交互,git commit指令則是 index 與版本庫的交互;將index區的內容 提交到版本庫中;javascript

 

1. mac使用git時經常使用的指令java

 

ls -l -a   列出指定目錄下文件
           -l 顯示文件的詳細信息
           -a 顯示目錄下全部文件(包括隱藏文件)
           -d 顯示指定目錄pwd  顯示當前的工做目錄的路徑

mkdir:建立新目錄

pwd: 查看當前的路徑

cat ss.txt :查看指定文本文件ss的內容(適合查看小文件)

echo:輸出字符串或變量值 列:echo "test">> ss.txt 

>   指定的文件若不存在,建立文件;若存在,覆蓋原文件內容
輸出重定向符
>> 指定的文件若不存在,建立文件;若存在,在原文件內容後追加內容 rm –rf * 強制刪除當前目錄下全部文件 rm -rf 刪除文件或目錄 stat 文件名 查看文件詳細信息 find 查找文件

git 經常使用指令使用

 

1.git 基礎指令git

  git init: git初始化生成 .git文件生成git倉庫,Git自動爲咱們建立了惟一一個master分支,因此,如今,git commit就是往master分支上提交更改。vim

 git add 【file】:  添加文件到index 緩衝區;(git add添加到緩衝區後,在修改了文件,此時commit不會把修改的內容添加到倉庫中,PS:每一次修改都必須從新添加到緩衝區以後commit纔會生效)每次修改都必須add,而後才能commit;

     git add -A   // 添加全部改動windows

     git add *     // 添加新建文件和修改,可是不包括刪除緩存

   git add .    // 添加新建文件和修改,可是不包括刪除    git add -u   // 添加修改和刪除,可是不包括新建文件

   git commit -m "提交信息": 提交緩衝區到git倉庫中; 注意這裏僅僅是暫存區的內容

git status:查看git當前的狀態(好比是否存在未添加和未提交的文件)

    git status -s:簡化查看狀態 (M:紅色表明本地修改, M:綠色已經提交到暫存區); 服務器

 

2.git log查看和操做記錄查看app

 

  git log: 查看全部的git上傳過的版本;工具

 git log --pretty=oneline:查看全部的git上傳過的版本 簡化輸出的信息;
 git reflog: 查詢記錄git的每一次操做命令;

3.git 版本表示(如下指的均是版本庫中的內容)spa

 

  HEAD:當前版本;

  HEAD^:上一個版本;

  HEAD^^:上兩個版本;

  HEAD~100:前100個版本;

 

4.git 文件比較

 

git diff:查看當前的工做區全部文件與index暫存區中差異;

git diff 【file】:查看具體文件與index暫存區中的差異;
git diff HEAD: 比較與版本庫中的差異;
git diff HEAD -- 【file】:比較工做區和版本庫中具體文件的差異;

5.git 文件刪除

 

git rm [file] :同時刪除工做區和暫存區的文件;若是須要刪除版本庫中的內容,還需git add . 添加 commit提交後纔會生效

誤刪除後的還原操做:

  1.還未執行git commit提交到HEAD的時候刪除文件,這時候直接使用git checkout HEAD [file]就能還原。(從版本庫中拉取,覆蓋)

  2.執行git commit提交到HAED後時候刪除文件,這時候就只能執行git reset --hard HEAD^回退上一個版本。(版本回退)

  

6.git 撤銷/回滾 操做

 

git checkout –- [file]   若是還未添加到暫存區,那麼可使用此命令 將暫存區的內容覆蓋工做區的內容;此處必須制定文件名才行,不然不會生效!
git checkout HEAD [file] 與git reset --hard HEAD 同樣,將版本庫HEAD中的內容 同時替換暫存區和工做區的內容;
git reset HEAD 將版本庫中的內容替換暫存區的內容,注意此時工做區不變;

git reset --hard HEAD ,添加--hard 則暫存區和工做區內容都同時改變;

git reset --hard commitId(提交版本哈希值);回退到commitId具體的版本中,同時覆蓋暫存區和工做區;

git revert HEAD 使用revert撤銷上一次版本庫中的內容;主要revert HEAD撤銷的本質時 使用HEAD的代碼庫中的內容覆蓋當前的修改的內容;而後作了一個新的commit提交;此時,舊版本commit歷史記錄仍是存在的;只是多了一個新的提交;

 

7.git 分支合併

 

1.建立分支和切換分支

  git checkout -b dev 咱們建立dev分支,而後切換到dev分支:  dev爲分支的名字

  等同於下面:

  git branch dev  //建立dev分支

  git checkout dev  //切換到dev分支中

2.查看全部的分支狀況

  git  branch (* 表示當前指針 指向了哪個分支中!)

3.合併分支
3.1 首先切換主幹分支 git checkout master 3.2 從分支dev中合併到主幹master上 git merge dev
4.刪除分支 git branch -d [分支名] 5.--no-ff 模式和 Fast forward模式 5.1 --no-ff 模式
git merge --no-ff -m "merge with no-ff" dev
由於本次合併要建立一個新的commit,因此加上-m參數,把commit描述寫進去。 包括了提交;命令; 5.2 Fast forward模式 快速模式(不添加參數狀況)    Git告訴咱們,此次合併是「快進模式」,也就是直接把master指向dev的當前提交,因此合併速度很是快。

 

   PS:  --no-ff模式和 Fast forward模式的區別

 

  1. --no-ff 模式 

     

 

     2.Fast forward模式

       

     3.主要區別:

  --no-ff參數就能夠用普通模式合併,合併後的歷史有分支,能看出來曾經作過合併,而fast forward合併就看不出來曾經作過合併。

 

 6.分支策略

  在實際開發中,咱們應該按照幾個基本原則進行分支管理:首先,master分支應該是很是穩定的,也就是僅用來發布新版本,平時不能在上面幹活;

  那在哪幹活呢?幹活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,好比1.0版本發佈時,再把dev分支合併到master上,在master分支發佈1.0版本;

  你和你的小夥伴們每一個人都在dev分支上幹活,每一個人都有本身的分支,時不時地往dev分支上合併就能夠了。

                 

8.git stash 用法

 

git stash: 備份當前的工做區的內容,從最近的一次提交中讀取相關內容,讓工做區保證和上次提交的內容一致。同時,將當前的工做區內容保存到Git棧中。
git stash pop: 從Git棧中讀取最近一次保存的內容,恢復工做區的相關內容。因爲可能存在多個Stash的內容,因此用棧來管理,pop會從最近的一個stash中讀取內容並恢復。
git stash list: 顯示Git棧內的全部備份,能夠利用這個列表來決定從那個地方恢復。
git stash clear: 清空Git棧。此時使用gitg等圖形化工具會發現,原來stash的哪些節點都消失了。

使用場景:

  使用git的時候,咱們每每使用branch解決任務切換問題,例如,咱們每每會建一個本身的分支去修改和調試代碼, 若是別人或者本身發現原有的分支上有個不得不修改的bug,咱們每每會把完成一半的代碼 commit提交到本地倉庫,而後切換分支去修改bug,改好以後再切換回來。這樣的話每每log上會有大量沒必要要的記錄。其實若是咱們不想提交完成一半或者不完善的代碼,可是卻不得不去修改一個緊急Bug,那麼使用'git stash'就能夠將你當前未提交到本地(和服務器)的代碼推入到Git的棧中,這時候你的工做區間和上一次提交的內容是徹底同樣的,因此你能夠放心的修 Bug,等到修完Bug,提交到服務器上後,再使用'git stash apply'將之前一半的工做應用回來。也許有的人會說,那我可不能夠屢次將未提交的代碼壓入到棧中?答案是能夠的。當你屢次使用'git stash'命令後,你的棧裏將充滿了未提交的代碼,這時候你會對將哪一個版本應用回來有些困惑,'git stash list'命令能夠將當前的Git棧信息打印出來,你只須要將找到對應的版本號,例如使用'git stash apply stash@{1}'就能夠將你指定版本號爲stash@{1}的工做取出來,當你將全部的棧都應用回來的時候,可使用'git stash clear'來將棧清空。 在這裏順便提下git format-patch -n , n是具體某個數字, 例如 'git format-patch -1' 這時便會根據log生成一個對應的補丁,若是 'git format-patch -2' 那麼便會生成2個補丁,固然前提是你的log上有至少有兩個記錄。

 

git stash apply 和 git stash pop的區別 

  it stash 命令能夠將在當前分支修改的內容放到緩存區中,並會自動創建一個緩存的list集合,方便管理。

若是想將修改的內容從新釋放出來,git stash apply 和 git stash pop 均可以達到這個目的。 
可是二者有什麼區別呢。
剛纔說過,git stash 能夠造成list 集合。經過git stash list 能夠看到list下的suoy

使用git stash apply @{x} ,能夠將編號x的緩存釋放出來,可是該緩存還存在於list中
而 git stash apply,會將當前分支的最後一次緩存的內容釋放出來,可是剛纔的記錄還存在list中
而 git stash pop,也會將當前分支的最後一次緩存的內容釋放出來,可是剛纔的記錄不存在list中

git stash 問題總結 

  1.若是在當前相同的分支上;在git stash後,若是當期的分支添加了新的內容而且與git stash時的版本產生了衝突時,(好比修改了同一處位置)
此時直接使用git stash pop時,並不會直接把本來保存的內容直接複製下來,而是會把更新的內容以後產生的衝突也會顯示出來;

 

9.Git Patch功能

 

  UNIX世界的軟件開發大多都是協做式的,所以,Patch(補丁)是一個至關重要的東西,由於幾乎全部的大型UNIX項目的普通貢獻者,都是經過 Patch來提交代碼的。做爲最重要的開源項目之一,Linux,也是這樣的。普通開發者從軟件倉庫clone下代碼,而後寫入代碼,作一個Patch, 最後用E-mail發給Linux Kernel的維護者就行了。Git最初做爲Linux的版本控制工具,提供了透明、完整、穩定的Patch功能。

咱們先介紹一下Patch是什麼。若是一個軟件有了新版本,咱們能夠完整地下載新版本的代碼進行編譯安裝。然而,像Linux Kernel這樣的大型項目,代碼即便壓縮,也超過70MB,每次全新下載是有至關大的代價的。然而,每次更新變更的代碼可能不超過1MB,所以,咱們只 要可以有兩個版本代碼的diff的數據,應該就能夠以極低的代價更新程序了。所以,Larry Wall開發了一個工具:patch。它能夠根據一個diff文件進行版本更新。

不過在git中,咱們沒有必要直接使用diff和patch來作補丁,這樣作既危險又麻煩。git提供了兩種簡單的patch方案。一是用git diff生成的標準patch,二是git format-patch生成的Git專用Patch。

 

1.git diff生成的標準patch

 

       1.1 patch 生成;在更改文件之後,與master比較在當前的分支上生成patch

   git diff master > patch

 

  

 

   1.2 patch 應用;將生成的patch發送給別人,或者主幹master上;

    git apply patch  

 

2.git format-patch生成的git專用補丁。

  1.與主幹master比較生成多個最近commit提交版本更改的patch

     git format-patch -M master

      以下圖:生成最近更改的多個.patch文件

 

       

     

  2. patch文件的應用

  git am 0001-rm-patch.patch 應用某一個patch文件;

 

3.兩種patch的比較:

  • 兼容性:很明顯,git diff生成的Patch兼容性強。若是你在修改的代碼的官方版本庫不是Git管理的版本庫,那麼你必須使用git diff生成的patch才能讓你的代碼被項目的維護人接受。
  • 除錯功能:對於git diff生成的patch,你能夠用git apply --check 查看補丁是否可以乾淨順利地應用到當前分支中;若是git format-patch 生成的補丁不能打到當前分支,git am會給出提示,並協助你完成打補丁工做,你也可使用git am -3進行三方合併,詳細的作法能夠參考git手冊或者《Progit》。從這一點上看,二者除錯功能都很強。
  • 版本庫信息:因爲git format-patch生成的補丁中含有這個補丁開發者的名字,所以在應用補丁時,這個名字會被記錄進版本庫,顯然,這樣作是恰當的。所以,目前使用Git的開源社區每每建議你們使用format-patch生成補丁。 

 

10. Git .gitignore文件的用法

 10.1  建立.gitignore 文件

      windows:

            建立一個文件,文件名爲:「.gitignore.」,注意先後都有一個點。保存以後系統會自動重命名爲「.gitignore」。

    mac:

            vim .gitignore 直接使用mac的終端命令便可;

    注意 .gitignore是系統的隱藏文件 和 .git文件夾是同樣的,看不到;在mac 中使用defaults write com.apple.finder AppleShowAllFiles -bool true 查看隱藏文件

  10.2 編輯.gitignore 文件 在mac中以下:

  

  編輯完成後,使用 git status,查看狀態看看是否對於新增長的文件已經忽略;注意,對於已經加入版本庫中的文件,此時在加入到.gitignore文件中無效的;只有剛加入,未添加進版本庫中的文件 纔會生效;

 

  10.3 對於.gitignore 文件配置使用詳解(轉)

  .gitignore文件過濾有兩種模式,開放模式和保守模式

  10.3.1  開放模式負責設置過濾哪些文件和文件夾

eg:

過濾文件夾設置:

/mtk/

過濾文件設置

指定過濾某種類型的文件:

*.zip
*.rar
*.via
*.tmp
*.err

指定過濾某個文件:

/mtk/do.c

/mtk/if.h

2.2 b保守模式負責設置哪些文件不被過濾,也就是哪些文件要被跟蹤。

跟蹤某個文件夾

!/plutommi/mmi

跟蹤某類文件

!*.c

!*.h

跟蹤某個指定文件

!/plutommi/mmi/mmi_features.h

3.配置.gitignore 的簡易原則

採用共享模式與保守模式結合配置的辦法。eg:一個文件夾下有不少文件夾和文件,而我只想跟蹤其中的一個文件,這樣設置就能夠知足這種狀況,先用共享模式把整個目錄 都設置爲不跟蹤,而後再用保守模式把這個文件夾中想要跟蹤的文件設置爲被跟蹤,配置很簡單,就能夠跟蹤想要跟蹤的文件。

相關文章
相關標籤/搜索