GIT
GIT簡單介紹
GIT:是一款開源的分布式版本控制工具
在所有的分布式的版本控制工具中,git是最快、最簡單、最流行的
-
git起源
- 作者:Linux之父 ,Linux Benedict Torvalds,2005年
- 開始Linux是用Bitkeeper管理的,開發git僅僅是為了輔助Linux內核的開發(管理源代碼),10天的時間就把git寫完了,第一次導入到git的代碼大約有5000萬行的代碼
-
git現狀
- 在國外已經非常普及
- 越來越多的開源項目已經轉移到git上面
- 比如:php
-
其他版本控制工具
-
CVS
- 最早的開源、免費的集中式版本控制工具
- 自身設計有問題,會造成提交文件不完整,版本庫莫名其妙的損害
-
SVN
- 修正了CVS的一些穩定性問題,是目前用的最多的集中式版本控制工具
-
ClearCase
- 收費的集中式版本控制工具,安裝比Windows還大,運行比蝸牛還慢
- 人傻錢多的公司,世界五百強
-
VSS
- 微軟的集中式版本控制工具,集成在Visual Studio中
- 這個工具很好用,比Xcode相對智能
-
-
集中式版本控制和分布式版本控制的區別
-
集中式版本控制
- 倉庫放在服務器端
- checkout獲得倉庫,commit提交
- 不管有多少個終端,所有的操作都需要和服務器進行交互
- 倉庫是集中式的放到服務器上,做任何操作都需要連接上服務器,沒有網絡就不能連接了,在公司里面做開發,一般是局域網,只能在公司加班,在公司才能連接服務器,才能提交
-
分布式版本控制
- 可以把在自己的電腦理解成服務器
- 共享倉庫放在一個遠程的服務器上的
- 本地電腦上也有一個倉庫,可以先把操作提交到本地的倉庫,push /pull,操作的時候可以先不用連接上服務器,可以先提交到本地倉庫,等有網絡的時候,可以一次性提交到遠程的服務器上
-
- GIT和SVN對比
- 速度:在很多情況下,git的速度遠遠比SVN塊
- 結構:SVN是集中式管理,git是分布式管理
- 其他:
- svn使用分支比較笨拙
- git可以輕松擁有無限個分支
- svn必須要聯網才能正常工作
- git支持本地版本控制工作
- 舊版本的svn會在每一個目錄放置一個.svn
- git只會在根目錄擁有一個.git
- 工作流程
- SVN
- 服務器端
- 客戶端 checkout commit update
- GIT
- 共享版本庫
- 客戶端
- clone 下載到本地
- 可以在本地修改,可以在本地提交commit,把本地的版本庫提交到共享的版本庫push
- 獲得最新的共享版本庫信息pull
- SVN
- 最大的區別在于:在分布式下開發者可以本地提交,每個開發者機器上都有一個服務器的數據庫
GIT的初始化和訪問設置
- 在本地初始化一個本地的git倉庫
- 本地創建一個文件夾GIT
- GIT文件夾里新建文件夾
- manager
- demo初始化一個本地git倉庫
- cd 來到demo路徑
- git init
- 生成了一個.git的隱藏的文件夾
- manager
- 對該git倉庫進行配置(用戶名和郵箱)
- 用戶名 $ git config user.name "manager"
- 郵箱 $ git config user.email "manager@126.com"
- 輸入命令行
- 打開config查看配置文件
- 配置一個全局的用戶名和郵箱
- 系統里面會有很多倉庫,使用全局的就不用每個倉庫都設置
- $ git config -- global user.name "xiaomage"
- $ git config -- global user.email "xiaomage@126.com"
- 打開.gitconfig
GIT倉庫項目初始化操作
- 項目經理創建一個文件main.m
- $ touch main.m
- 查看git狀態
- $ git status
- 查看是否被git管理
- 紅色:表示該文件并沒有被git倉庫管理
- 把main.m文件 提交到git倉庫的暫緩區
- 暫緩區的概念
$ git add main.m
- 查看狀態
- $ git status
- 綠色:表示該文件已經被添加到git的暫緩區中
- 注意:文件的更改必須要先添加到暫緩區里面,才能從暫緩區提交
- 先把main.m提交到本地的版本庫中
$ git commit - m "注釋" main.m
- master:表示當前是主干
- 修改文件的內容
- echo "I am Main" >>main.m
- cat main.m
- 重新查看文件狀態
$ git status
- 紅色:表示被修改modified,當前的修改,沒有在暫緩區中
- 把本地的修改提交到暫緩區中
- $ git add main.m
- 查看文件狀態
- 把暫緩區中的修改提交到本地的版本庫中
- $ git commit - m "修改了main文件"main.m
- 一個文件被修改了,一個文件被插入
- 結論:之前使用SVN的時候,只有新創建的文件才需要add操作,修改文件是不需要進行add操作的,但是在git中,不管是新創建文件,還是修改了某個文件都需要再做一次add操作,就是把修改提交到暫緩區
GIT工作原理
- 工作區(working directory)
- 倉庫文件夾里除了.git目錄以外的內容
- 版本庫(Repository)
- .git目錄,用于存儲記錄版本信息
- 暫緩區(stage)
- 分支(master):git自動創建的第一個分支
- HEAD指針:用于指向當前分支
- HEAD指向誰,誰就是當前的分支
- git add 和git comit 原理
- git add:把文件修改或者新添加的文件添加到暫緩區
- git commit :把暫緩區的所有內容提交到當前分支
GIT起別名的操作
- SVN簡寫
- update - up
- status - st
- checkout - co
- commit - ci
- remove - rm
- GIT
- GIT里面沒有簡寫
- git -- help
- git提供了更加強大的功能,可以重命名
- $ git config alias.st "status"
- 相當于status == st
- $ git config alias.ci "commit"
- commit == ci
- $ git config alias.ci "commit - m"
- commit - m == ci
- 別名可以隨便起,但是不能有中文
- 起的別名在config配置文件里面
- 上面配置的只是當前的倉庫,在其他的倉庫中這些簡寫是不可用的
- 全局的別名
- $ git config -- global alias.st "status"
GIT刪除文件
- cd
- ls -la
- 刪除文件
- 項目經理需要刪除文件
- $ git rm 文件名稱1 文件名2
- 刪除操作在工作區里面進行的
- 項目經理需要刪除文件
- 查看文件的狀態,是綠色的
- $ git status
- 綠色:該修改已經被提交到暫緩區里面,不需要add操作
- 把刪除操作提交奧本地的版本庫
- $ git commit- m "刪除文件"
- 一個文件被修改,一個文件被刪除
查看版本信息
- SVN
- log
- GIT查看版本信息(基本版)
- $ git log
- :表示沒有顯示完全,按下箭頭就可以查看后面的信息
- 版本信息里有什么內容
- 注釋
- 誰修改的
- 什么時候修改的
- commit bf78……后面的內容是版本號
- 散列計算得到的,sha
- 散列值是版本號
- 按住Q退出
- CIT查看版本信息(加強版)
- 在之前的基礎上還可以查看版本回退信息
- $ git reflog
- 更簡潔
- HEAD
- commit后面是注釋
- 最前面的是不完整的版本號,只有前七位
- 可以看到版本回退信息,直接log是看不到的
版本回退的兩種情況
- 本地倉庫修改了內容,但是修改還沒有提交到版本庫(相當于取消修改)
- $ git reset -- hard HEAD
- ls - la
- echo
- cat
- git status
- git add
- git reset -- hard HEAD
- 本地倉庫修改了內容,并且修改已經被提交到版本庫(回退到以前的版本)
$ git reset -- hard HEAD^回退到上一個版本
$ git reset --hard HEAD^^回退到上兩個版本
$ git reset -- hard HEAD ~ N 回退到上N個版本
-
$ git reset -- hard 五位數字的版本號 指向任意的版本
- 拷貝前面五位數
創建共享版本庫并初始化項目(忽略操作)
- 創建共享版本庫
- 可以安裝在服務器端 非常復雜(后臺)
- 可以安裝在一個文件夾里面
- 安裝在U盤里面(自己查看資料)
- 把git遠程倉庫,托管在一些大型的網站上面(github/oschina)
- 在桌面創建一個文件夾(路徑不能有中文), 把遠程倉庫把它安裝在該文件夾中
- 先初始化一個遠程倉庫
- 初始化本地和初始化遠程倉庫區別?
- 初始化遠程倉庫 git -- bare init
- 本地倉庫有一個.git文件,遠程的共享倉庫,沒有.git文件
- 遠程倉庫bare= true ;本地倉庫bare = faulse
- 創建一個空的文件夾(項目經理的客戶端),項目經理連接上共享版本庫,然后把共享版本庫下載到本地
- $ git clone 倉庫路徑
- 項目經理配置本地倉庫
- 設置用戶名和郵箱
- $ git config user.name "manager"
- $ git config user.email "manager@qq.com"
- 打開config文件查看
- 創建一個忽略文件,進行忽略處理
- 新建一個文件$ touch .gitignore,拷貝內容到該文件中
- github- 搜索.gitignore
- 框架 找到oc的
- 拷貝內容到創建的.gitignore文件中
- 查看文件狀態,把該文件添加到暫緩區
- git status
- git add .gitignore
- 把更改提交到本地的版本庫
- git commit - m"進行忽略操作" .gitignore
- 使用Xcode創建一個新的項目
- 已經有一個git倉庫了,不能再創建了
- 查看狀態,內部會自動做一次 添加操作
- 用Xcode創建的項目,默認會做一次add操作
- 如果一次性添加多個文件
- $ git add .
- 如果一次性添加多個文件
- 把文件提交到本地 git commit -m "項目初始化處理"
- 把本地版本庫的內容,提交到共享版本庫Server
- $ git push
- 共享版本庫是數據庫,是以數據源的方式存儲
- 張三連接上共享版本庫,下載到本地
- git clone
- 更新 pull
- 先初始化一個遠程倉庫
Xcode多人開發和沖突處理
- 項目經理
- discard all changes 取消文件修改
- pull
- 項目經理開始開發,提交commit到本地的版本庫
- push提交到共享的版本庫
- 張三
- pull
- push
-
沖突
- 項目經理和張三修改了同一行代碼
- 如果提交成功了,可能就是沒有給項目經理和張三分配用戶名和郵箱
- 解決沖突
- 張三添加了注釋,提交了
- 項目經理pull,更新獲得最新的
- 項目經理和張三修改了同一行代碼
-
git倉庫對于靜態庫的處理
- svn對于靜態庫不識別.a文件
- git不需要手動添加,內部會自動的做添加操作
把git遠程倉庫托管在github上面
注冊github
-
創建一個倉庫
- 點擊加號
- 倉庫名稱repository name
- 描述信息:description
- 開源public | 私有 private(每一月幾百元)
- initialize this repository readme 要不要裝readme文件
- 選擇要忽略的文件object-c
- 協議:MIT Licence
- 點擊后面的i,可以查看協議的具體內容
- create repository
-
初始化處理
- 連接上倉庫,把倉庫下載到本地
- clone or download
- HTTPS
- SSH:秘鑰對的方式處理的
- 公鑰放在網站上
- 私鑰放到電腦里
- 拷貝url,打開xcode,preperence,切換到賬號,把拷貝的路徑,粘貼到address上
- 用戶名和密碼是github的用戶名(郵箱)和密碼
- checkout
- next
- clone or download
- 不需要做忽略和添加操作
- 項目的初始化處理commit and push
- 連接上倉庫,把倉庫下載到本地
github刪除代碼倉庫
- commits提交的次數
- branch 分支
- releases 備份信息
- fork復制一份倉庫到本地
- pull requests 請求合并
- Wiki 公共界面,介紹框架的基本信息
- graphs 貢獻度
- 刪除:setting 最后面 delete this repository 需要輸入要刪除的倉庫的名稱
- 刪除操作是不可逆的
- issues github上面提問題
- new
- submit new issues
- github上提意見
- 注意:在使用別人框架的時候,自己修改框架,對框架的原作者發送一個請求,請求合并自己的代碼
- 復制fork到個人賬號
- 下載clone download
- check out
- 下載下來之后就可以修改框架了
- new pull requests
- 跳轉到原作者界面,請求標題,添加描述信息
- create pull request
- 請求合并的操作會在
創建項目導入已有項目
- 問題:顯示的都是?,不能識別文件,需要手動的全部添加進去
- cd 倉庫路徑
- git st 紅色
- git add .
- git st 綠色
- 能夠識別了
托管到github上SSH認證
- 秘鑰對
- SSH路徑拷貝一份,認證信息要選中SSH Keys
- Public Key
- finder - 前往 - 個人 .ssh隱藏文件 - 刪除里面的內容
- Private Key
- 如何生成公鑰和私鑰
- settings
- SSH ahd GPG keys
- generating an ssh keys
- 命令行
- 拷貝,后面改成自己的郵箱
- rsa 算法
- 保存的位置:可以不輸入
- 密碼可以不輸入
- 生成秘鑰的標識,出現一個正方形
- id_rsa
- id_rsa_pub拷貝一份到網站上
- 打開方式,文本編輯,全選拷貝
- 回到設置界面,new ssh key
- 標題可以隨便寫
- 把復制的信息粘貼到key欄
- 復制路徑,打開Xcode,偏好設置,tepe:git
認證方式:SSH 再把倉庫下載下來
github中使用tags標簽備份
- 命令行
- cd
- 查看當前有沒有備份信息
- git tag
- 對當前版本進行備份
- $ git tag - a MOMO1.0 - m"MOMO1.0"
- 把本地的提交到共享版本庫
- $ git push orgin MMO1.0
- YES
- [new tag]表示新創建了一個tag
- release 里面查看備份信息
OSChina
- 碼云
- 新建項目
- 項目名稱
- 項目介紹
- 項目語言
- GitIgnore
- 開源許可證
- 項目屬性:私有項目
- ReadMe
- 連接倉庫 HTTPS |SSH
- 拷貝路徑
- 偏好設置,倉庫
- 賬號的用戶名和密碼
- 同樣的方式生成秘鑰對