12個git實戰建議和技巧
發表於2012-12-11 09:36|15696次閱讀| 來源CSDN|18條評論| 作者王然
git版本控制工具摘要:git無疑是現在最熱門的版本控制工具,而且正在進一步侵佔SVN以及CVS的市場。本文作者從國外技術問答社區Stack Overflow整理的12個很實用的git使用技巧和建議,希望對你有幫助。1.使用「git diff」來摺疊多行
用git diff經常會出現很多內容,導致很多內容被遮住了,讓人很是苦惱,幸運的是這裡有個解決方案。
如果你使用less作為默認的pager,只需要輸入-s,就可以保證不會被diff刷屏了。
或者,你也可以使用git config設置pager來達到同樣的效果:
為當前項目設置pager:
- $gitconfigcore.pager"less-r"
再將pager設置的作用域設置為整個項目:
- $gitconfig--globalcore.pager"less-r"
2.設置全局代理
在某些網路環境下,你可能需要為git配置代理,這很簡單,只需要一行命令就可以了:
- gitconfig--globalhttps.proxyhttps://user:password@address:port
3.clone某個特定分支
在某些大型項目中,或者只是圖方便,有時候你可能只希望clone某個分支,你可以這樣做:
- mkdir$BRANCH
- cd$BRANCH
- gitinit
- gitremoteadd-t$BRANCH-forigin$REMOTE_REPO
- gitcheckout$BRANCH
4.比較某個文件和遠程分支上的區別
很簡單:
- gitdifflocalbranchremotebranchfilepath
5.列出版本庫中所有已刪除的文件
也許你是想將其恢復,因此需要仔細確認某些merge操作,無論如何,列出版本庫中所有已刪除的文件會非常有幫助。你只需要這樣做:
- gitlog--diff-filter=D--summary
如果你想將其恢復,參照這裡。
如果你不想知道是哪次commit中刪除的,只需要添加一個grep delete。
- gitlog--diff-filter=D--summary|grepdelete
6.在版本庫所有版本中搜尋一條字元串
往往你想要查找某段代碼、某個函數、一個常量、一個文件,但是卻找不到了。它被刪除了,什麼時候刪除的?這個小技巧能搜索整個版本庫中git diff信息,可能會花些時間,但是非常有用:
- gitrev-list--all|(
- whilereadrevision;do
- gitgrep-F"Yoursearchstring"$revision
- done
- )
7.應用另外一個(不相關的)本地版本庫中的patch
從另一個版本庫中cherry-pick一條提交記錄,首先需要將那個版本庫作為一個遠程版本庫添加進來,並fetch其變化,然後cherry-pick其提交記錄。
如果你追求速度,也可以使用這個未經優化的命令:
- git--git-dir=../some_other_repo/.gitformat-patch-k-1--stdout<commitSHA>|gitam-3-k
8.從新的主幹中分出一個新分支
有時候你會在better_brach上工作一段時間,並準備將其設為新的master,你會怎麼做?
這裡是Stack Overflow上提供的常規解決方案:
1.切換到better_brach分支:
- gitcheckoutbetter_branch
2.保留better_branch分支全部內容,但是記錄合併:
- gitmerge--strategy=oursmaster
3.切回mater
- gitcheckoutmaster
4.快速合併
- gitmergebetter_branch
5.如果你想讓合併步驟變得更清晰,可以添加commit信息。只需要修改下第二步:
- gitmerge--strategy=ours--no-commitmaster
- gitcommit#Hereaddyourcustommessagetothecommittemplate
9.向分支提交一個初始的空commit,保證完全複位
這樣會重寫歷史記錄,所以只能在未和任何人分享前做,否則將可能把同事者的文件破壞。
1.創建一個新的空分支,例如:newroot
- gitcheckout--orphannewroot
- gitrm--cached-r.
- gitclean-f-d
2.創建空的commit
- gitcommit--allow-empty-m"[empty]initialcommit"
3.重新發送分支的全部內容
- gitrebase--ontonewroot--rootmaster
4.刪除臨時分支newroot
- gitbranch-dnewroot
現在master就已經包含了一個空的root commit了。
10.清空一個分支來做些不同的事有時候你會想要從某個分支重新開始,或者打算保留一些邏輯上和主幹相關但是跟蹤另一個跨職能方面的代碼,就像GitHub項目的gh-pages。
但如果你只想重新開始某個分支,清空所有歷史記錄呢?
1.檢出(checkout)一個分支:
- gitcheckout-bbranch_to_zero
2.跟上條一樣,先建立增加一個初始的空commit,之後就可以通過重新設置來清空一個分支。
3.使用hard重置分支到剛剛創建的初始commit:
- gitreset--hardinitial_commit
11.如何修改一個特定的commit?
當你想在推送前重做你最後的commit時,可以使用修改命令(git commit --amend)。如果你想修改的不是最後一個commit呢?
這種情況下,你可以使用git rebase,例如,你想要修改bbc643cd commit,運行下面的命令:
- $gitrebasebbc643cd^--interactive
在默認的編輯器中選擇並修改你期望修改的,然後保存修改並輸入:
- $gitadd<filepattern>
現在你就可以使用
- $gitcommit--amend
來修改commit,之後使用
- $gitrebase--continue
返回之前最新的commit。
12.如何隱藏多個已修改文件中一個?git stash --keep-index命令可以用來隱藏上次commit中沒有add的東西,之後add想要提交的文件並運行相應命令就可以了。
按照下面的提示,你可以把一條老的commit提交到多個變更集中:
互動地rebase最後一條好的commit:
- gitrebase-ilast_good_commit
將某些變化標記為edit:
- gitresetHEAD^
- gitaddfile1file2file3
添加相應的文件:
- gitaddfile1file2file3
因此之前沒有添加的文件:
- gitstash--keep-index
別忘了收尾:
- gitcommit
- gitstashpop
有必要的話,重複第二步之後的步驟:
- gitrebase--continue
推薦閱讀:
※職場小白必須知道的事!
※幼兒園老師與家長溝通的技巧及注意事項
※接電話的技巧和忌諱
※華爾茲技巧里的升降和擺盪
※說話技巧:一開口就抓住對方的好感