一踢俄、版本控制
版本控制,通過文檔控制記錄各個模塊的改動晴及,并給每次改動添加序號都办,用于存儲、追蹤目錄和文件的修改歷史。
二琳钉、版本控制軟件
- GIT 分布式版本控制系統(tǒng)
Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng),分布式版本控制系統(tǒng)的安全性要高很多势木,因為每個人電腦里都有完整的版本庫,即使沒有網(wǎng)絡(luò)你也可以提交變動到版本庫(因為本地就有一個完整的版本庫)歌懒,git的中心庫和SVN等傳統(tǒng)版本控制系統(tǒng)不同啦桌,它不是一切的中心(大腦),而僅僅也是一個副本及皂,它的存在只是為了方便協(xié)作開發(fā)甫男,大家方便提交變動和同步變動。但是這里說的不依賴網(wǎng)絡(luò)验烧,并不是完全不依賴網(wǎng)絡(luò)就能完成所以的事情板驳,比如讓其他開發(fā)人員拿到你的改動,所以說這里所說的不依賴網(wǎng)絡(luò)只是相對的噪窘,在沒有網(wǎng)絡(luò)的情況下笋庄,可以提交變動到本地的版本庫,但最終還是要依賴網(wǎng)絡(luò)提交變動讓其他開發(fā)人員看到倔监。一旦長時間不進(jìn)行代碼同步(不同開發(fā)者之間)直砂,很可能會產(chǎn)生變動沖突,這時候就需要人工來解決沖突浩习。
分布式静暂,去中心化,GIT在我們每個人的電腦上都有一個獨立完整的庫谱秽,我們平時上傳代碼的中央服務(wù)器和我們電腦上的庫的內(nèi)容基本上完全一樣洽蛀。
- SVN 集中式版本控制軟件
SVN是一個開放源代碼的版本控制系統(tǒng),它采用了分支管理系統(tǒng)疟赊,管理著隨時間改變的數(shù)據(jù)郊供,這些數(shù)據(jù)放置在一個中央資料檔案庫(repository)中。這個檔案庫很像一個普通的文件服務(wù)器,不過它會記住每一次文件的變動近哟。這樣你就可以把檔案恢復(fù)到舊的版本,或是瀏覽文件的變動歷史驮审。Subversion是一個通用的系統(tǒng),可用來管理任何類型的文件,其中包括了程序源碼。
集中式吉执,顧名思義就是將資源集中起來疯淫。每次修改完文件上傳到中央服務(wù)器。當(dāng)需要修改時戳玫,再從中央服務(wù)器下載下來熙掺。這也暴露出它的一個弊端,必須需要網(wǎng)絡(luò)才能從中央服務(wù)器下載下來咕宿。
版本庫是集中存放在中央服務(wù)器中币绩;
在每次操作時蜡秽,都需要從服務(wù)器獲取最新的版本;
在操作完之后类浪,都需要把自己做的推送到服務(wù)器中载城;
問題:
必須聯(lián)網(wǎng)才能工作;
網(wǎng)絡(luò)不好時费就;
三诉瓦、Git安裝
- Linux版本安裝
- 安裝
$ sudo apt-get install git
- 檢測是否安裝成功
$ git --version
四、Git常用命令速查表
五力细、GIT操作 【本地倉庫】
- 什么是版本庫
版本庫又被稱為倉庫repository睬澡,初期可以理解為一個目錄,這個目錄里面管理的文件都可以被稱為被git管理起來的眠蚂,每個文件的修改煞聪,刪除等的操作git都能進(jìn)行跟蹤。 - 設(shè)置GIT
// 后續(xù)代碼是托管到GitHub中的逝慧,所以這里直接設(shè)置成GitHub的用戶名和GitHub郵箱
$ git config --global user.email "GitHub郵箱(12345678@163.com)"
$ git config --global user.name "GitHub的用戶名(bridgeZQ)"
- 創(chuàng)建版本庫
- 切換到需要添加版本控制的目錄中
$ cd dir/
- 初始化本地倉庫
$ git init
會在對應(yīng)目錄中會看到 .git目錄昔脯,就是用來跟蹤管理的版本庫,千萬不要手動修改該目錄的文件笛臣。
- 添加本地git忽略清單 .gitignore 【說明哪些文件是不需要被管理的】
忽略規(guī)則是一行一個(根目錄和其他目錄云稚,目錄名相同時,即加上對應(yīng)路徑沈堡,如果是根目錄則是“/”)
在項目開發(fā)中静陈,有時候想把某些目錄或文件加入忽略規(guī)則中,但在清單中添加之后發(fā)現(xiàn)是無效的诞丽。即是某些文件已經(jīng)被納入了版本管理中鲸拥,則修改. gitignore是無效的。解決方法:
git add .
$ git commit -m '更新gitignore忽略清單'
最好是在項目開始時僧免,創(chuàng)建好. gitignore文件刑赶!
后續(xù)工作是先在GitHub中克隆或拉取最新版本的遠(yuǎn)程倉庫在項目開發(fā)中。
- 查看本倉庫的變更狀態(tài)
$ git status // 查看倉庫當(dāng)前的狀態(tài)
$ git status -s // 輸出簡要的變更日志
文件狀態(tài)說明:
' ' 沒有修改
'A' 被添加到本地代碼倉庫 【add】
'C' 沖突 【clash】
'D' 被刪除 【delete】
'I' 被忽略 【ignore】
'M' 被修改 【modification】
'R' 被替換 【replace】
'X' 外部定義創(chuàng)建的版本目錄
'?' 文件沒有被添加到本地版本庫內(nèi)
'!' 文件丟失或者不完整(不是通過git命令刪除的文件)
'~' 受控文件被其他文件阻隔
- 添加本地托管(暫存)文件
- 添加指定文件名的文件
$ git add index.html
- 添加通配符匹配的文件
$ git add *.js
- 添加所有未托管的文件(忽略.gitignore清單中的列表)
$ git add . // 或使用 $ git add - -all
- 提交被托管的文件變化到本地倉庫(版本庫)
$ git commit -m "提交代碼對應(yīng)的版本說明"
備注:
自動創(chuàng)建的一個分支master
注1: -m后面輸入的是本次提交的說明【就是所謂的日志】懂衩,可以輸入任意內(nèi)容角撞,當(dāng)然最好是有意義的,這樣你就能從歷史記錄里方便地找到改動記錄
注2: 再次修改文件勃痴,則重復(fù)git add和git commit命令
注3: 為什么GIT添加文件需要add、commit兩步操作热康?因為commit可以一次提交很多文件沛申,所以你可以多次add不同的文件
- 對比差異
$ git diff filename // 對比當(dāng)前版本和存儲在本地倉庫中最后一個版本的差異
- 查看提交日志
$ git log
$ git log --pretty=oneline
- 版本回退
工作原理:
每當(dāng)修改一個文件,并且使用commit提交之后姐军,其實就相當(dāng)于保存了一個快照
// 回退到上一版本
$ git reset --hard HEAD^
// 回退到上上版本
$ git reset --hard HEAD^^
// 回退到上100個版本
$ git reset --hard HEAD~100
// 指定版本回退
$ git reset - -hard xxxxxx // xxx是對應(yīng)版本的hash值前6位
// 重返未來(從上往下尋找第一個commit的操作铁材,則是未來的最新的版本)
$ git reflog // 查看歷史執(zhí)行過的git操作
$ git reset --hard xxx // 對應(yīng)的hash值
在git中尖淘,用HEAD表示當(dāng)前版本。git在歷史的版本之間來回切換著觉,使用git reset --hard commit id
- 撤銷操作
a.修改了文件內(nèi)容村生,但是還沒有添加到暫存區(qū)
$ git checkout // 查看可撤銷文件
$ git checkout -- xxx // 撤銷對應(yīng)文件,即回到最新版本
六饼丘、GIT操作 【遠(yuǎn)程倉庫】
- GitHub和Git概念區(qū)分
- git是一個工具
- github是一個網(wǎng)站
- github網(wǎng)站提供的是git服務(wù)(即可以將代碼托管到github服務(wù)器中)
- github服務(wù)是"免費(fèi)的"趁桃,但免費(fèi)服務(wù)的前提是開源(如果代碼需要閉源服務(wù),即是要收費(fèi)的)
- github創(chuàng)建代碼管理倉庫
拷貝對應(yīng)倉庫的地址(注意HTTPS或SSH方式)
- 關(guān)聯(lián)遠(yuǎn)程倉庫
- 添加遠(yuǎn)程倉庫并起名叫origin
$ git remote add origin https://github.com/cxy/Git.git(HTTPS方式)
- 查看現(xiàn)有的服務(wù)器列表
$ git remote -v
添加遠(yuǎn)程倉庫并起名(默認(rèn))叫origin肄鸽,可自行修改卫病。
- 刪除遠(yuǎn)程倉庫的關(guān)聯(lián)
// 遠(yuǎn)程倉庫的名字
$ git remote rm origin
- 推送本地倉庫內(nèi)容到遠(yuǎn)程倉庫
$ git push -u origin master // 提交到服務(wù)器中的master分支
- 拉取(獲取)遠(yuǎn)程倉庫內(nèi)容到本地倉庫
取回遠(yuǎn)程倉庫的變化,并與本地分支合并典徘。
$ git pull origin master // 從master分支中獲取代碼
一蟀苛,錯誤描述
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'git@github.com:compassblog/PythonExercise.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
二,錯誤原因
GitHub遠(yuǎn)程端添加了README.md文件后逮诲,無法再次推的主要原因是GitHub中的README.md文件不在本地代碼目錄中帜平,或者拉取不成功時。
三梅鹦,解決方法
執(zhí)行下面命令進(jìn)行代碼合并:
git pull --rebase origin master
- 克隆(下載遠(yuǎn)程倉庫)
從零開發(fā)裆甩,先有遠(yuǎn)程倉庫,之后從遠(yuǎn)程倉庫克隆帘瞭。
// 將遠(yuǎn)程服務(wù)器中代碼克隆一份到本地
$ git clone https://github.com/userName/projectName test
// 沒有指定每次淑掌,默認(rèn)即是倉庫名
$ git clone https://github.com/userName/projectName
七、HTTPS和SSH認(rèn)證方式
- HTTPS方式
- git remote add origin https://github.com/bridgeZQ.test.git
- git push -u origin master 或 git pull origin master
【每次操作都需要輸入賬號密碼】
與遠(yuǎn)程倉庫交互時蝶念,可以是HTTPS和SSH方式兩種抛腕,更多建議使用SSH方式,操作更加簡單!
- SSH方式(要進(jìn)行了SSH認(rèn)證)
- git remote add origin git@github.com:bridgeZQ/test.gti
- git push -u origin master 或 git pull origin master
創(chuàng)建的倉庫中媒殉,操作可以是HTTPS和SSH
八担敌、GitHub中SSH認(rèn)證
1.創(chuàng)建 .ssh 目錄
$ mkdir ~/.ssh
2.切換到.ssh目錄中
$ cd ~/.ssh
3.配置全局的name和email(如果已經(jīng)設(shè)置,即忽略該操作廷蓉,這是用于標(biāo)示一個人)
$ git config --global user.email "GitHub郵箱(12345678@163.com)"
$ git config --global user.name "GitHub的用戶名(bridgeZQ)"
4.生成key
$ ssh-keygen -t rsa -C "zyz@1000phone.com" // 與上面填寫的郵箱與之對應(yīng)
備注: 連續(xù)三次回車全封,密碼是設(shè)置為空
5.復(fù)制.ssh目錄中的id_rsa.pub文件內(nèi)容,即是key (當(dāng)前用戶的目錄下)
例如: home/zq/.ssh/id_rsa.pub
6.在github中添加key
View profile and more -> settings -> SSH and GPG keys -> New SSH key
備注:
不要最后的郵箱!!
ssh-rsa和KEY之間就一個空格桃犬,后面都不能出現(xiàn)空格刹悴,即是一行!
7.檢測是否添加成功
$ ssh git@github.com
提示: Hi xxx! You've successfully authenticated, but GitHub does not provide shell access. 說明設(shè)置成功
九、分支管理
- 分支的作用
開發(fā)中攒暇,準(zhǔn)備一個新的功能土匀,但需要2周時間才能完成。第一周已經(jīng)寫了50%形用,如果立即提交就轧,由于代碼沒有寫完证杭,不完整的代碼會導(dǎo)致其他人也不能干活了。如果等代碼全部寫再提交妒御,又會存在丟失每天進(jìn)度的巨大風(fēng)險解愤。
有了分支,可以避免此類問題乎莉。創(chuàng)建一個屬于自己的分支送讲,別人看不到,還繼續(xù)在原來的分支上正常工作梦鉴。而我們在自己的分支上干活李茫,想提交就提交,直到開發(fā)完畢后肥橙,在一次性合并到原來的分支上魄宏。這既安全,又不會影響到別人工作存筏。 - 特點
Git分支是與眾不同的宠互,無論創(chuàng)建、切換和刪除分支椭坚,Git在非常短的時間呃逆就能完成予跌,無論版本庫是1個文件還是1萬個文件。 - master主分支
在版本管理中善茎,每次提交券册,Git都把他們串成一條時間線(沿著時間軸添加),在Git中這個分支叫主分支垂涯,即master分支烁焙。
每次提交,master分支都會向前移動一步耕赘,這樣不斷的提交骄蝇,master分支線也越來越長。 - Git分支操作(版本庫其實就是一個時間軸)
- 查看分支(當(dāng)前分支前面會有一個*)
$ git branch
- 查看分支的日志信息
$ git branch -v
- 新建分支
$ git branch version2 // 新的分支version2(主分支是master)
- 切換分支(不同分支中操骡,就會顯示不同分支下的內(nèi)容)
// 切換分支
$ git checkout version2
// 推送分支
$ git push origin verion2
- 創(chuàng)建與切換同時進(jìn)行
$ git checkout -b version3
// 創(chuàng)建version3分支九火,并切換到version3
- 合并分支
// 假如此時操作的是在version2分支中
$ git checkout master
// 再進(jìn)行合并,即將version2中內(nèi)容合并到master分支中
$ git merge version2
// 將version2分支的工作成果合并到master分支上
// 合并完之后册招,再推送到GitHub
$ git push origin master
- 刪除分支
$ git branch -d version2 // 刪除分支version2
- 分支策略
master主分支應(yīng)該是非常穩(wěn)定的岔激,一般都是用于發(fā)布新版本,平時此分支上不干活是掰。
干活都在dev分支上鹦倚,也就是說dev分支是不穩(wěn)定的,到某個時候冀惭,例如1.0版本時震叙,再把dev分支合并到master上,在master分支發(fā)布1.0版本散休。
而你和小伙伴每個人都在dev分支上干活媒楼,每個人都有自己的分支,時不時的往dev分支上合并即可戚丸。 - 多人協(xié)作
- 推送分支
$ git push origin master
$ git push origin dev
- 抓取分支 從遠(yuǎn)程庫中clone時划址,默認(rèn)只能看到master分支內(nèi)容;
想要在dev分支上開發(fā)限府,就必須克隆origin的dev分支到本地;
$ git checkout -b dev origin/dev
實際的工作流程:先pull[抓取]夺颤,后push[推送]
git pull origin master
git pull --rebase origin master