## 一. git 概述
### 1. git 簡介?
1. 什么是git?
> git是一款開源的分布式版本控制工具
> 在世界上所有的分布式版本控制工具中跃赚,git是最快、最簡單击碗、最流行的
2. git的起源?
> 作者是Linux之父:Linus Benedict Torvalds
> 當初開發(fā)git僅僅是為了輔助Linux內核的開發(fā)(管理源代碼)
3. git的現(xiàn)狀?
> 在國外已經非常普及,國內并未普及(在慢慢普及)
> 越來越多的開源項目已經轉移到git
### 2. 常見的源代碼管理工具有哪些?
> CVS
- 開啟版本控制之門
- 1990年誕生谋逻,“遠古時代”的主流源代碼管理工具
> SVN
- 全稱是Subversion塔插,集中式版本控制之王者
- 是CVS的接班人,速度比CVS快,功能比CVS多且強大
- 在國內軟件企業(yè)中使用最為普遍(70%-90%)
> ClearCase
- 收費的集中式版本控制工具几缭,安裝比Windows還大河泳,運行比蝸牛還慢
- 能用ClearCase的一般是世界500強,他們有個共同的特點是財大氣粗或者人傻錢多
> VSS
- 微軟的集中式版本控制工具年栓,集成在Visual Studio中
### 3. 集中式版本控制
**所有的代碼都集中在一塊, 統(tǒng)一進行管理**
![image](./Git_Images/集中式版本控制圖解.png)
### 4. 分布式版本控制
**在每個客戶端都有一份完整的代碼倉庫, 可以在每個客戶端自行管理**
![image](./Git_Images/分布式版本控制圖解.png)
### 5. git 和 svn的簡單對比
> 速度
在很多情況下乔询,git的速度遠遠比SVN快
> 結構
SVN是集中式管理,git是分布式管理
> 其他
SVN使用分支比較笨拙韵洋,git可以輕松擁有無限個分支
SVN必須聯(lián)網(wǎng)才能正常工作竿刁,git支持本地版本控制工作
舊版本的SVN會在每一個目錄置放一個.svn,git只會在根目錄擁有一個.git
### 6. SVN工作流程和GIT工作流程對比
- svn checkout —— git clone
svn 只下載代碼搪缨, git 會連同代碼倉庫一起下載下來
- svn commit —— git commit
svn 是提交到服務器食拜,git 中是提交到本地倉庫,需要使用push才能提交到服務器
-? svn update - git pull
都是從服務器下載最新被修改的代碼
**分布式和集中式最大的區(qū)別在于:在分布式下副编,本地有個代碼倉庫,開發(fā)者可以在本地提交; 而集中式版本控制, 只有在服務器才有一個代碼倉庫, 只能在服務器進行統(tǒng)一管理**
### 7. git工作原理
1. 概念理解
- 工作區(qū)
> 與.git文件夾同級的其他文件夾或者子文件夾
- 版本控制庫
> 暫緩區(qū)
> 分支(Git不像SVN那樣有主干和分支的概念. 僅僅存在分支,其中master分支為默認被創(chuàng)建的分支,類似于SVN中的主干)
切換分支:通過控制HEAD指針指向不同的分支,就可以切換*
**?操作原則: 所有新添加/刪除/修改的文件 必須先添加到暫緩區(qū),然后才能提交到HEAD指向的當前分支中**
### 8. git使用環(huán)境
1. 單人開發(fā)只需要一個本地庫
原因:不需要與他人共享代碼,只負責管理自己代碼即可;例如提交代碼,刪除代碼,版本控制等等
2. 多人開發(fā)時需要一個共享版本庫
共享版本庫的形式:
本地共享庫:文件夾/U盤/硬盤
遠程共享庫:自己搭建git服務器/ 托管到第三方平臺(例如github, oschina)
3. 使用環(huán)境
**?無論是單人開發(fā)還是多人開發(fā),客戶端都可以使用命令行或者圖形界面使用git**
> SourceTree
- 下載地址:http://www.sourcetreeapp.com/download/
> GitHub
- 下載地址:https://mac.github.com
- 不過它是專門為GitHub網(wǎng)站而設計的
> Xcode
- 雖然集成較好,但是只能做一些常用的簡單操作,復雜操作還要使用命令行
----
## 二. Git命令行演練-個人開發(fā)
### 0. 如何學習git指令
> git help [子命令]
> 和學習SVN指令是一樣的负甸,只不過git是通過使用指南的形式展示給用戶看(不能編輯的vim編輯器),使用q退出vim編輯器痹届,按空格進入下一頁呻待,ctrl + B 回到上一頁; /關鍵字 進行搜索
### 1. 初始化一個本地倉庫
> 原因: 管理本地代碼,修改上傳,版本回退
> 命令: git init
### 2. 配置倉庫
> 告訴git你是誰队腐?
原因: 追蹤修改記錄
命令: git config user.name “shunzi”
> 告訴git怎樣聯(lián)系你蚕捉?
原因: 多人合作開發(fā)時, 溝通交流
命令: git config user.email "shunzi@qq.com"
> 查看配置信息(.git -> config打開)
命令:? git config -l
### 3. 個人開發(fā)演練
> 創(chuàng)建文件并提交
命令:
touch main.c
git add .
git commit -m “注釋”
> 修改文件并提交
命令:
git add .
git commit -m “注釋”
> 刪除文件并提交
命令:
git rm person.h
git commit -m “注釋”
> 日志查看
命令:
git log
git reflog
> 版本回退
命令:
git reset —hard HEAD 重置到當前版本
git reset —hard HEAD^^ 重置到上上個版本
git reset ——hard HEAD2 重置到往上2個版本
git reset —hard 七位版本號 重置到指定版本::
### 5. 備注補充
1. 文件狀態(tài)(git status)
> 顏色含義
紅色: 代表被添加或者修改的文件沒有被添加到暫緩區(qū)
綠色: 代表文件在暫緩區(qū),等待提交
> 版本號的含義
版本號是一個由SHA1生成的40位哈希值
這樣做的目的是保證版本號的唯一
2. vim編輯器的使用
![image](./Git_Images/vim編輯器使用.png/)
命令模式:等待編輯命令輸入;所有輸入的內容都被當做命令來執(zhí)行
插入模式:輸入的所有內容都被顯示,并被當做文件內容處理
命令行模式:執(zhí)行待定命令(保存文件并退出vim : wq? ; 強制退出不保存: q! )
3. 日志查看配置
命令如下:
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"
4. 配置別名
git config alias.st “status”
git config alias.ci “commit -m”
5. --global的作用
可以進行全局配置,所有的版本庫共享此配置
查看全局配置(桌面前往->個人->.gitconfig
**?個人電腦上建議使用全局配置**
## 三. Git命令行演練-團隊開發(fā)
**?團隊開發(fā)必須有一個共享庫,這樣成員之間才可以進行協(xié)作開發(fā)**
### 0. 共享庫分類
> 本地共享庫(只能在本地面對面操作)
- 電腦文件夾/U盤/移動硬盤
> 遠程共享庫(可通過網(wǎng)絡遠程操作)
- 自己搭建Git服務器(**不建議**)
- 在Github上托管項目(**?建議**)
Github網(wǎng)址(https://github.com); 公開項目免費, 私有項目收費
- 在OSChina上托管項目(**?推薦**)
OSChina網(wǎng)址(https://git.oschina.net) 安全免費,在國內訪問速度快
### 1. 搭建本地共享庫
原因: 多人合作開發(fā),代碼共享
命令: git init —-bare
### 2. 經理初始化項目到本地共享庫
命令: git clone 本地代碼倉庫地址
### 3. 演示多人開發(fā)
> 創(chuàng)建文件夾manager, niuda
命令:
mkdir manager
mkdir niuda
> 分別進入到兩個文件夾從共享庫clone項目到本地
命令:
git clone 本地代碼倉庫地址
git clone 本地代碼倉庫地址
> 演練新增文件同步
命令:
touch person.h
git add .
git commit -m “創(chuàng)建person.h”
git push
git pull
> 演練修改文件同步
命令:
git add .
git commit -m “注釋”
git push
git pull
> 演練刪除文件同步
命令:
git rm filename
git commit -m “注釋”
git push
git pull
> 演練沖突解決
命令:
git pull
> 演練忽略文件
命令:
touch .gitignore
open .gitignore? 加入忽略文件名
git add .
git commit -m “注釋”
.gitignore文件配置規(guī)則
http://www.cnblogs.com/haiq/archive/2012/12/26/2833746.html
### 4. 備注筆記
> 關于忽略文件
在真實開發(fā)中,配置.gitignore文件 , 去github里面搜索gitignore 選擇OC版本的柴淘,拷貝到本地倉庫即可,記得添加到本地版本庫
> 常見問題
fetch first 代表當前文件過期,需要從遠程共享庫更新
git pull
----
## 四. Git-XCode演練-團隊開發(fā)
### 1. 搭建本地共享版本庫
命令: git init —-bare
### 2. 經理初始化項目到共享版本庫
**?注意: 添加忽略文件, 不然Xcode有可能會把沒必要的文件提交**
**?必須在使用Xcode之前把忽略文件添加進來, 因為Xcode創(chuàng)建工程時, 默認直接把所有文件添加到暫緩區(qū), 加進去之后忽略文件對其就無效了**
### 3. 牛大,牛二使用Xcode 克隆項目
### 4. 演練添加文件同步
### 5. 演練修改文件同步
### 6. 演練刪除文件同步
### 7. 演練沖突
## 五. github的使用
### 1. 托管項目到github
1. 打開github網(wǎng)站:[https://www.github.com]
2. 注冊賬號(OneShunzi)
3. 點擊創(chuàng)建新倉庫[https://github.com/new]
4. 填入項目名稱,描述等信息
5. 創(chuàng)建完成
6. 可根據(jù)生成的版本庫地址進行克隆下來進行操作
### 2. 怎樣加入合作伙伴
1. 點擊”個人” -> setting -> SSH keys -> Add SSH key
2. 將你小伙伴生成的公鑰添加進來即可.(以下是生成公鑰私鑰方法)
[https://help.github.com/articles/generating-ssh-keys/]
### 3. 怎樣將其他著名框架添加到我們的代碼倉庫?
1. 搜索到對應的框架
2. 點擊fork
3. 當項目被移到自己代碼倉庫中,就可以根據(jù)地址克隆下來進行操作
**?注意:
你可以針對此框架進行任意修改,但是僅僅作用在你的本地倉庫中的副本,對原作者項目沒有任何影響.
如果想向原作者提建議,可以直接使用,pull request操作.
提交完成后,原作者可以在pull request中看到你的提交.至于是否采納,就是原作者的意愿
----
## 六. OSChina的使用
### 1. 托管項目到OSChina
1. 打開oschina網(wǎng)站:[https://git.oschina.net]
2. 注冊賬號(OneShunzi)
3. 點擊創(chuàng)建新倉庫[https://git.oschina.net/projects/new]
4. 填入項目名稱,描述等信息
5. 創(chuàng)建完成
6. 可根據(jù)生成的版本庫地址進行克隆下來進行操作
### 2. 怎樣加入合作伙伴?
1. 點擊”管理”-\>項目成員管理-\>選擇成員權限進行創(chuàng)建
2. 或者直接只用SSH(以下是生成公鑰私鑰方法)
> 部署公鑰允許以只讀的方式訪問項目迫淹,主要用于項目在生產服務器的部署上,免去HTTP方式每次操作都要輸入密碼和普通SSH方式擔心不小心修改項目代碼的麻煩为严。
> [https://help.github.com/articles/generating-ssh-keys/]
### 3. 怎樣將其他著名框架添加到我們的代碼倉庫?
1. 搜索到對應的框架
2. 點擊fork
3. 當項目被移到自己代碼倉庫中,就可以根據(jù)地址克隆下來進行操作
**?注意:
你可以針對此框架進行任意修改,但是僅僅作用在你的本地倉庫中的副本,對原作者項目沒有任何影響.
如果想向原作者提建議,可以直接使用,pull request操作.
提交完成后,原作者可以在pull request中看到你的提交.至于是否采納,就是原作者的意愿
----
## 七. 新人服務器搭建(補充了解)
0. 新人服務器搭建概念原因?
概念: 搭建一個臨時共享版本庫, 供新人專用
原因: 防止新人剛到時敛熬,搞亂服務器上的項目
1. 新建一個文件夾,newBee第股,作為新人服務器
2. 進入文件夾 使用git init —-bare 初始化倉庫
3. 經理打開自己項目所在文件夾应民,執(zhí)行PULL ,更新到最新
4. 然后source control ->項目master -> configure 項目
> 選擇Remotes 選項 代表當前所連的遠程服務器地址
> 點擊+號 添加 將newBee文件路徑作為另外一個遠程服務器地址 file:// 協(xié)議開頭 結尾以/結尾
> Done
5. 經理將最新代碼提交到新人遠程倉庫
6. 經理分配新人服務器地址給新人
7. 新人各種折騰
8. 經理建立文件夾,從新人服務器下載代碼檢查
9. 圖解
![image](./Git_Images/新人服務器搭建.png/)
----
## 八. Git版本備份/分支管理(補充了解)
**?在git中不是通過拷貝代碼來解決備份和開啟分支的**
**?git 直接打標簽夕吻, 通過控制head指向诲锹,來回到任一版本**
### 1.版本備份
1. 建立共享庫
> 創(chuàng)建文件夾shareWeibo
> 進入文件夾后,初始化共享庫
git init ——bare
2. 經理克隆項目后開發(fā)完1.0版本,打標簽后,上傳共享庫
> 創(chuàng)建manager文件夾
> 進入文件夾后
git clone 共享庫絕對路徑
> 進入工作區(qū),配置姓名,郵箱
git config user.name “manager”
git config user.email “manager@qq.com”
> 經理創(chuàng)建文件,并修改部分代碼,提交代碼,上傳到共享庫,完成v1.0版本
touch main.c
open main.c:: 打開后寫入abc
git add .
git commit -m “完成1.0版本開發(fā)”
git push
> 經理給此版本打標簽,并將標簽上傳到共享庫
git tag -a v1.0 -m “標記1.0版本”
git push origin v1.0
> 經理繼續(xù)開發(fā)2.0版本......并提交
git add .
git commit -m “2.0部分功能”
git push
### 2. 已發(fā)布版本bug修復
**在以上步驟基礎上做以下操作**
1. 牛大克隆項目,根據(jù)1.0版本創(chuàng)建分支,修復bug
> 創(chuàng)建niuda文件夾
> 進入文件夾后
git clone 共享庫絕對路徑
> 進入工作區(qū),配置姓名,郵箱
git config user.name “niuda”
git config user.email “niuda@qq.com”
> 根據(jù)v1.0版本建立新分支v1.0fixbug并切換到此分支
git checkout v1.0 -b v1.0fixbug::
> 修復bug后提交到本地版本庫
**?注意此處提交到的是HEAD指向的分支-v1.0fixbug**
git add .
git commit -m “修復bug”
2. 牛大修復bug后,打標簽v1.1作版本備份,并上傳共享庫
git tag -a v1.1 -m “1.1版本備份”
git push origin v1.1
3. 牛大上傳整個分支到共享版本庫
git push origin v1.0fixbug
**?———至此,分支修復bug結束,下面經理要合并分支———**
4. 經理從共享庫更新代碼到本地庫
git pull
5. 經理查看當前服務器都有哪些分支
git branch -r
6. 經理切換到master分支后,將v1.0fixbug分支合并過來
git checkout master
git merge origin/v1.0fixbug -m “合并分支”
7. 經理合并完成后提交到共享庫
git add .
git commit -m “合并分支”
git push
8. 合并完成后,可以刪除共享庫的分支
git branch -r -d origin/v1.0fixbug
9. 查看版本標簽,至此結束!!
git tag