讓你的Git水平更上一層樓的10個小貼士

原文鏈接:http://blog.jobbole.com/75348/

注意:本文中,一些命令包含含有方括號的部分(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 fsckreglog有一個優勢。比如你刪除了一個遠端分支並且克隆了倉庫,使用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水平。最後你很有可能會學到新的東西。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章