&開發(fā)過程中離不開源代碼的管理,
目地:為了解決在軟件開發(fā)過程中吃沪,由源代碼引發(fā)的各種蛋疼爆哑、繁瑣的問題。
目前開發(fā)使用較廣的版本控制系統(tǒng)「Git & SVN」橡疼,后續(xù)會(huì)單開一篇總結(jié)正在使用的【強(qiáng)大的 Git 客戶端:SourceTree】援所。
本篇文章主要從使用者角度【Git & SVN 詳解使用】學(xué)習(xí)總結(jié)。
在「時(shí)間 & 知識(shí) 」有限內(nèi)欣除,總結(jié)的文章難免有「未全住拭、不足 」的地方,還望各位好友指出
目錄:
源代碼管理認(rèn)知
源代碼管理 SVN 詳解使用
SVN 基礎(chǔ)知識(shí)概念
2.SVN 客戶端實(shí)用命令
3.SVN 客戶端實(shí)用示例
4.「SVN–>branch & tag」分支和標(biāo)簽
5.SVN ST 顯示的文件狀態(tài)
源代碼管理 Git 詳解使用
1.Git基礎(chǔ)知識(shí)概念
2.Git 幾個(gè)核心概念
3.Git 工作原理 / 流程
4.Git 客戶端實(shí)用命令
5.「Git–>branch & tag & remote」分支、標(biāo)簽和遠(yuǎn)程
6.Git 客戶端實(shí)用示例
SVN & Git 兩者比較
碼農(nóng)們踩過的坑整理(持續(xù)~)
下面簡(jiǎn)單幾點(diǎn)總結(jié)滔岳,來給初學(xué)者快速對(duì)源代碼管理有個(gè)認(rèn)知瘟檩;
為什么會(huì)出現(xiàn)源代碼管理工具 ?
為了解決在軟件開發(fā)過程中澈蟆,由源代碼引發(fā)的各種蛋疼、繁瑣的問題卓研。
源代碼會(huì)引發(fā)哪些問題 趴俘?
無法后悔:做錯(cuò)了一個(gè)操作后,某些情況下無法返回奏赘,沒有后悔藥可以吃寥闪。
版本備份:費(fèi)空間、費(fèi)時(shí)間磨淌。
版本混亂:因版本備份過多造成混亂疲憋,難于找回正確的想要的版本。
代碼沖突:多人操作同一個(gè)文件(團(tuán)隊(duì)開發(fā)中的常見問題)梁只。
權(quán)限控制:無法對(duì)源代碼進(jìn)行精確的權(quán)限控制缚柳。
追究責(zé)任:出現(xiàn)了嚴(yán)重的 BUG,無法定位到負(fù)責(zé)人搪锣,容易耍賴秋忙。
源代碼管理工具的作用是 ?
能追蹤一個(gè)項(xiàng)目從誕生一直到定案的過程构舟。
記錄一個(gè)項(xiàng)目的所有內(nèi)容變化灰追。
方便地查閱特定版本的修訂情況。
溫馨提示:
如果是團(tuán)隊(duì)開發(fā)狗超,使用源代碼管理工具是強(qiáng)制性的弹澎!
如果是單人開發(fā),也強(qiáng)烈建議現(xiàn)在就開始使用源代碼管理工具努咐。
SVN是集中式控制系統(tǒng)苦蒿,需要一個(gè)中央服務(wù)器。
Repository代碼倉庫麦撵,保存代碼的倉庫刽肠。
Server服務(wù)器,保存所有版本的代碼倉庫免胃。
Client客戶端音五,只保存當(dāng)前用戶的代碼倉庫。
用戶名&密碼訪問代碼倉庫需要使用自己的 “用戶名和密碼”羔沙,從而可以區(qū)分出不同的人對(duì)代碼做的修改躺涝。
svn checkout「簡(jiǎn)寫svn co」:將服務(wù)器上最新的代碼倉庫下載到本地(只需要做一次)。
svn update「簡(jiǎn)寫svn up」:從服務(wù)器上將其他人所做的修改下載到本地 (每天上班必須要做的事情)。
svn commit「簡(jiǎn)寫svn ci」:將改動(dòng)的文件提交到服務(wù)器(每天下班之前至少做一次)坚嗜。
svn add:向本地的版本控制庫中添加新文件夯膀。
svn delete、svn remove「簡(jiǎn)寫svn del苍蔬、svn rm」:從本地的版本控制庫中刪除文件诱建。
svn move:移動(dòng)文件或者目錄或文件更名
svn mkdir:創(chuàng)建納入版本控制下的新目錄
svn revert:撤銷之前的一切修改
svn merge:將兩個(gè)版本之間的差異合并到當(dāng)前文件
svn info:查看文件的詳細(xì)信息。
svn diff:查看不同版本的區(qū)別碟绑。
svn log:查看日志信息俺猿。
svn list:列出版本庫下的文件和目錄列表。
svn status「簡(jiǎn)寫svn st」:查看文件狀態(tài)格仲。
svn help:獲取幫助信息(比如 svn help ci)押袍。
svn lock:加鎖。
svn unlock:解鎖凯肋。
檢出:
去到公司的第一天谊惭,將項(xiàng)目檢出(下載)至本地。
svn checkout URL[PATH]
svn co URL[PATH]
注意:
這里的中括號(hào)[ ]代表可選(可以省略)侮东。
URL:代碼倉庫的遠(yuǎn)程地址圈盔。
[PATH]:將代碼下載到本地的哪個(gè)路徑(如果省略本地的路徑,就下載到命令行當(dāng)前所在的路徑)悄雅。
提交:
將改動(dòng)過的舊文件提交至服務(wù)器药磺。
svn commit-m "注釋"[PATH]
svn ci-m "注釋"[PATH]
注意:
一定要養(yǎng)成寫注釋的良好習(xí)慣。
“注釋”:”修改了User.m文件”煤伟。
[PATH]:代表是 提交哪個(gè)文件到服務(wù)器(如果省略路徑癌佩,就將命令行所在路徑中所有改動(dòng)過的文件提交到服務(wù)器)。
添加:
提交一個(gè)新建的文件到服務(wù)器便锨,需要2個(gè)步驟围辙。
添加新建的文件到本地的版本控制庫中:svn add。
提交剛才的添加操作到服務(wù)器:svn commit放案。
將文件添加到本地的版本控制庫姚建。
svn add PATH
PATH:代表是 添加哪個(gè)文件到版本控制庫中。
刪除:
刪除服務(wù)器上的某個(gè)舊文件吱殉,需要做2個(gè)步驟掸冤。
將文件從本地的版本控制庫中移除:svn delete、svn remove友雳。
提交剛才的刪除操作到服務(wù)器:svn commit稿湿。
將文件從本地的版本控制庫中移除。
svn delete PATH
PATH:代表是 將哪個(gè)文件從版本控制庫中移除押赊。
更新:
將服務(wù)器上其他同事提交的饺藤,最新代碼更新到本地。
svn update [PATH]
PATH:代表是 更新哪個(gè)文件的內(nèi)容(如果省略路徑,就更新命令行所在路徑的所有內(nèi)容)涕俗。
回滾:
改動(dòng)沒有被提交罗丰。
這種情況下,使用svn revert就能取消之前的修改再姑。當(dāng)為單個(gè)文件時(shí)萌抵,直接svn revert 文件就行了;當(dāng)為目錄時(shí)元镀,需要加上參數(shù)-r (Recursive,遞歸)谜嫉,否則只會(huì)將改文件這個(gè)目錄的改動(dòng)。
改動(dòng)已經(jīng)被提交凹联。
這種情況下,用svn merge命令來進(jìn)行回滾哆档。先運(yùn)行svn up保證拿到最新的版本蔽挠,然后svn log查看并找到要回滾的版本號(hào),如果想要更詳細(xì)的了解情況瓜浸,可以使用svn diff -r HEAD:2500 [文件](回滾到版本號(hào)2500)澳淑,此處的[ ]可以是文件、目錄或整個(gè)項(xiàng)目插佛。
「SVN–>branch & tag」分支和標(biāo)簽
SVN官方推薦在一個(gè)版本庫的根目錄下先建立trunk杠巡、branches、tags這三個(gè)文件夾雇寇,其中trunk是開發(fā)主干氢拥,存放日常開發(fā)的內(nèi)容;branches存放各分支的內(nèi)容锨侯,比如為不同客戶定制的不同版本嫩海;tags存放某個(gè)版本狀態(tài)的標(biāo)簽。
branhces和tags本質(zhì)沒有區(qū)別囚痴,都是通過svn copy方式建立的叁怪,差異在于通常branches中的內(nèi)容是需要繼續(xù)修改或開發(fā)的,tags中的內(nèi)容是存放不再修改的深滚,這一般通過權(quán)限設(shè)置來解決奕谭,tags通常只給管理員開放寫權(quán)限。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
171.新建分支
svncopymaster_repository_url branch_repository_url -m"your comments"
2.新建空白分支
svn mkdir branch_repository_url
3.刪除分支
svn rm branch_repository_url -m"your comments"
4.新建tag
svncopymaster_repository_url tag_repository_url -m"your comments"
5.刪除tag
svn rm tag_repository_url -m"your comments"
6.查看branches
svn ls ^/branches --verbose
分支與主干的合并:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# 分支合到主干 cd trunk
svn merge -r : svn://branch/path
# 分支當(dāng)前版本為4847痴荐,想把4825到4847間的改動(dòng)merge到主干
# cd trunk
svn merge -r4825:4847svn://branch/path
svn ci -m"merge branch changes r4835:4847 into trunk"
# 主干合到分支 cd branch
# 在r23創(chuàng)建了一個(gè)分支血柳,trunk版本號(hào)更新到了25,想把23-25之間的改動(dòng)merge到分支
svn merge -r23:25svn://trunk/path
svn ci -m"merge trunk changes r23:25 into my branch"
# cd trunk
# 查看當(dāng)前Branch中已經(jīng)有那些改動(dòng)已經(jīng)被合并到Trunk中
svn mergeinfo svn://branch/path
# cd trunk
# 查看Branch中那些改動(dòng)還未合并
svn merginfo svn://branch/path --show-revs eligible
merge分支B到分支A
1
2
3
4
5step1: Checkout URL A
# cd branch A
step2: merge URL B to your workingcopyof A
svn merge -r10:HEAD http://branch-b .
step3: Commit A
沖突提示
1
2
3
4
5
6(p) postpone? ? ? ? ? 暫時(shí)推后處理生兆,我可能要和那個(gè)和我沖突的家伙商量一番
(df) diff-full? ? ? ? 把所有的修改列出來混驰,比比看
(e) edit? ? ? ? ? ? ? 直接編輯沖突的文件
(mc) mine-conflict? ? 如果你很有自信可以只用你的修改,把別人的修改干掉
(tc) theirs-conflict? 底氣不足,還是用別人修改的吧
(s) show all options? 顯示其他可用的命令
' '沒有修改栖榨。
A被添加到本地代碼倉庫昆汹。
C沖突。
D被刪除婴栽。
I被忽略满粗。
M被修改。
R被替換愚争。
X外部定義創(chuàng)建的版本目錄映皆。
?文件沒有被添加到本地版本庫內(nèi)。
!文件丟失或者不完整(不是通過svn命令刪除的文件)轰枝。
~受控文件被其他文件阻隔捅彻。
U服務(wù)器收到文件更新了
G本地文件以及服務(wù)器文件都已更新,而且成功的合并了
git是一款開源的分布式版本控制工具。
在世界上所有的分布式版本控制工具中鞍陨,git是最快步淹、最簡(jiǎn)單、最流行的诚撵。
作者是Linux之父:Linus Benedict Torvalds缭裆。
當(dāng)初開發(fā)git僅僅是為了輔助Linux內(nèi)核的開發(fā)(管理源代碼)。
工作區(qū)(Working Directory):倉庫文件夾里除.git目錄以外的內(nèi)容寿烟。
版本庫(Repository):.git目錄澈驼,用于存儲(chǔ)記錄版本信息。
暫存區(qū)(stage)
分支(master):git自動(dòng)創(chuàng)建的第一個(gè)分支筛武。
HEAD指針:用于指向當(dāng)前分支缝其。
git add:將工作區(qū)文件修改添加到暫存區(qū)。
git commit:將暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支(提交區(qū))徘六。
git push:將提交區(qū)內(nèi)容 推送到服務(wù)器上氏淑。
git pull:從服務(wù)器上更新文件。
1.git clone:從服務(wù)器上克隆(下載)最新的代碼到本地硕噩。
2.git init:初始化本地倉庫(在當(dāng)前目錄新建代碼庫)假残,也可以git init Desktop/GitCode(在指定位置創(chuàng)建代碼庫) ,如果使用了git clone不用使用此命令炉擅。
3.git config:配置用戶名和郵箱辉懒。
1
2
3
4
5
6
7
8
9
10git config --global user.name"GO_ln"
git config --global user.email"xxx @xx.com"
```
-4.`add`:將工作區(qū)的文件提交到暫存區(qū)。
```objc
// 添加指定文件
git add GitTest/GitTest/ViewController.m
// 添加本地庫所有文件
git add .
5.git commit:提交信息谍失。
1
2
3
4
5
6
7
81.git commit -m 將暫存區(qū)的內(nèi)容提交到提交區(qū)
// 提交所有
git commit -m"日志"
// 提交某一個(gè)文件
git commit GitTest/GitTest/ViewController.m -m"修改VC"
2.把工作區(qū)中的內(nèi)容提交到暫存區(qū)并從暫存區(qū)中提交到提交區(qū)
git commit -am “提交信息”
6.git status:查看當(dāng)前 git 的狀態(tài)眶俩。
7.git push:將提交區(qū)內(nèi)容 推送到服務(wù)器上。
8.checkout:撤銷某次提交的某個(gè)文件快鱼。
1
git checkout8989920311bacb3f4e3ced7f82ab75ca47c318c7 GitTest/GitTest/ViewController.m
9.revert:撤銷某一次提交颠印。
1
git revert8989920311bacb3f4e3ced7f82ab75ca47c318c7
10.checkout HEAD:放棄本地某一文件的修改纲岭。
1
git checkout HEAD GitTest/GitTest/ViewController.m
11.git reset:回退到某個(gè)版本并保存未追蹤的改動(dòng)。(通過log來查詢)
1
git reset8989920311bacb3f4e3ced7f82ab75ca47c318c7
12.git reset --hard HEAD:放棄本地全部修改线罕。
13.git reset --keep:回退到某個(gè)版本并保存未提交的改動(dòng)止潮。
1
git reset --keep8989920311bacb3f4e3ced7f82ab75ca47c318c7
14.log:查看提交日志。
15.git show:查看每次提交的具體內(nèi)容钞楼。
16.diff:查看追蹤文件的差異喇闸。
1
2
3
4// 查看追蹤文件的差異
git diff
// 查看某一文件的差異
git diff GitTest/GitTest/ViewController.m
17.rm:刪除文件。
1
git rm GitTest/GitTest/ViewController.m
18.mv:修改某一個(gè)文件的名字询件。
1
2// 注意燃乍,路徑要對(duì)應(yīng),否則會(huì)自動(dòng)移動(dòng)
git mv GitTest/GitTest/ViewController.m GitTest/GitTest/View.m
19.blame:查看文件被誰修改宛琅。
1
git blame GitTest/GitTest/ViewController.m
「Git–>branch & tag & remote」分支刻蟹、標(biāo)簽和遠(yuǎn)程
branch:分支。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31// 查看本地分支
git branch
// 查看遠(yuǎn)程分支
git branch -r
// 查看遠(yuǎn)程和本地分支
git branch -a
// 創(chuàng)建本地分支嘿辟,但是不切換
git branch branch1
// 新建一個(gè)分支并切換
git checkout -b branch2
// 新建一個(gè)分支舆瘪,指向指定commit
git branch branch38989920311bacb3f4e3ced7f82ab75ca47c318c7
// 新建一個(gè)分支,與指定的遠(yuǎn)程分支建立追蹤關(guān)系
git branch --track branch4 origin/master
// 切換到指定分支仓洼,并更新工作區(qū)
git checkout branch4
// 切換到上一個(gè)分支
git checkout -
// 建立追蹤關(guān)系,在現(xiàn)有分支與指定的遠(yuǎn)程分支之間
git branch --set-upstream branch3 origin/master
// 合并指定分支到當(dāng)前分支
git merge branch2
// 選擇一個(gè)commit堤舒,合并進(jìn)當(dāng)前分支
git cherry-pick8989920311bacb3f4e3ced7f82ab75ca47c318c7
// 刪除分支
git branch -d branch1
// 刪除遠(yuǎn)程分支
git push origin --delete branch1
git branch -dr branch1
// 將當(dāng)前分支push到指定遠(yuǎn)程分支
git push origin HEAD:branch1
tag:標(biāo)簽色建。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16// 列出所有tag
git tag
// 新建一個(gè)tag在當(dāng)前commit
git tag1
// 新建一個(gè)tag在指定commit
git tag28989920311bacb3f4e3ced7f82ab75ca47c318c7
// 刪除本地tag
git tag -d1
// 查看tag信息
git show2
// 提交所有tag
git push --tags
// 刪除遠(yuǎn)程tag
git push origin --delete tag2
// 新建一個(gè)分支,指向某個(gè)tag
git checkout -b [branch] [tag]
remote:遠(yuǎn)程舌缤。
1
2
3
4
5
6
7
8
9
10
11
12// 查看遠(yuǎn)程庫的地址列表
git remote -v
// 查看這個(gè)遠(yuǎn)程庫的信息
git remote show origin
// 從遠(yuǎn)程庫更新所有的信息到本地箕戳,但是不合并
git fetch origin
// 從遠(yuǎn)程庫更新所有的信息到本地,但是不合并并清理已刪除的遠(yuǎn)程分支
git fetch -p origin
// 從遠(yuǎn)程庫更新數(shù)據(jù)并立即合并數(shù)據(jù)
git pull origin branch1
// 將本地?cái)?shù)據(jù)同步到遠(yuǎn)程庫中
git push origin? branch1
1国撵、示例:將本地代碼提交到 GitHub 上陵吸。
前期準(zhǔn)備:
cd Desktop/git(桌面文件夾)
git clone https://github.com/CustomPBWaters/liunDemo.git(倉庫的URL)
cd liunDemo(github上建的文件夾) 把要上傳的Demo放到建的桌面 git 文件夾里。
ls -a會(huì)提示下步操作介牙。
git commit -am CoreDataDemo壮虫,這里的CoreDataDemo是我本地的Demo。
1
2git add CoreDataDemo? 把工作區(qū)的內(nèi)容提交到暫存區(qū)
git commit -m CoreDataDemo? 把暫存區(qū)中的內(nèi)容提交到提交區(qū)
git status查看提交狀態(tài)环础。
這時(shí)第一次提交囚似,會(huì)讓輸入GitHub用戶名密碼。
git push將文件推送到服務(wù)器上线得。
注意:要傳得Demo項(xiàng)目中饶唤,有的含隱藏文件.git,需要?jiǎng)h除 rm -rf .git贯钩,再上傳就可以了募狂。
2办素、示例:解決沖突(手動(dòng)解決)。
打開沖突文件祸穷,刪除<<<<<<< HEAD ======= >>>>>>> branch1這三行
再修改成想要的性穿,添加,提交即可粱哼。
SVN & Git特點(diǎn)
結(jié)構(gòu)(最主要的區(qū)別)
SVN是集中式管理季二,Git是分布式管理
速度
在很多情況下,git的速度遠(yuǎn)遠(yuǎn)比SVN快
難度
SVN功能簡(jiǎn)單揭措,指令簡(jiǎn)單胯舷,入門容易。Git功能完善绊含,指令復(fù)雜桑嘶,入門簡(jiǎn)單掌握難
其他
SVN使用分支比較笨拙,git可以輕松擁有無限個(gè)分支
SVN必須聯(lián)網(wǎng)才能正常工作躬充,git支持本地版本控制工作
舊版本的SVN會(huì)在每一個(gè)目錄置放一個(gè).svn逃顶,git只會(huì)在根目錄擁有一個(gè).git
補(bǔ)充
集中式版本控制
在分布式下開發(fā)者可以本地提交。
每個(gè)開發(fā)者機(jī)器上都有一個(gè)服務(wù)器的數(shù)據(jù)庫充甚。
從穩(wěn)定可靠的角度來看以政,分布式肯定是更好的選擇。
這兩個(gè)版本控制一直持續(xù)到現(xiàn)在伴找,兩者都有其優(yōu)點(diǎn)和缺點(diǎn)盈蛮。
個(gè)人認(rèn)為兩者沒有絕對(duì)的優(yōu)勢(shì),能夠取代另一方技矮。
但是從功能上來講抖誉,Git 擁有SVN大致所有的功能,還擁有更多可靠衰倦,便捷袒炉,個(gè)性化的指令方便操作。
就剩最后一句話了樊零,沒錯(cuò)我磁,想要復(fù)雜的功能,就要承受學(xué)習(xí)的代價(jià)