讓你的Git水平更上一層樓的10個小貼士
最近,我們發表了關於Git基礎知識和在團隊中使用Git的教程。我們之前討論的那些命令,已經足夠讓幫助一個開發者在Git世界裡生存了。本篇文章,我們將嘗試探索如何更有效的管理您的時間以及如何充分使用Git提供的各種功能。
注意:本文中,一些命令包含含有方括號的部分(e.g.git add -p [file_name]
).在這些例子中,您要在該處插入所需的數字,標示符等。而不需要保留方括號。
1.Git自動補全
如果你在命令列中使用Git命令,每次手動輸入命令是一件非常煩人的。為了解決這個問題,你可以很方便的開啟自動補全功能。
在Unix系統下,執行以下指令來獲取指令碼:
12 | ;html-script:false]cd~curl https://raw.github.com/git/git/master/contrib/completion/git-completion.bash-o~/.git-completion.bash |
然後,在您的~/.bash_profile
檔案中新增以下程式碼:
123 | ;html-script:false]if[-f~/.git-completion.bash];then.~/.git-completion |
儘管我之前就提到過,在這裡我仍要不厭其煩的說:如果你想使用Git提供的全部功能,你肯定是需要轉而使用命令列來操作的。
2.在Git中忽略檔案
你是否對出現在你Git倉庫中的已編譯檔案(比如.pyc
)感到厭煩?
亦或是你已經對把它們加入Git中這件事感到忍無可忍了?
眼下就有一個可以讓Git忽略特定檔案或是目錄的方法。只需要簡單的建立一個.gitignore
檔案,然後列出你不想讓Git跟蹤的檔案和目錄即可。你可以使用感嘆號(!)來指出例外的情況。
12345 | ;html-script:false]*.pyc*.exemy_db_config/!main.pyc |
3.誰動了我的程式碼?
出了問題後去責怪別人,是人類的天性。如果你的成品伺服器出了問題,你可以非常輕鬆的把壞人揪出來——只需要使用git blame
命令。
這個命令會顯示檔案中每一行的作者,最後一次改動後進行的提交(commit)以及該次提交的時間戳。。
1 | ;html-script:false]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
– [email protected]{4}
),這是我使用硬重置(hard reset)時丟失的那個。
6.暫存一個檔案的部分改動
通常來講,建立一個基於特性的提交是一個良好的做法,就是說,每次提交都必須代表一個新特性的產生或者是一個bug的修復。考慮一下,如果你修復了兩個bug,或是添加了多個新特性但是卻沒有提交這些變化會怎樣呢?在這種情況下,你可以把這些變化放在一次提交中。但是還有一個更好的方法:把檔案分別暫存(Stage)然後分別提交。
比如說,你對一個檔案進行了多次修改並且想把他們分別提交。這種情況下,你可以在新增命令(add
)中加上-p
選項
1 | ;html-script:false]git add-p[file_name] |
讓我們演示一下。我在file_name
檔案中添加了3行文字,而且我只想提交第一行和第三行。我們先看一下git diff
顯示的結果。
然後,我們看一下,在新增命令(add)中加上-p
選項後會發生什麼。
看上去,Git假定所有的改變都是針對同一件事情的,因此它把這些都放在了一個塊裡。你有如下幾個選項:
- 輸入
y
來快取該塊 - 輸入
n
不快取該塊 - 輸入
e
來人工編輯該塊 - 輸入
d
來退出或進入下一個檔案 - 輸入
s
來分割這個塊
對我們而言,我們肯定希望把它分成幾個部分,有選擇的新增一部分而忽略其他的。
正如你所看到的,我們添加了第一行和第三行而忽略了第二行。你可以在之後檢視倉庫狀態並進行提交。
7.合併多次提交
當你提交你的程式碼進行稽核並建立一個pull request時(在開源專案中常常發生這樣的情況),你經常會在程式碼被採納前,要求修改一些程式碼。你進行了一些修改,而在下一次稽核中,又會被要求進行另外的修改。你不知道還有多少次修改等著你,在你知道以前,你進行了多次額外的提交。理想的狀態是,你可以使用rebase
命令,把他們都合併成一次提交。
1 | ;html-script:false]git rebase-iHEAD~[number_of_commits] |
如果你希望合併最後兩次提交,您需要以下命令
Shell1 | ;html-script:false]git rebase-iHEAD~2 |
使用該命令,你會進入一個互動式的介面,顯示了最後兩次提交,並且詢問你要壓縮哪些。理想狀態是你pick
最近的一次提交併把它和之前的提交squash
。
接下來你會被要求為合併後的這次提交填寫描述資訊。這一個過程實際上重寫了你的提交歷史。
8.儲存尚未提交的改動
比方說你正在解決一個bug或是新增某個新功能,這時你突然被要求展示你的工作。你當前的工作還沒有完成到進行提交的地步,而且你在這個階段也沒辦法展示你的工作(如果不回退所有變化的話)。在這種情況下,git stash
可以拯救你。stash命令本質上是儲存了你全部的改動以供將來使用。儲存你的改動,你只需要執行如下命令:
1 | ;html-script:false]git stash |
檢視暫存列表,你可以執行如下命令:
Shell1 | ;html-script:false]git stash list |
如果你不想儲存了或是想要恢復這些改動,你使用如下命令:
Shell1 | ;html-script:false]git stash apply |
在最後一張截圖中,你可以看到,每一次儲存都有一個標示符,一個獨一無二的數字(儘管我們此處只有一次儲存),萬一你只想使用某些儲存,你需要在apply
命令後指明標示符。
1 | ;html-script:false]gitstashapplystash@{2} |
9.檢查丟失的提交
儘管reflog
是一種檢視丟失提交的方法,但是它在大型倉庫中行不通。這時就該fsck
(file system check)出場了。
1 | ;html-script:false]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 | ;html-script:false]git cherry-pick[commit_hash] |
儘管我們本次使用cherry-pick
沒什麼問題,但是你應該清楚這個命令會帶來衝突,請謹慎使用。
小結
說著說著我們就來到了文章的末尾,我認為這些技巧會讓你的Git水平更上一層樓。
Git是最棒的,只要你能想得到,它就能做得到。
因此,要經常挑戰自己的Git水平。最後你很有可能會學到新的東西。
打賞支援我翻譯更多好文章,謝謝!
打賞譯者
打賞支援我翻譯更多好文章,謝謝!
任選一種支付方式