如上圖,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 查找文件
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 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:一個文件夾下有不少文件夾和文件,而我只想跟蹤其中的一個文件,這樣設置就能夠知足這種狀況,先用共享模式把整個目錄 都設置爲不跟蹤,而後再用保守模式把這個文件夾中想要跟蹤的文件設置爲被跟蹤,配置很簡單,就能夠跟蹤想要跟蹤的文件。