Git和SVN區(qū)別
Git是分布式的,SVN是集成式的
這個(gè)是Git和SVN最大的區(qū)別。
SVN:

·SVN的版本管理有一個(gè)唯一的URL,每一個(gè)用戶都是從這個(gè)地址獲取代碼和數(shù)據(jù),
·同樣提交的的話也是對(duì)這個(gè)唯一的版本庫進(jìn)行更改
·沒有網(wǎng)絡(luò)的話,就沒有辦法進(jìn)行提交文件,無法還原,查看歷史記錄差異
·提交需要授權(quán),方便進(jìn)行權(quán)限管理
Git:

·每個(gè)clone版本庫都是平等的??梢詮娜魏我粋€(gè)版本庫來克隆屬于自己的版本庫,同時(shí)自己的庫也可以當(dāng)作源來提供給他人。
·可以脫離網(wǎng)絡(luò)時(shí)正常使用版本庫,只需要有網(wǎng)時(shí)推送PUSH一下,和服務(wù)器保持同步
·Git創(chuàng)建功能分支方便
在我剛進(jìn)公司時(shí)我們項(xiàng)目使用的是SVN進(jìn)行版本管理,后期進(jìn)行替換到了Git。從我的角度來看引入git最主要的優(yōu)勢(shì)就是更加方便的進(jìn)行功能分支管理,和斷網(wǎng)不影響正常的功能使用。在我們的后期開發(fā)中需要進(jìn)行大量的創(chuàng)建feature功能分支,切換分支的操作,因?yàn)镚it分支是指針指向某次提交,而SVN分支是拷貝目錄,所以git創(chuàng)建和切換的成本很低。
Git 的常用操作
日常使用,我通常是可視化界面和命令行方式結(jié)合使用
可視化操作通過Sourcetree來操作

其實(shí)日常的一些提交 commit,推送 push,拉取 pull 通過sourcetree都可以進(jìn)行很方便的操作,但是一些操作還是命令行更方便,如:squash merge,rebase ,cheery-pick 等等
目前我們項(xiàng)目定的規(guī)范是,在日常拉取時(shí)使用rebase來代替合并,在進(jìn)行不同分支間的合并時(shí)也盡量使用squash;
主要目的時(shí)為了跟清晰的版本線管理,因?yàn)?,直接使用合并的話可能?huì)導(dǎo)致創(chuàng)建一些自動(dòng)提交,讓版本線變得復(fù)雜,不容易回溯問題。

這個(gè)是我們期望的結(jié)果,一條線拉下來

這個(gè)是不希望的,會(huì)拉出很多其他分支,不方便查看
一般來說,一個(gè)功能分支在進(jìn)行一段時(shí)間的開發(fā)之后,我們會(huì)同步一下dev主干上的內(nèi)容,防止版本差異過大導(dǎo)致后期合并時(shí)沖突過多。我們會(huì)先從dev拉取一個(gè)最新的分支命名為對(duì)應(yīng)的功能分支名如:feature_1.x,再把對(duì)應(yīng)的分支功能合并到這個(gè)分支上,通過升級(jí)的方式來進(jìn)行分支同步。
關(guān)于merge和rebase的區(qū)別具體的可以看看這個(gè):
https://blog.csdn.net/hudashi/article/details/7664631
這里我只簡(jiǎn)單的貼兩張圖

merge 會(huì)產(chǎn)生一個(gè) merge commit ,在分支線的表現(xiàn)看起來就是“分叉了”

而使用 rebase 就可以避免這個(gè)問題
git --help //列出常用的git命令
git branch //輸出本地分支
git brach 分支名 //創(chuàng)建新的分支
git checkout 分支名 //切換分支
git checkout -b mybranch //創(chuàng)建并切換分支
git merge --squash 分支名 //把分支上的提交合并成一次提交,變動(dòng)存到本地分支,所以還需要手動(dòng)提
交一次;之前的提交日志記錄沒了,會(huì)被這個(gè)新的提交覆蓋掉
git cherry-pick <HashA> <HashB> //將A和B提交應(yīng)用到當(dāng)前分支
git cherry-pick A..B //左開右閉
git cherry-pick A^..B //包括A