標籤:

Git日常操作命令梳理

Git日常操作命令梳理http://www.cnblogs.com/kevingrace/p/5690820.html在日常的Git版本庫管理工作中用到了很多操作命令,以下做一梳理:123456789101112131415161718192021222324查看分支列表,帶有*的分支表示是當前所在分支[root@115~~]#git branch查看分支詳細情況 (推薦這種方式)[root@115~~]#git branch -av創建分支(比如devlop):[root@115~~]#git branch devlop切換已有分支[root@115~~]#git checkout devlop創建並切換分支(比如opstest):[root@115~~]#git checkout -b opstest將遠程分支remotes/origin/testapp(比如通過git branch -av發現的)拉到本地,創建別名testapp並切換進去[root@115~~]#git checkout -b testapp remotes/origin/testapp (當前已經切換到testapp)刪除分支(比如opstest)git branch -d devlop如果opstest分支有新內容沒有提交的話,這樣刪除會有提示:git branch -D opstest進行強制刪除------------------------------------------------------------------------------------------------------如果opstest是當前所在分支,則刪除不了!必須將其切換出去後才能刪除在gerrit界面上創建的分支,如下,直接刪除是不行的!

12345678910111213141516171819202122232425[wangshibo@115~]$ git branch* master[wangshibo@115~]$ git branch -av* master 44f4b3a Add newfileremotes/origin/HEAD-> origin/masterremotes/origin/dev44f4b3a Add newfileremotes/origin/master44f4b3a Add newfile[wangshibo@115 ]$ git branch -d remotes/origin/deverror: branch"remotes/origin/dev"not found.正確刪除方式是:登陸gerrit伺服器,找到gerrit安裝目錄的git/項目名稱/refs/heads下刪除dev[gerrit@115]$pwd/home/gerrit/gerrit_site/git/GItLearn.git/refs/heads[gerrit@115]$lsdev[gerrit@115]$lsdev[gerrit@115]$rm-f dev[gerrit@115]$ls[gerrit@115]$這樣,就成功刪除了gerrit界面里創建的分支了!!------------------------------------------------------------------------------------------------------12345合併分支比如將分支devlop合併到master分支下注意:合併前要先切回到要併入的分支[root@115~~]#git checkout master[root@115~~]#git marge devlop------------------------------------------------------------------------------------------------------合併的時候,有時候會出現衝突衝突的時候,git會報出哪些文件衝突,這時候需要手動解決完衝突方可提交。12345678910111213141516171819202122232425262728293031323334353637383940[root@115~~]# git devlop masterAuto-merging index.htmlCONFLICT (content): Merge conflictinindex.htmlAutomatic merge failed; fix conflicts andthencommit the result.通過git status查看衝突文件。[root@115~~]#git statusindex.html: needs merge# On branch master# Changed but not updated:# (use "git add <file>..." to update what will be committed)# (use "git checkout -- <file>..." to discard changes in working directory)## unmerged: index.html#打開index.html,git會在衝突位置做上標示。<<<<<<< HEAD:index.html<divid="footer">contact : email.support@github.com</div>=======<divid="footer">please contact us at support@github.com</div>>>>>>>> iss53:index.html解決完衝突,這時候需要手動標識該衝突已經解決,類似svn的resolved。[root@115~~]#git add index.html[root@115~~]#git status# On branch master# Changed but not updated:# (use "git add <file>..." to update what will be committed)# (use "git checkout -- <file>..." to discard changes in working directory)## modified: index.html#這時候就可以提交了。[root@115~~]#git commit -m "合併分支devlop"[master e3ece67] 合併分支devlop1 files changed, 1 insertions(+), 0 deletions(-)管理多個分支前面提到,git非常推薦頻繁使用分支,在大量分支的情況下,我們需要對分支做好管理(曾經一次上線,開了13個分支 = =)通過-av可以看到最後一次提交日誌。1234567891011121314151617181920[root@115~~]#git branch -av* master b904c07 把丘遲的產品搜改動合併一下p4popt 8b93380 p4p加上refpid,開發給出來的配置是 P4P_refpidprepub a6cc66b P4P解析參數少一次替換,順便解決!失效的問題product 301ae4e rankbar圖片換成data uri通過--merged和--no-merged來查看分支是否已經合併完成。[root@115~~]#git branch --merged* masterp4popt[root@115~~]#git branch --no-mergedprepubproduct未合併的分支,在刪除時會提示分支未合併。[root@115~~]#git branch -d productwarning: deleting branch"product"that has been merged to"refs/remotes/s/product", but it is not yet merged to HEAD.Deleted branch product (was 301ae4e).分支管理流程一般情況下,分支可以劃分為長分支和短分支兩種。長分支長期任務prepub:上線前合併,根據上線列表,從各個分支中集中到該分支,統一部署提測master:上線後合併,長期保留一個穩定可用的分支應付緊急任務項目較難解決的bug新特性試驗田重構長分支,經常會落後其他分支一大截,需要養成習慣,適時從其他重要分支進行合併, 尤其是項目分支 。短分支臨時需求小bug分支可視化git本身的log提供--gragh選項,可以提供字元界面的分支可視化視圖。[root@115~~]#git log --graph --pretty=oneline| * 50cc7a78b7f2704a2014afa3667f6ac5b5b47374 merging refs/remotes/origin/prepub into HEAD| || | * 8f685bd1be3757effe32d6ff37f86bd07dd2b549 又被無情地衝掉了代碼| * | 75a17b4ad610327a9b0e1eecfc6c4bf9cade7359 修改icon| |/| * 146a0990de450c854b1a7d9995e12979fff2d537 merging refs/remotes/origin/prepub into HEAD| || | * 93b379680796eb443961bb8c59008f8ae5678be4 Merge branch "prepub" of search.ued.taobao.net:projects/search into prepub| | || | * | 8b93380ccfb9020bf8f8e1e8a4a553601de3c788 p4p加上refpid,開發給出來的配置是 P4P_refpid| * | | 08201de89834f6fecb195c2b7c3546b5cafccc85 秒殺折扣浮動層樣式| | |/| |/|| * | 0f4d1df17f79c7aa3ca3d36ab848c10b78029010 修改icon| * | ae719fc29cc550321f284323db06a294b97c1398 p4p創意優化| |/| * a6d4501e1456589d30ab1a5800b651876629c8ca 修改icongit還有很多GUI工具,可以提供可視化地分支走勢圖,比如gitk,qgit,GitX等等。遠程分支至今為止,前面所有提到的概念都是直接本地操作的,並不需要任何網路連接。而git本身是一個分散式代碼管理工具(DVCS),所以分支管理上,存在本地分支和遠程分支兩種概念。可以簡單的理解,遠程分支就是別人的本地分支push到伺服器上的時候產生的。比如master就是一個最典型的遠程分支(默認)。123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172[root@115~~]#git push origin master除了master之外,我們還可以隨便創建分支,然後push到伺服器上去。[root@115~~]#git push -u origin prepubCounting objects: 27,done.Delta compression using up to 2 threads.Compressing objects: 100% (15/15),done.Writing objects: 100% (15/15), 7.30 KiB,done.Total 15 (delta 10), reused 0 (delta 0)To git@search.ued.taobao.net:projects/search.git1b95a57..779dbe1 prepub -> prepub遠程分支的標識形式為{remote/branch},比如origin/product。[root@115~~]#git branch -amasterp4popt* prepubproductremotes/origin/HEAD-> origin/masterremotes/origin/masterremotes/origin/p4poptremotes/origin/prepubremotes/origin/product遠程分支和本地分支需要區分,所以,在從伺服器上拉取特定分支的時候,需要指定本地分支名字。[root@115~~]#git branch product origin/productBranch productsetup to track remote branch product from origin.而1.6.2以上版本的git,可以通過--track選項,簡化這一過程。這也是為什麼直接執行git clone的時候,會自動創建本地master分支的原因。(實際上,pull操作相當於fetch+merge。)[root@115~~]#git checkout --track origin/productBranch productsetup to track remote branch refs/remotes/origin/product.Switched to a new branch"product"遠程分支和本地分支是鬆散的結構,可以把任意遠程分支合併到任意本地分支里;同樣,也可以把任意本地分支push到任意遠程分支上。# THIS WILL MESS UP YOUR REPO!![root@115~~]#git branchmaster* prepubp4poptproduct[root@115~~]#git pull origin product[root@115~~]#git push origin master同步本地遠程分支。[root@115~~]#git fetch origin刪除遠程分支。[root@115~~]#git push origin :p4poptTo git@search.ued.taobao.net:projects/search.git- [deleted] p4popt補充:git cherry-pick和git rebasegit cherry-pick可以選擇某一個分支中的一個或幾個commit(s)來進行操作。例如,假設我 們有個穩定版本的分支,叫v2.0,另外還有個開發版本的分支v3.0,我們不能直接把兩個分支合併,這樣會導致穩定版本混亂,但是又想增加一個v3.0 中的功能到v2.0中,這裡就可以使用cherry-pick了。先在v3.0中查看要合併的commit的commitid[root@115~~]#git log假設是 commit f79b0b1ffe445cab6e531260743fa4e08fb4048b切到v2.0中[root@115~~]#git check v2.0合併commit[root@115~~]#git cherry-pick f79b0b1ffe445cab6e531260743fa4e08fb4048bgit rebase有點類似git merge,但是兩者又有不同,打個比方,你有兩個抽屜A和B,裡面都裝了衣服,現在想把B中的衣服放到A中,git merge是那種橫衝直撞型的,拿起B就倒入A裡面,如果滿了(衝突)再一併整理;而git rebase就很持家了,它會一件一件的從B往A中加,會根據一開始放入的時間順序的來加,如果滿了你可以處理這一件,你可以繼續加,或者跳過這一件,又 或者不加了,把A還原。所以merge適合那種比較瑣碎的,簡單的合併,系統級的合併還是用rebase吧。合併b[root@115~~]#git rebase b處理完衝突繼續合併[root@115~~]#git rebase --continue跳過[root@115~~]#git rebase --skip取消合併[root@115~~]#git rebase --abort***************當你發現自己的才華撐不起野心時,就請安靜下來學習吧***************
推薦閱讀:

人為什麼要結婚?梳理人類婚姻史後得出的答案
雞蛋系統梳理(一) | 做雞蛋必備,雞蛋和蛋雞的這些知識點你都清楚嗎?
技術男的極簡整理術(1)從整理桌面開始梳理你的生活
太原市全面梳理規劃道路體系
從頭梳理一遍什麼是量子力學?

TAG:日常 | 梳理 |