如果我不說奇技淫巧,你們估計就不點進來了
Git作為當今最流行的分布式的代碼版本管理系統(tǒng),它的出現(xiàn)改變了軟件開發(fā)流程,大大地提高了開發(fā)流暢度。
使用Git也有一段時間了,一直都只是使用一些最最基本的幾個命令,對于不復(fù)雜的代碼工程來說,我覺得已經(jīng)夠用了。
命令別名
平時不太用GUI,都是在IDEA中直接敲命令進行相關(guān)操作,覺得命令行相對于GUI來說效率還是要高一些,一開始老老實實的敲完整的命令,比如
1、git checkout dev
2、git status
3、git commit -m '某次提交'
后來才發(fā)現(xiàn),Git有別名這一功能,通過下面幾個命令可以把比較長的命令使用簡短兩個字母代替。
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
$ git config --global alias.st status
然后就可以愉快的敲 git st
來查看當前狀態(tài)了,除了這種簡單的替換,還可以進行復(fù)雜的替換,比如要顯示一個牛逼的提交記錄,可以把lg替換成很長的一段命令組合,如下:
$ git config --global alias.lg log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
大家可以感受一下,這是原生的git log
下面是git lg
,是不是高大上了很多,還有很多組合命令可以去挖掘
如何放棄本地修改
這個功能平時用的還是比較多的,經(jīng)常功能加了之后發(fā)現(xiàn)并沒什么卵用,需要放棄這些修改,不過這也分為好幾種情況。
1、未進行add操作
這種情況,應(yīng)該是最常見的,一般修改不會輕易進行git add <file>
操作,這個時候只需要進行簡單的 git co -- .
全部或者 git co -- <file>
恢復(fù)具體的文件。
命令中的--很重要,沒有--,就可能變成 "分支切換" 的命令,但是如果沒寫--,且沒有對應(yīng)的分支,也可以恢復(fù),為了保險,還是老老實實加上。
該命令就是用來放棄那些還未加入緩存區(qū)的修改操作,包括文件內(nèi)容的修改和文件的刪除,但是對于那些新建的文件來說,并不把它刪掉,因為剛新建的文件對于Git來說是未知的,需要手動的刪除。
2、已經(jīng)被add進緩存
好吧,這種情況,我也是經(jīng)常遇到,因為手速太快,執(zhí)行完git add .
之后,發(fā)現(xiàn)一些有問題,怎么辦?
因為這些修改已經(jīng)被放入緩存區(qū)了,git co
操作已經(jīng)無力回天,這個時候,可以使用 git reset HEAD <file>
命令來放棄指定的文件的緩存,如果要放棄所有修改的緩存,可以使用 git reset HEAD .
該命令相當于撤銷 git add
的影響,在執(zhí)行該命令后,本地的修改并不會消失,而是回到add之前的狀態(tài)。
3、add完之后,還commit了
這種情況最糟心,還好沒有push到遠程倉庫,還可以搶救。其實方法也很簡單,可以使用 git reset --hard HEAD^
來回退到上一次commit的狀態(tài)。
另外使用此命令可以回退到任意版本:git reset --hard commitid
這里的commitId就是使用 git log
顯示的提交歷史中的SHA碼,只需要前面幾位即可。
如何合并分支
通常我們會在一個新建分支進行相關(guān)功能的開發(fā),比如執(zhí)行 git co -br dev
創(chuàng)建一個dev分支進行開發(fā)。
一個功能迭代開發(fā)了一周,測試通過之后,需要合并回mater分支,這個時候master分支可能已經(jīng)合并了一些其他小伙伴的代碼,這個時候的Git可能下面這個情況
下面是SourceTree上的顯示結(jié)構(gòu)
需要把dev分支的代碼合并到master上,可以有兩種方法
git merge dev
git rebase dev
如果是執(zhí)行 git merge dev
,效果如下
merge命令會留下dev分支,卻在合并的地方多了一個merge節(jié)點。
如果是執(zhí)行git rebase dev-0
,會發(fā)生什么?我們再試試
因為測試,重新創(chuàng)建了dev-0分支,通過rebase的合并,發(fā)現(xiàn)dev-0的commit信息很自然被整合到了mater分支中,好像dev-0分支從來沒有存在過一樣,整個分支也很干凈。
刪除遠程分支
有時候可能一不小心,把本地的開發(fā)分支會push到了遠程倉庫,雖然沒什么大礙,對應(yīng)有分支潔癖的同學(xué)可能不能接受,怎么辦,刪除之。
對于本地分支,可以痛快的執(zhí)行 git br -d dev
命令進行刪除,遠程分支就沒這個簡單了,不過命令還是有的,只是不太好記。
git push origin :<branch-name>
推送一個空分支到遠程分支,相當于刪除了遠程分支,在v1.7.0 之后,可以使用下面這種語法進行刪除
// 1.7.0之后
git push origin --delete <branch-name >
tag相關(guān)
一般在發(fā)布一個版本的時候,會打一個對應(yīng)的版本號。
git tag 1.1.8
那么,tag有什么好處?
比如,目前組件已經(jīng)迭代到了版本2.0.5,業(yè)務(wù)卻拿著1.1.8的版本,咨詢哪哪哪有問題,這個時候就可以快速的執(zhí)行 git co 1.1.8
命令定位到1.1.8版本發(fā)布時的代碼,并進行相關(guān)問題的查看。
其它的一些技巧
1、git add -p
之前在執(zhí)行git add
時,可能把并不想提交的一些文件(測試文件)給add到緩存了,如果添加了 -p ,可以一個一個提示你進行add,并提示變更的內(nèi)容,簡直無比的貼心。
其它一些高級技能,平時也沒怎么用過,如果有其它的一些技巧,歡迎推薦。
最后
獻上一張圖,已經(jīng)忘記當時是哪里找到的
更多精彩問題,歡迎加入知識星球
450+小伙伴正在討論