原文鏈接:http://blog.jobbole.com/75348/
最近,我們發表了關於Git基礎知識和在團隊中使用Git的教程。我們之前討論的那些命令,已經足夠讓幫助一個開發者在Git世界裏生存了。本篇文章,我們將嘗試探索如何更有效的管理您的時間以及如何充分使用Git提供的各種功能。
注意:本文中,一些命令包含含有方括號的部分(e.g.git add -p [file_name]
).在這些例子中,您要在該處插入所需的數字,標示符等。而不需要保留方括號。
1.Git自動補全
如果你在命令行中使用Git命令,每次手動輸入命令是一件非常煩人的。爲了解決這個問題,你可以很方便的開啓自動補全功能。
在Unix系統下,運行以下指令來獲取腳本:
1
2
|
cd
~ curl
https: //raw .github.com /git/git/master/contrib/completion/git-completion . bash
-o ~/.git-completion. bash |
然後,在您的~/.bash_profile
文件中添加以下代碼:
1
2
3
|
if
[ -f ~/.git-completion. bash
]; then .
~/.git-completion. bash fi |
儘管我之前就提到過,在這裏我仍要不厭其煩的說:如果你想使用Git提供的全部功能,你肯定是需要轉而使用命令行來操作的。
2.在Git中忽略文件
你是否對出現在你Git倉庫中的已編譯文件(比如.pyc
)感到厭煩?
亦或是你已經對把它們加入Git中這件事感到忍無可忍了?
眼下就有一個可以讓Git忽略特定文件或是目錄的方法。只需要簡單的創建一個.gitignore
文件,然後列出你不想讓Git跟蹤的文件和目錄即可。你可以使用感嘆號(!)來指出例外的情況。
1
2
3
4
5
|
*.pyc *.exe my_db_config/ !main.pyc |
3.誰動了我的代碼?
出了問題後去責怪別人,是人類的天性。如果你的成品服務器出了問題,你可以非常輕鬆的把壞人揪出來——只需要使用git blame
命令。
這個命令會顯示文件中每一行的作者,最後一次改動後進行的提交(commit)以及該次提交的時間戳。。
1
|
git
blame [file_name] |
下圖中,你可以看到在一個大型倉庫中使用該命令是什麼樣子的。
4.回顧倉庫歷史
在之前的教程中,我們瞭解了git log
命令的用法,然而,它還有三個選項,你應該瞭解。
--oneline
——把每次提交間顯示的信息壓縮成縮減的hash值和提交信息,在一行顯示。--graph
——該選項會在輸出界面的左手邊用一種基於文本的圖形表示法來顯示歷史。
如果你只是瀏覽一個單獨分支的歷史,那麼這個功能是沒有用的。--all
——顯示全部分支的歷史
這裏是以上命令綜合使用的效果。
5.絕不丟失一個提交信息
比方說,你提交了一個你不想要提交的代碼,最後你通過使用硬重置(hard reset)使其回到了之前的狀態。稍後,你意識到,在這個過程中你丟失了一些其他的信息,並想要退回或是至少能看一眼。git reflog
命令可以幫你做到這一點。
一個簡單的git log
命令,顯示你最近的提交信息,以及上一次,再上一次的提交信息,以此類推。
而git reflog
顯示的是所有head移動的信息。記住,它是在本地的,而不是你倉庫的一部分,不會包含在推送(push)和合並中(merge)。
如果我使用git log
,我得到的提交信息是我的倉庫的一部分。
然而git reflog
顯示了一個提交信息(b1b0ee9
– HEAD@{4}
),這是我使用硬重置(hard
reset)時丟失的那個。
6.暫存一個文件的部分改動
通常來講,創建一個基於特性的提交是一個良好的做法,就是說,每次提交都必須代表一個新特性的產生或者是一個bug的修復。考慮一下,如果你修復了兩個bug,或是添加了多個新特性但是卻沒有提交這些變化會怎樣呢?在這種情況下,你可以把這些變化放在一次提交中。但是還有一個更好的方法:把文件分別暫存(Stage)然後分別提交。
比如說,你對一個文件進行了多次修改並且想把他們分別提交。這種情況下,你可以在添加命令(add
)中加上-p
選項
1
|
git
add -p [file_name] |
讓我們演示一下。我在file_name
文件中添加了3行文字,而且我只想提交第一行和第三行。我們先看一下git
diff
顯示的結果。
然後,我們看一下,在添加命令(add)中加上-p
選項後會發生什麼。
看上去,Git假定所有的改變都是針對同一件事情的,因此它把這些都放在了一個塊裏。你有如下幾個選項:
- 輸入
y
來緩存該塊 - 輸入
n
不緩存該塊 - 輸入
e
來人工編輯該塊 - 輸入
d
來退出或進入下一個文件 - 輸入
s
來分割這個塊
對我們而言,我們肯定希望把它分成幾個部分,有選擇的添加一部分而忽略其他的。
正如你所看到的,我們添加了第一行和第三行而忽略了第二行。你可以在之後查看倉庫狀態並進行提交。
7.合併多次提交
當你提交你的代碼進行審覈並創建一個pull request時(在開源項目中常常發生這樣的情況),你經常會在代碼被採納前,要求修改一些代碼。你進行了一些修改,而在下一次審覈中,又會被要求進行另外的修改。你不知道還有多少次修改等着你,在你知道以前,你進行了多次額外的提交。理想的狀態是,你可以使用rebase
命令,把他們都合併成一次提交。
1
|
git
rebase -i HEAD~[number_of_commits] |
如果你希望合併最後兩次提交,您需要以下命令
1
|
git
rebase -i HEAD~2 |
使用該命令,你會進入一個交互式的界面,顯示了最後兩次提交,並且詢問你要壓縮哪些。理想狀態是你pick
最近的一次提交併把它和之前的提交squash
。
接下來你會被要求爲合併後的這次提交填寫描述信息。這一個過程實際上重寫了你的提交歷史。
8.保存尚未提交的改動
比方說你正在解決一個bug或是添加某個新功能,這時你突然被要求展示你的工作。你當前的工作還沒有完成到進行提交的地步,而且你在這個階段也沒辦法展示你的工作(如果不回退所有變化的話)。在這種情況下,git stash
可以拯救你。stash命令本質上是保存了你全部的改動以供將來使用。保存你的改動,你只需要運行如下命令:
1
|
git
stash |
查看暫存列表,你可以運行如下命令:
1
|
git
stash list |
如果你不想保存了或是想要恢復這些改動,你使用如下命令:
1
|
git
stash apply |
在最後一張截圖中,你可以看到,每一次保存都有一個標示符,一個獨一無二的數字(儘管我們此處只有一次保存),萬一你只想使用某些保存,你需要在apply
命令後指明標示符。
1
|
git
stash apply stash@{2} |
9.檢查丟失的提交
儘管reflog
是一種查看丟失提交的方法,但是它在大型倉庫中行不通。這時就該fsck
(file system check)出場了。
1
|
git
fsck
--lost-found |
這裏你可以看到丟失的提交,你可以使用git show [commit_hash]
來查看這些提交所包含的改動或者是使用git
merge [commit_hash]
來恢復它。git fsck
比reglog
有一個優勢。比如你刪除了一個遠端分支並且克隆了倉庫,使用fsck
命令你可以搜索並恢復該遠端分支。
10.cherry-pick命令
我把最優雅的Git命令留在了最後。cherry-pick
是我最愛的Git命令,因爲它的名字就意味着它的功能!
簡而言之,cherry-pick
是指從不同的分支裏選擇某次提交併且把它合併到當前的分支來。如果你在並行的開發某兩個或多個分支,你可能會注意到有一個bug存在於所有的分支中。如果你在一個分支中解決了它,你可以使用cherry-pick來把這次提交合並進其他的分支而不會搞亂其他的文件或是提交。
讓我們想象一個可以使用該命令的場景。我有兩個分支,並且我想要把b20fd14: Cleaned junk
這次提交使用cherry-pick的方法放入到另一個分支。
我切換到我想要放入該提交的分支,然後運行如下命令:
1
|
git
cherry-pick [commit_hash] |
儘管我們本次使用cherry-pick
沒什麼問題,但是你應該清楚這個命令會帶來衝突,請謹慎使用。
小結
說着說着我們就來到了文章的末尾,我認爲這些技巧會讓你的Git水平更上一層樓。
Git是最棒的,只要你能想得到,它就能做得到。
因此,要經常挑戰自己的Git水平。最後你很有可能會學到新的東西。