12個Git實戰(zhàn)建議和技巧分享
Git無疑是現(xiàn)在最熱門的版本控制工具,而且正在進一步侵占SVN以及CVS的市場。本文作者從國外技術(shù)問答社區(qū)Stack Overflow整理的12個很實用的git使用技巧和建議,希望對你有幫助。
1.使用“git diff”來折疊多行
用git diff經(jīng)常會出現(xiàn)很多內(nèi)容,導(dǎo)致很多內(nèi)容被遮住了,讓人很是苦惱,幸運的是這里有個解決方案。
如果你使用less作為默認(rèn)的pager,只需要輸入-s,就可以保證不會被diff刷屏了。
或者,你也可以使用git config設(shè)置pager來達到同樣的效果:
為當(dāng)前項目設(shè)置pager:
$ git config core.pager 'less -r' |
再將pager設(shè)置的作用域設(shè)置為整個項目:
$ git config --global core.pager 'less -r' |
2.設(shè)置全局代理
在某些網(wǎng)絡(luò)環(huán)境下,你可能需要為git配置代理,這很簡單,只需要一行命令就可以了:
git config --global https.proxy https://user:password@address:port |
3.clone某個特定分支
在某些大型項目中,或者只是圖方便,有時候你可能只希望clone某個分支,你可以這樣做:
mkdir $BRANCH
cd $BRANCH git init git remote add -t $BRANCH -f origin $REMOTE_REPO git checkout $BRANCH |
4.比較某個文件和遠(yuǎn)程分支上的區(qū)別
很簡單:
git diff localbranch remotebranch filepath |
5.列出版本庫中所有已刪除的文件
也許你是想將其恢復(fù),因此需要仔細(xì)確認(rèn)某些merge操作,無論如何,列出版本庫中所有已刪除的文件會非常有幫助。你只需要這樣做:
git log --diff-filter=D --summary |
如果你想將其恢復(fù),參照這里。
如果你不想知道是哪次commit中刪除的,只需要添加一個grep delete。
git log --diff-filter=D --summary | grep delete |
6.在版本庫所有版本中搜尋一條字符串
往往你想要查找某段代碼、某個函數(shù)、一個常量、一個文件,但是卻找不到了。它被刪除了,什么時候刪除的?這個小技巧能搜索整個版本庫中g(shù)it diff信息,可能會花些時間,但是非常有用:
git rev-list --all | (
while read revision; do git grep -F 'Your search string' $revision done ) |
7.應(yīng)用另外一個(不相關(guān)的)本地版本庫中的patch
從另一個版本庫中cherry-pick一條提交記錄,首先需要將那個版本庫作為一個遠(yuǎn)程版本庫添加進來,并fetch其變化,然后cherry-pick其提交記錄。
如果你追求速度,也可以使用這個未經(jīng)優(yōu)化的命令:
git --git-dir=../some_other_repo/.git format-patch -k -1 --stdout <commit SHA>| git am -3 -k |
8.從新的主干中分出一個新分支
有時候你會在better_brach上工作一段時間,并準(zhǔn)備將其設(shè)為新的master,你會怎么做?
這里是Stack Overflow上提供的常規(guī)解決方案:
1.切換到better_brach分支:
git checkout better_branch
2.保留better_branch分支全部內(nèi)容,但是記錄合并:
git merge --strategy=ours master
3.切回mater
git checkout master
4.快速合并
git merge better_branch
5.如果你想讓合并步驟變得更清晰,可以添加commit信息。只需要修改下第二步:
git commit # Here add your custom message to the commit template
git merge --strategy=ours --no-commit master
9.向分支提交一個初始的空commit,保證完全復(fù)位
這樣會重寫歷史記錄,所以只能在未和任何人分享前做,否則將可能把同事者的文件破壞。
1.創(chuàng)建一個新的空分支,例如:newroot
git rm --cached -r . git clean -f -d
git checkout --orphan newroot
2.創(chuàng)建空的commit
git commit --allow-empty -m '[empty] initial commit'
3.重新發(fā)送分支的全部內(nèi)容
git rebase --onto newroot --root master
4.刪除臨時分支newroot
git branch -d newroot
現(xiàn)在master就已經(jīng)包含了一個空的root commit了。
10.清空一個分支來做些不同的事
有時候你會想要從某個分支重新開始,或者打算保留一些邏輯上和主干相關(guān)但是跟蹤另一個跨職能方面的代碼,就像GitHub項目的gh-pages。
但如果你只想重新開始某個分支,清空所有歷史記錄呢?
1.檢出(checkout)一個分支:
git checkout -b branch_to_zero
2.跟上條一樣,先建立增加一個初始的空commit,之后就可以通過重新設(shè)置來清空一個分支。
3.使用hard重置分支到剛剛創(chuàng)建的初始commit:
git reset --hard initial_commit
11.如何修改一個特定的commit?
當(dāng)你想在推送前重做你最后的commit時,可以使用修改命令(git commit --amend)。如果你想修改的不是最后一個commit呢?
這種情況下,你可以使用git rebase,例如,你想要修改bbc643cd commit,運行下面的命令:
$git rebase bbc643cd^ --interactive |
在默認(rèn)的編輯器中選擇并修改你期望修改的,然后保存修改并輸入:
$ git add <filepattern> |
現(xiàn)在你就可以使用
$git commit --amend |
來修改commit,之后使用
$ git rebase --continue |
返回之前最新的commit。
12.如何隱藏多個已修改文件中一個?
git stash --keep-index命令可以用來隱藏上次commit中沒有add的東西,之后add想要提交的文件并運行相應(yīng)命令就可以了。
按照下面的提示,你可以把一條老的commit提交到多個變更集中:
互動地rebase最后一條好的commit:
git rebase -i last_good_commit |
將某些變化標(biāo)記為edit:
git reset HEAD^
git add file1 file2 file3 |
添加相應(yīng)的文件:
git add file1 file2 file3 |
因此之前沒有添加的文件:
git stash --keep-index |
別忘了收尾:
git commit
git stash pop |
有必要的話,重復(fù)第二步之后的步驟:
git rebase --continue |