標(biāo)簽 :github
引言
本文主要講解Git的相關(guān)命令和基本用法夯接,是根據(jù)Git常用命令學(xué)習(xí)手冊(cè)這篇博文進(jìn)行整理的持寄。主要目的是為了以后更好的學(xué)習(xí)Git以及快速查閱相應(yīng)的Git命令做準(zhǔn)備的豫缨。另外本文只是簡(jiǎn)單介紹相關(guān)的Git命令。詳細(xì)命令請(qǐng)查閱《Pro Git》
一、獲取與創(chuàng)建項(xiàng)目
1靠益、Git使用前的配置
為了在命令界面可以方便使用復(fù)制和粘貼(用左鍵選取要復(fù)制的,點(diǎn)右鍵直接就可以復(fù)制残揉,粘貼時(shí)只需點(diǎn)一下右鍵胧后。)設(shè)置方法:Git Bash快捷圖標(biāo)(桌面圖標(biāo))右鍵屬性-選項(xiàng),把快速編輯模式勾上就可以抱环,如下圖:
![Git Bash配置圖](http://www.ihref.com/wp-content/uploads/2014/08/git%E5%BF%AB%E9%80%9F%E7%BC%96%E8%BE%91%E6%A8%A1%E5%BC%8F%E9%85%8D%E7%BD%AE.jpg)
設(shè)置本地默認(rèn)開發(fā)路徑
如果設(shè)置了壳快,就不用每次打開Git再cd打開目錄了。方法:右鍵Git Bash快捷圖標(biāo)(桌面圖標(biāo))屬性镇草,找到快捷方式-起始位置眶痰,把你的項(xiàng)目地址放在這里就可以了。如下圖:
![Git本地默認(rèn)開發(fā)路徑設(shè)置](http://www.ihref.com/wp-content/uploads/2014/08/git%E9%BB%98%E8%AE%A4%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91%E5%BA%93%E8%B7%AF%E5%BE%84%E8%AE%BE%E7%BD%AE.jpg)
配置本地用戶和郵箱
用戶名郵箱作用 : 我們需要設(shè)置一個(gè)用戶名 和 郵箱, 這是用來上傳本地倉(cāng)庫(kù)到GitHub中, 在GitHub中顯示代碼上傳者;
使用命令 :
git config --global user.name "lx198911m10d"
git config --global user.email "branden123@163.com"
到此Git客戶端已安裝及GitHub配置完成陶夜,現(xiàn)在可以從GitHub傳輸代碼了凛驮。
git init 將一個(gè)目錄初始化為Git倉(cāng)庫(kù)
在目錄中執(zhí)行git init
,就可以創(chuàng)建一個(gè)Git倉(cāng)庫(kù)了裆站。代碼實(shí)例如下
$ git init
Initialized empty Git repository in C:\github\resource
#在C:\github\resource目錄初始化空Git倉(cāng)庫(kù)完畢
git clone 復(fù)制一個(gè)Git倉(cāng)庫(kù)
git clone [url]
這條命令主要用來從網(wǎng)上復(fù)制其他人的項(xiàng)目代碼条辟。
example:
$ git clone git://github.com/schacon/simplegit.git
上述操作以后就可以將相應(yīng)的項(xiàng)目的全部記錄保存到本地git倉(cāng)庫(kù)中。同時(shí)拷貝了該項(xiàng)目的主分支宏胯。使你能夠查看代碼羽嫡,或編輯、修改肩袍。進(jìn)到該目錄中杭棵,你會(huì)看到 .git 子目錄。
二氛赐、基本快照
git add 添加文件到緩存
使用git add
添加需要追蹤的新文件和待提交的更改魂爪。使用git add .
和git add *
提交項(xiàng)目目錄中所有的更改到緩存。
使用git status
輸出相對(duì)繁瑣艰管。使用git status -s
查看項(xiàng)目文件的狀態(tài)滓侍。
文件前面的??
表示新文件沒有存到緩存中。A
表示相應(yīng)的文件已經(jīng)在緩存中牲芋。AM
表示相應(yīng)的文件在緩存中但文件改動(dòng)沒有存到緩存中撩笆。
git diff 顯示已寫入緩存與已修改但尚未寫入緩存的改動(dòng)的區(qū)別
git diff
如果沒有其他參數(shù),git diff
會(huì)以規(guī)范化的diff格式顯示自從你上次提交快照之后尚未緩存的所有改動(dòng)缸浦。
git diff --cached
顯示有哪些內(nèi)容已經(jīng)寫入緩存了夕冲。也就是說,此命令顯示的是接下來要寫入快照的內(nèi)容裂逐。
git diff HEAD
查看已緩存的與為緩存的所有改動(dòng)查看工作目錄與上一次提交的更新的區(qū)別歹鱼,無視緩存。
git diff --stat
與git status
相比詳細(xì)一點(diǎn)卜高,與git diff
相比顯示的是更改的摘要并不是全文弥姻。
git commit 記錄緩存內(nèi)容的快照
現(xiàn)在你使用git add
命令將想要快照的內(nèi)容寫入了緩存秩霍, 執(zhí)行git commit
就將它實(shí)際存儲(chǔ)快照了。 Git 為你的每一個(gè)提交都記錄你的名字與電子郵箱地址蚁阳,所以第一步是告訴 Git 這些都是啥铃绒。
在執(zhí)行git commit
命令時(shí),一般直接執(zhí)行git commit -m 'txt'
txt用來提交相關(guān)的注釋螺捐。
命令git commit -a
直接將項(xiàng)目文件中的所有改動(dòng)提交到項(xiàng)目中颠悬,無需執(zhí)行git add
命令,但是如果你在項(xiàng)目中添加了新的文件定血,這時(shí)你仍然需要執(zhí)行git add
命令赔癌,將新文件添加到項(xiàng)目中。
git reset HEAD 取消緩存已緩存的內(nèi)容
簡(jiǎn)而言之澜沟,執(zhí)行 git reset HEAD 以取消之前git add
添加灾票,但不希望包含在下一提交快照中的緩存。
git rm 將文件從緩存區(qū)移除
git rm
會(huì)將條目從緩存區(qū)中移除茫虽。這與git reset HEAD
將條目取消緩存是有區(qū)別的刊苍。 “取消緩存”的意思就是將緩存區(qū)恢復(fù)為我們做出修改之前的樣子。 在另一方面濒析,git rm
則將該文件徹底從緩存區(qū)踢出正什,因此它不再下一個(gè)提交快照之內(nèi),進(jìn)而有效地刪除它号杏。
默認(rèn)情況下婴氮,git rm file
會(huì)將文件從緩存區(qū)和你的硬盤中(工作目錄)刪除。 如果要在工作目錄中留著該文件盾致,可以使用git rm --cached
簡(jiǎn)而言之主经, 執(zhí)行git rm
來刪除 Git 追蹤的文件。它還會(huì)刪除你的工作目錄中的相應(yīng)文件庭惜。
三罩驻、分支與合并
git branch 列出、創(chuàng)建與管理工作上下文 git check 切換到新的分支上下文
-
git branch
列出分支 -
git branch (branchname)
創(chuàng)建新的分支蜈块。 -
git checkout -b (branchname)
創(chuàng)建新分支鉴腻,并立即切換到它。 -
git branch -d (branchname)
刪除分支
git merge 將分支合并到你的當(dāng)前分支
簡(jiǎn)而言之 使用git merge (分支名字)
將另一個(gè)分支并入當(dāng)前的分支中去百揭。 Git 會(huì)自動(dòng)以最佳方式將兩個(gè)不同快照中獨(dú)特的工作合并到一個(gè)新快照中去爽哎。
git log 顯示一個(gè)分支中提交的更改記錄
當(dāng)你使用git commit
命令提交相應(yīng)的緩存內(nèi)容時(shí),提交到快照的信息都將被存儲(chǔ)起來器一。除了文件詳單课锌、提交消息和提交者的信息,Git 還保存了你的此次提交所基于的快照。 也就是渺贤,假如你克隆了一個(gè)項(xiàng)目雏胃,你是在什么快照的基礎(chǔ)上做的修改而得到新保存的快照的疾就? 這有益于為項(xiàng)目進(jìn)程提供上下文俐东,使 Git 能夠弄明白誰(shuí)做了什么改動(dòng)古涧。 如果 Git 有你的快照所基于的快照的話蜜暑,它就能自動(dòng)判斷你都改變了什么。而新提交所基于的提交斧抱,被稱作新提交的“父親”娇豫。
某分支的按時(shí)間排序的“父親”列表耀找,當(dāng)你在該分支時(shí)此洲,可以執(zhí)行git log
以查看厂汗。
git log --oneline
可以查看歷史記錄的緊湊簡(jiǎn)潔版本。
git log --oneline --graph
查看歷史中什么時(shí)候出現(xiàn)了分支呜师、合并娶桦。
git tag給歷史記錄中的某一個(gè)重要的點(diǎn)打上標(biāo)簽,打上永久標(biāo)簽
如果你達(dá)到一個(gè)重要的階段,并希望永遠(yuǎn)記住那個(gè)特別的提交快照汁汗,你可以使用git tag
給它打上標(biāo)簽衷畦。
git log -a v1.0
為當(dāng)前項(xiàng)目版本打上v1.0標(biāo)簽
git log --decorate --graph
查看我們給項(xiàng)目打的標(biāo)簽。
不過我們并不需要給當(dāng)前提交打標(biāo)簽碰酝。如果我們忘了給某個(gè)提交打標(biāo)簽霎匈,又將它發(fā)布了,我們可以給它追加標(biāo)簽送爸。 在相同的命令末尾加上提交的 SHA。(SHA就是git tag --online --decorate --graph
命令每個(gè)項(xiàng)目前面 的數(shù)字字母序列)
四暖释、分享與項(xiàng)目更新
當(dāng)你需要將自己的項(xiàng)目放到一個(gè)能夠與其他開發(fā)者鏈接的服務(wù)器上時(shí)袭厂,需要使用本章的內(nèi)容。
git remote 羅列球匕、添加和刪除遠(yuǎn)端倉(cāng)庫(kù)別名
-
git remote
列出遠(yuǎn)端倉(cāng)庫(kù)別名 -
git remote add [alias] [url]
為你的項(xiàng)目添加一個(gè)新的遠(yuǎn)端倉(cāng)庫(kù)
例如纹磺,假設(shè)我們想要與整個(gè)世界分享我們的 Hello World 程序。 我們可以在一臺(tái)服務(wù)器上創(chuàng)建一個(gè)新倉(cāng)庫(kù)(我以 GitHub 為例子)亮曹。 它應(yīng)該會(huì)給你一個(gè)鏈接橄杨,在這里就是“git@github.com:schacon/hw.git”(github在新項(xiàng)目中有提供)。
-
git remote rm [alias]
刪除現(xiàn)存的某個(gè)別名
git fetch從遠(yuǎn)端倉(cāng)庫(kù)下載新分支與數(shù)據(jù) git pull從遠(yuǎn)端倉(cāng)庫(kù)提取數(shù)據(jù)并嘗試合并到當(dāng)前分支照卦。
Git 有兩個(gè)命令用來從某一遠(yuǎn)端倉(cāng)庫(kù)更新式矫。git fetch
會(huì)使你與另一倉(cāng)庫(kù)同步,提取你本地所沒有的數(shù)據(jù)役耕,為你在同步時(shí)的該遠(yuǎn)端的每一分支提供書簽采转。 這些分支被叫做“遠(yuǎn)端分支”,除了 Git 不允許你檢出(切換到該分支)之外瞬痘,跟本地分支沒區(qū)別 —— 你可以將它們合并到當(dāng)前分支故慈,與其他分支作比較差異板熊,查看那些分支的歷史日志,等等察绷。同步之后你就可以在本地操作這些干签。
第二個(gè)會(huì)從遠(yuǎn)端服務(wù)器提取新數(shù)據(jù)的命令是git pull
。 基本上拆撼,該命令就是在 git fetch 之后緊接著git merge
遠(yuǎn)端分支到你所在的任意分支筒严。 我個(gè)人不太喜歡這命令 —— 我更喜歡fetch 和 merge 分開來做。少點(diǎn)魔法情萤,少點(diǎn)問題鸭蛙。 不過,如果你喜歡這主意筋岛,你可以看一下git pull
的 官方文檔娶视。
假設(shè)你配置好了一個(gè)遠(yuǎn)端,并且你想要提取更新睁宰,你可以首先執(zhí)行 git fetch [alias] 告訴 Git 去獲取它有你沒有的數(shù)據(jù)肪获,然后你可以執(zhí)行 git merge [alias]/[branch] 以將服務(wù)器上的任何更新(假設(shè)有人這時(shí)候推送到服務(wù)器了)合并到你的當(dāng)前分支。 那么柒傻,如果我是與兩三個(gè)其他人合作 Hello World 項(xiàng)目孝赫,并且想要將我最近連接之后的所有改動(dòng)拿過來,我可以這么做:
$ git fetch github
remote: Counting objects: 4006, done.
remote: Compressing objects: 100% (1322/1322), done.
remote: Total 2783 (delta 1526), reused 2587 (delta 1387)
Receiving objects: 100% (2783/2783), 1.23 MiB | 10 KiB/s, done.
Resolving deltas: 100% (1526/1526), completed with 387 local objects.
From github.com:schacon/hw
8e29b09..c7c5a10 master -> github/master
0709fdc..d4ccf73 c-langs -> github/c-langs
6684f82..ae06d2b java -> github/java
* [new branch] ada -> github/ada
* [new branch] lisp -> github/lisp
可以看到自從上一次與遠(yuǎn)端倉(cāng)庫(kù)同步以后红符,又新贈(zèng)或更新了五個(gè)分支青柄。 “ada”與“l(fā)isp”分支是新的,而“master”预侯、“clang”與“Java”分支則被更新了致开。 在此例中,我的團(tuán)隊(duì)在合并入主分支之前萎馅,將提議的更新推送到遠(yuǎn)端分支以審核双戳。
你可以看到 Git 做的映射。遠(yuǎn)端倉(cāng)庫(kù)的主分支成為了本地的一個(gè)叫做“github/master”的分支糜芳。 這樣我就可以執(zhí)行git merge github/master
將遠(yuǎn)端的主分支和并入我的本地主分支飒货。 或者,我可以git log github/master ^master
看看該分支上的新提交峭竣。 如果你的遠(yuǎn)端倉(cāng)庫(kù)叫做“origin”塘辅,那遠(yuǎn)端主分支就會(huì)叫做origin/master。幾乎所有能在本地分支上執(zhí)行的命令都可以在遠(yuǎn)端分支上用邪驮。
如果你有多個(gè)遠(yuǎn)端倉(cāng)庫(kù)莫辨,你可以執(zhí)行git fetch [alias]
提取特定的遠(yuǎn)端倉(cāng)庫(kù), 或者執(zhí)行git fetch --all
告訴 Git 同步所有的遠(yuǎn)端倉(cāng)庫(kù)。
git push 推送你的新分支與數(shù)據(jù)到某個(gè)遠(yuǎn)端倉(cāng)庫(kù)
想要與他人分享你牛鼻的提交沮榜,你需要將改動(dòng)推送到遠(yuǎn)端倉(cāng)庫(kù)盘榨。 執(zhí)行git push [alias] [branch]
,就會(huì)將你的 [branch] 分支推送成為 [alias] 遠(yuǎn)端上的 [branch] 分支蟆融。 讓我們?cè)囋囃扑臀覀兊闹鞣种У较惹疤砑拥摹癵ithub”遠(yuǎn)端倉(cāng)庫(kù)上去草巡。
$ git push github master
Counting objects: 25, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (25/25), done.
Writing objects: 100% (25/25), 2.43 KiB, done.
Total 25 (delta 4), reused 0 (delta 0)
To git@github.com:schacon/hw.git
* [new branch] master -> master
挺簡(jiǎn)單。現(xiàn)在如果有人從該倉(cāng)庫(kù)克隆型酥,他會(huì)得到我提交的完完全全的一份歷史記錄了山憨。
如果有個(gè)像之前創(chuàng)建的“erlang”分支那樣的主題分支,想只分享這個(gè)弥喉,該怎么辦呢郁竟?你可以相應(yīng)的只推送該分支。
$ git push github erlang
Counting objects: 7, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 652 bytes, done.
Total 6 (delta 1), reused 0 (delta 0)
To git@github.com:schacon/hw.git
* [new branch] erlang -> erlang
現(xiàn)在當(dāng)人們從該倉(cāng)庫(kù)克隆時(shí)由境,他們就會(huì)得到一個(gè)“erlang”分支以查閱棚亩、合并。 用這種方式虏杰,你可以推送任何分支到任何你有寫權(quán)限的倉(cāng)庫(kù)讥蟆。 如果你的分支已經(jīng)在該倉(cāng)庫(kù)中了,它會(huì)試著去更新纺阔,如果它不再瘸彤,Git 會(huì)把它加上。
最后一個(gè)當(dāng)你推送到遠(yuǎn)端分支時(shí)會(huì)碰到的主要問題是笛钝,其他人在此期間也推送了的情況质况。 如果你和另一個(gè)開發(fā)者同時(shí)克隆了,又都有提交婆翔,那么當(dāng)她推送后你也想推送時(shí)拯杠,默認(rèn)情況下 Git 不會(huì)讓你覆蓋她的改動(dòng)。 相反的啃奴,它會(huì)在你試圖推送的分支上執(zhí)行git log
,確定它能夠在你的推送分支的歷史記錄中看到服務(wù)器分支的當(dāng)前進(jìn)度雄妥。 如果它在在你的歷史記錄中看不到最蕾,它就會(huì)下結(jié)論說你過時(shí)了,并打回你的推送老厌。 你需要正式提取瘟则、合并,然后再次推送 —— 以確定你把她的改動(dòng)也考慮在內(nèi)了枝秤。
當(dāng)你試圖推送到某個(gè)以被更新的遠(yuǎn)端分支時(shí)醋拧,會(huì)出現(xiàn)下面這種情況:
$ git push github master
To git@github.com:schacon/hw.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:schacon/hw.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again. See the 'Note about
fast-forwards' section of 'git push --help' for details.
你可以修正這個(gè)問題。執(zhí)行 git fetch github; git merge github/master,然后再推送
簡(jiǎn)而言之 執(zhí)行 git push [alias] [branch] 將你的本地改動(dòng)推送到遠(yuǎn)端倉(cāng)庫(kù)丹壕。 如果可以的話庆械,它會(huì)依據(jù)你的 [branch] 的樣子,推送到遠(yuǎn)端的 [branch] 去菌赖。 如果在你上次提取缭乘、合并之后,另有人推送了琉用,Git 服務(wù)器會(huì)拒絕你的推送堕绩,知道你是最新的為止。
五邑时、比較與檢查
git log 過濾你的提交歷史記錄
通過查看分支中另一分支看不到的提交記錄奴紧,我們已經(jīng)看到如何用git log
來比較分支。 (如果你不記得了晶丘,它看起來是這樣的:git log branchA ^branchB
)黍氮。 而且,你也可以用git log
去尋找特定的提交铣口。 在此滤钱,我們會(huì)看到一些更廣為使用的 git log 選項(xiàng),不過哪有很多脑题。 完整的清單可以看看官方文檔件缸。
git log –author 只尋找某個(gè)特定作者的提交
要過濾你的提交歷史,只尋找某個(gè)特定作者的提交叔遂,你可以使用 --author 選項(xiàng)他炊。 例如,比方說我們要找 Git 源碼中 Linus 提交的部分已艰。 我們可以執(zhí)行類似 git log --author=Linus 的命令痊末。 這個(gè)查找是大小寫敏感的,并且也會(huì)檢索電子郵箱地址哩掺。 我在此例中使用 -[number] 選項(xiàng)凿叠,以限制結(jié)果為最近 [number] 次的提交。
$ git log --author=Linus --oneline -5
81b50f3 Move 'builtin-*' into a 'builtin/' subdirectory
3bb7256 make "index-pack" a built-in
377d027 make "git pack-redundant" a built-in
b532581 make "git unpack-file" a built-in
112dd51 make "mktag" a built-in
git log –since –before 根據(jù)日期過濾提交記錄
如果你要指定一個(gè)你感興趣的日期范圍以過濾你的提交嚼吞,可以執(zhí)行幾個(gè)選項(xiàng) —— 我用 --since
和 --before
盒件,但是你也可以用 --until
和--after
。 例如舱禽,如果我要看 Git 項(xiàng)目中三周前且在四月十八日之后的所有提交炒刁,我可以執(zhí)行這個(gè)(我還用了 --no-merges 選項(xiàng)以隱藏合并提交):
$ git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges
5469e2d Git 1.7.1-rc2
d43427d Documentation/remote-helpers: Fix typos and improve language
272a36b Fixup: Second argument may be any arbitrary string
b6c8d2d Documentation/remote-helpers: Add invocation section
5ce4f4e Documentation/urls: Rewrite to accomodate transport::address
00b84e9 Documentation/remote-helpers: Rewrite description
03aa87e Documentation: Describe other situations where -z affects git diff
77bc694 rebase-interactive: silence warning when no commits rewritten
636db2c t3301: add tests to use --format="%N"
git log –grep
根據(jù)提交注釋過濾提交記錄
你或許還想根據(jù)提交注釋中的某個(gè)特定短語(yǔ)查找提交記錄√苤桑可以用 --grep
選項(xiàng)翔始。 比如說我知道有個(gè)提交是有關(guān)使用 P4EDITOR 環(huán)境變量罗心,又想回憶起那個(gè)改動(dòng)是啥樣子的 —— 我可以用--grep
選項(xiàng)找到該提交。
$ git log --grep=P4EDITOR --no-merges
commit 82cea9ffb1c4677155e3e2996d76542502611370
Author: Shawn Bohrer
Date: Wed Mar 12 19:03:24 2008 -0500
git-p4: Use P4EDITOR environment variable when set
Perforce allows you to set the P4EDITOR environment variable to your
preferred editor for use in perforce. Since we are displaying a
perforce changelog to the user we should use it when it is defined.
Signed-off-by: Shawn Bohrer <shawn.bohrer@gmail.com>
Signed-off-by: Simon Hausmann <simon@lst.de>
Git 會(huì)對(duì)所有的 --grep
和 --author
參數(shù)作邏輯或城瞎。 如果你用 --grep
和 --author
時(shí)渤闷,想看的是某人寫作的并且有某個(gè)特殊的注釋內(nèi)容的提交記錄, 你需要加上 --all-match
選項(xiàng)全谤。 在這些例子中肤晓,我會(huì)用上 --format
選項(xiàng),這樣我們就可以看到每個(gè)提交的作者是誰(shuí)了认然。
如果我查找注釋內(nèi)容含有 “p4 depo”的提交补憾,我得到了三個(gè)提交:
$ git log --grep="p4 depo" --format="%h %an %s"
ee4fd1a Junio C Hamano Merge branch 'master' of git://repo.or.cz/git/fastimport
da4a660 Benjamin Sergeant git-p4 fails when cloning a p4 depo.
1cd5738 Simon Hausmann Make incremental imports easier to use by storing the p4 d
如果我加上 --author=Hausmann
參數(shù),與進(jìn)一步過濾上述結(jié)果到 Simon 的唯一提交相反卷员, 它會(huì)告訴我所有 Simon 的提交盈匾,或者注釋中有“p4 demo”的提交:
$ git log --grep="p4 depo" --format="%h %an %s" --author="Hausmann"
cdc7e38 Simon Hausmann Make it possible to abort the submission of a change to Pe
f5f7e4a Simon Hausmann Clean up the git-p4 documentation
30b5940 Simon Hausmann git-p4: Fix import of changesets with file deletions
4c750c0 Simon Hausmann git-p4: git-p4 submit cleanups.
0e36f2d Simon Hausmann git-p4: Removed git-p4 submit --direct.
edae1e2 Simon Hausmann git-p4: Clean up git-p4 submit's log message handling.
4b61b5c Simon Hausmann git-p4: Remove --log-substitutions feature.
36ee4ee Simon Hausmann git-p4: Ensure the working directory and the index are cle
e96e400 Simon Hausmann git-p4: Fix submit user-interface.
38f9f5e Simon Hausmann git-p4: Fix direct import from perforce after fetching cha
2094714 Simon Hausmann git-p4: When skipping a patch as part of "git-p4 submit" m
1ca3d71 Simon Hausmann git-p4: Added support for automatically importing newly ap
...
不過,如果加上 --all-match
毕骡,結(jié)果就是我想要的了:
$ git log --grep="p4 depo" --format="%h %an %s" --author="Hausmann" --all-match
1cd5738 Simon Hausmann Make incremental imports easier to use by storing the p4 d
git log -S
依據(jù)所引入的差值過濾
如果你寫的提交注釋都極度糟糕怎么辦削饵?或者,如果你要找某個(gè)函數(shù)是何時(shí)引入的未巫,某些變量是在哪里開始被使用的窿撬? 你可以告訴 Git 在每個(gè)提交之間的差值中查找特定字符串。 例如叙凡,如果我們想要找出哪個(gè)提交修改出了類似函數(shù)名“userformat_find_requirements”劈伴, 我們可以執(zhí)行(注意在“-S”與你要找的東東之間沒有“=”):
$ git log -Suserformat_find_requirements
commit 5b16360330822527eac1fa84131d185ff784c9fb
Author: Johannes Gilger
Date: Tue Apr 13 22:31:12 2010 +0200
pretty: Initialize notes if %N is used
When using git log --pretty='%N' without an explicit --show-notes, git
would segfault. This patches fixes this behaviour by loading the needed
notes datastructures if --pretty is used and the format contains %N.
When --pretty='%N' is used together with --no-notes, %N won't be
expanded.
This is an extension to a proposed patch by Jeff King.
Signed-off-by: Johannes Gilger
Signed-off-by: Junio C Hamano
git log -p
顯示每個(gè)提交引入的補(bǔ)丁
每個(gè)提交都是項(xiàng)目的一個(gè)快照。由于每個(gè)提交都記錄它所基于的快照握爷,Git 能夠經(jīng)常對(duì)它們求差值跛璧,并以補(bǔ)丁形式向你展示。 這意味著新啼,對(duì)任意提交追城,你都可以獲取該提交給項(xiàng)目引入補(bǔ)丁。 你可以用 git show [SHA]
加上某個(gè)特定的提交 SHA 獲取燥撞,或者執(zhí)行git log -p
座柱, 它會(huì)告訴 Git 輸出每個(gè)提交之后的補(bǔ)丁。這是個(gè)總結(jié)某一分支或者兩個(gè)提交之間都發(fā)生了神馬的好途徑物舒。
$ git log -p --no-merges -2
commit 594f90bdee4faf063ad07a4a6f503fdead3ef606
Author: Scott Chacon <schacon@gmail.com>
Date: Fri Jun 4 15:46:55 2010 +0200
reverted to old class name
diff --git a/ruby.rb b/ruby.rb
index bb86f00..192151c 100644
--- a/ruby.rb
+++ b/ruby.rb
@@ -1,7 +1,7 @@
-class HiWorld
+class HelloWorld
def self.hello
puts "Hello World from Ruby"
end
end
-HiWorld.hello
+HelloWorld.hello
commit 3cbb6aae5c0cbd711c098e113ae436801371c95e
Author: Scott Chacon <schacon@gmail.com>
Date: Fri Jun 4 12:58:53 2010 +0200
fixed readme title differently
diff --git a/README b/README
index d053cc8..9103e27 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-Hello World Examples
+Many Hello World Examples
======================
This project has examples of hello world in
這是個(gè)總結(jié)改動(dòng)辆布,以及合并或發(fā)布之前重審一系列提交的好方式。
git log –stat 顯示每個(gè)提交引入的改動(dòng)的差值統(tǒng)計(jì)
如果 -p 選項(xiàng)對(duì)你來說太詳細(xì)了茶鉴,你可以用 --stat 總結(jié)這些改動(dòng)。 這是不用 -p景用,而用 --stat 選項(xiàng)時(shí)涵叮,同一份日志的輸出惭蹂。
$ git log --stat --no-merges -2
commit 594f90bdee4faf063ad07a4a6f503fdead3ef606
Author: Scott Chacon <schacon@gmail.com>
Date: Fri Jun 4 15:46:55 2010 +0200
reverted to old class name
ruby.rb | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
commit 3cbb6aae5c0cbd711c098e113ae436801371c95e
Author: Scott Chacon <schacon@gmail.com>
Date: Fri Jun 4 12:58:53 2010 +0200
fixed readme title differently
README | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
同樣的基本信息,但更緊湊 —— 它仍然讓你看到相對(duì)改動(dòng)割粮,和改動(dòng)了哪些文件盾碗。
git diff
最后,要查看兩個(gè)提交快照的絕對(duì)改動(dòng)舀瓢,你可以用 git diff 命令廷雅。 這在兩個(gè)主要情況中廣為使用 —— 查看兩個(gè)分支彼此之間的差值,和查看自發(fā)布或者某個(gè)舊歷史點(diǎn)之后都有啥變了京髓。讓我們看看這倆情況航缀。
你僅需執(zhí)行 git diff [version](或者你給該發(fā)布打的任何標(biāo)簽)就可以查看自最近發(fā)布之后的改動(dòng)。 例如堰怨,如果我們想要看看自 v0.9 發(fā)布之后我們的項(xiàng)目改變了啥芥玉,我們可以執(zhí)行git diff v0.9
$ git diff v0.9
diff --git a/README b/README
index d053cc8..d4173d5 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-Hello World Examples
+Many Hello World Lang Examples
======================
This project has examples of hello world in
diff --git a/ruby.rb b/ruby.rb
index bb86f00..192151c 100644
--- a/ruby.rb
+++ b/ruby.rb
@@ -1,7 +1,7 @@
-class HiWorld
+class HelloWorld
def self.hello
puts "Hello World from Ruby"
end
end
-HiWorld.hello
+HelloWorld.hello
正如 git log
,你可以給它加上 --stat
參數(shù)备图。
$ git diff v0.9 --stat
README | 2 +-
ruby.rb | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
要比較兩個(gè)不同的分支灿巧,你可以執(zhí)行類似 git diff branchA branchB 的命令。 不過它的問題在于它會(huì)完完全全按你說的作 —— 它會(huì)直接給你個(gè)補(bǔ)丁文件揽涮,該補(bǔ)丁能夠?qū)⒓追种У淖钚驴煺兆兂梢曳种У淖钚驴煺盏臉幼印?這意味著如果兩個(gè)分支已經(jīng)產(chǎn)生分歧 —— 奔往兩個(gè)不同方向了 —— 它會(huì)移除甲分支中引入的所有工作抠藕,然后累加乙分支中的所有工作。 這大概不是你要的吧 —— 你想要不在甲分支中的乙分支的改動(dòng)蒋困。所以你真的需要的是兩個(gè)分支叉開去時(shí)盾似,和最新的乙分支的差別。 所以家破,如果我們的歷史記錄看起來像這樣:
$ git log --graph --oneline --decorate --all
* 594f90b (HEAD, tag: v1.0, master) reverted to old class name
| * 1834130 (erlang) added haskell
| * ab5ab4c added erlang
|/
* 8d585ea Merge branch 'fix_readme'
...
并且颜说,我們想要看“erlang”分支與主分支相比的查別。執(zhí)行 git diff master erlang
會(huì)給我們錯(cuò)誤的結(jié)果汰聋。
$ git diff --stat master erlang
erlang_hw.erl | 5 +++++
haskell.hs | 4 ++++
ruby.rb | 4 ++--
3 files changed, 11 insertions(+), 2 deletions(-)
你可以看到门粪,它加上了 erlang 和 haskell 文件,這確實(shí)是我們?cè)谠摲种е凶龅模?但是它同時(shí)恢復(fù)了我們?cè)谥鞣种е懈膭?dòng)的 ruby 文件烹困。我們真心想要的只是“erlang”分支中的改動(dòng)(添加兩個(gè)文件)玄妈。 我們可以通過求兩個(gè)分支分歧時(shí)的共同提交與該分支的差值得到想要的結(jié)果:
$ git diff --stat 8d585ea erlang
erlang_hw.erl | 5 +++++
haskell.hs | 4 ++++
2 files changed, 9 insertions(+), 0 deletions(-)
這才是我們?cè)谡业模俏覀兛刹幌胍看味家页鰞蓚€(gè)分支分歧時(shí)的那次提交髓梅。 幸運(yùn)的是拟蜻,Git 為此提供了一個(gè)快捷方式。 如果你執(zhí)行 git diff master...erlang(在分支名之間有三個(gè)半角的點(diǎn))枯饿, Git 就會(huì)自動(dòng)找出兩個(gè)分支的共同提交(也被成為合并基礎(chǔ))酝锅,并求差值。
$ git diff --stat master erlang
erlang_hw.erl | 5 +++++
haskell.hs | 4 ++++
ruby.rb | 4 ++--
3 files changed, 11 insertions(+), 2 deletions(-)
$ git diff --stat master...erlang
erlang_hw.erl | 5 +++++
haskell.hs | 4 ++++
2 files changed, 9 insertions(+), 0 deletions(-)
幾乎每一次你要對(duì)比兩個(gè)分支的時(shí)候奢方,你都會(huì)想用三個(gè)點(diǎn)的語(yǔ)法搔扁,因?yàn)樗ǔ?huì)給你你想要的爸舒。
順帶提一句,你還可以讓 Git 手工計(jì)算兩次提交的合并基礎(chǔ)(第一個(gè)共同的祖提交)稿蹲,即git merge-base
命令:
$ git merge-base master erlang
8d585ea6faf99facd39b55d6f6a3b3f481ad0d3d
所以你執(zhí)行下面這個(gè)也跟 git diff master...erlang 一樣:
$ git diff --stat $(git merge-base master erlang) erlang
erlang_hw.erl | 5 +++++
haskell.hs | 4 ++++
2 files changed, 9 insertions(+), 0 deletions(-)
當(dāng)然扭勉,我會(huì)推薦簡(jiǎn)單點(diǎn)的那個(gè)。
簡(jiǎn)而言之 使用 git diff 查看某一分支自它偏離出來起與過去某一點(diǎn)之間項(xiàng)目的改動(dòng)苛聘。 總是使用 git diff branchA...branchB 來查看 branchB 與 branchA 的相對(duì)差值涂炎,這會(huì)讓事情簡(jiǎn)單點(diǎn)。