iOS開發(fā)中的源代碼管理工具

<h4>源代碼管理工具的起源</h4>

  • <h5>為什么會(huì)出現(xiàn)源代碼管理工具?</h5>
    • 為了解決在軟件開發(fā)過程中,由源代碼引發(fā)的各種蛋疼繁瑣問題
  • <h5>源代碼會(huì)引發(fā)哪些問題?</h5>
    • 無法后悔:做錯(cuò)了一個(gè)操作后,沒有后悔藥可吃
    • 版本備份:費(fèi)空間、費(fèi)時(shí)間
    • 版本混亂:因版本備份過多造成混亂,難于找回正確的想要的版本
    • 代碼沖突:多人操作同一文件(團(tuán)隊(duì)開發(fā)中常見問題)
    • 權(quán)限控制:無法對(duì)源代碼進(jìn)行精確的權(quán)限控制
    • 追究責(zé)任:出現(xiàn)了嚴(yán)重的BUG,無法得知是誰干的

<h4>源代碼管理工具的作用</h4>

  • 能追蹤一個(gè)項(xiàng)目從誕生一直到定案的過程
  • 記錄一個(gè)項(xiàng)目的多有內(nèi)容變化
  • 方便地查閱特定版本的修訂情況
  • ... ...

<h4>常見的源代碼管理工具</h4>

  • <h5>CVS</h5>
    • 開啟版本控制之門
    • 1990年誕生,“遠(yuǎn)古時(shí)代”的主流源代碼管理工具
  • <h5>SVN</h5>
    • 全稱是Subversion,集中式版本控制之王者
    • 是CVS的接班人,速度比CVS快,功能比CVS多且強(qiáng)大
    • 在國內(nèi)使用率非常高(70%~90%)
  • <h5>GIT</h5>
    • 一款偉大的分布式源代碼管理工具
    • 目前被越來越多的開源項(xiàng)目使用
    • 不過在國內(nèi)企業(yè)尚未大規(guī)模普及

<h4>SVN</h4>

  • <h5>SVN基本操作</h5>


    SVN的基本操作.png
    • $ svn checkout:將服務(wù)器代碼完整的下載到本地
    • $ svn commit:將本地修改的內(nèi)容提交到服務(wù)器
    • $ svn update:將服務(wù)器最新的代碼下載到本地
    • *注:Checkout只需要做一次!
  • 提示:
    • 每天下班前:commit一次“可運(yùn)行版本代碼”
    • 每天上班前:update前一天所有代碼
  • <h5>SVN官方基本操作</h5>


    svn官方基本操作示意圖.png
  • <h5>SVN使用環(huán)境</h5>
  • 想要使用SVN管理源代碼,必須得有2套環(huán)境
    • <b>服務(wù)器</b>
      • 用于存儲(chǔ)客戶端上傳的源代碼
      • 可以在Windows上安裝Visual SVN Server
      • 大部分情況下,公司的開發(fā)人員不必親自搭建SVN服務(wù)器
    • <b>客戶端</b>
      • 上傳本地的源代碼到服務(wù)器,或者更新服務(wù)器的代碼到本地,保持同步
      • 可以在Mac上使用命令行、Versions、Cornerstone、Xcode
      • 開發(fā)人員就屬于客戶端這個(gè)角色

  • <h5>SVN客戶端命令行演示</h5>
    一、初始化項(xiàng)目
    • 1.項(xiàng)目經(jīng)理將服務(wù)器的已有的內(nèi)容下載到本地(演示)
      • $ svn checkout 服務(wù)器地址 --username=xxx --password=xxx
    • 2.項(xiàng)目經(jīng)理初始化項(xiàng)目(演示)
      • $ touch main.m:創(chuàng)建main.m
      • $ svn add main.m:將main.m添加到svn的管理之下
      • $ svn commit -m "xxx":將main.m上傳到服務(wù)器
    • 3.查看文件狀態(tài)(查看文件是否在svn的管理下,或者是否進(jìn)行了修改而沒有提交)
      • $ svn status
狀態(tài)說明:描述文件被添加、刪除或其他修改
' '   沒有修改
'A'   該文件已經(jīng)添加到svn的管理之下,但是該文件在本地,并未提交到服務(wù)器
'C'   沖突
'D'   被刪除
'I'   被忽略
'M'   被修改
'R'   被替換
'X'   外部定義創(chuàng)建的版本目錄
'?'   文件沒有被添加到本地版本庫中,不在svn的管理之下
'!'   文件丟失或者不完整(不識(shí)別該文件)
'~'   受控文件被其他文件阻隔
'U'   更新最新的代碼到本地(本地有文件的情況下)
'G'   產(chǎn)生沖突后,更新操作去解決沖突,相當(dāng)于進(jìn)行合并
  • 4.張三加入開發(fā)
    • 1>將服務(wù)器所有的內(nèi)容下載到本地
      $ svn checkout 服務(wù)器地址 --username=xxx --password=xxx

    • 2>開始開發(fā)
      $ touch person.h person.m:創(chuàng)建person類
      $ svn commit -m "創(chuàng)建了person類"

    • 3>經(jīng)理更新代碼
      $ svn update:更新服務(wù)器最新的代碼(如果該文件在本地不存在,則下載,如果本地存在,則更新)

  • 5.命令行的簡(jiǎn)寫
    • svn checkout -> svn co
    • svn status -> svn st
    • svn commit -> svn ci
    • svn update -> svn up
  • 6.版本回退
    $ svn revert 文件名(person.h):將本地新增的內(nèi)容(沒有提交到服務(wù)器),刪除
    $ svn update -r版本號(hào):先回退到某個(gè)版本,觀察下,該版本是否是不想要的那個(gè)版本,示范:svn update -r6
    $ svn update:更新到最新的版本
    $ svn merge -r版本號(hào)(hight):版本號(hào)(low) 文件名:示范:svn merge -r7:6 person.h(本地)
    *注意:如果本地版本號(hào)低于服務(wù)器版本號(hào),那么不能提交
    $ svn commit -m "回退到版本x"(服務(wù)器)
  • 7.刪除文件
    $ svn remove 文件名:示范:svn remove person.m,svn remove -> svn rm(縮寫)
  • 8.查看版本信息
    $ svn update:更新服務(wù)器最新的內(nèi)容
    $ svn log:查看版本信息
  • 9.公司常用的命令
    $ svn update:更新
    $ svn commit -m "注釋":將本地的代碼提交到服務(wù)器

二、李四加入開發(fā)(新員工)
1>需要想項(xiàng)目經(jīng)理要一些東西

  • 和項(xiàng)目經(jīng)理要服務(wù)器地址以及賬號(hào)地址
  • 需求文檔:有什么需求,做什么樣的功能
  • 接口文檔:詳細(xì)的記錄服務(wù)器所有的功能
  • 效果圖:界面到底長(zhǎng)什么樣子
    2>將服務(wù)器已有的內(nèi)容下載到本地
  • $ svn checkout 服務(wù)器地址 --username=xxx password=xxx
    3>代碼沖突(out of date:過期/本地版本號(hào)低于服務(wù)器的版本)
  • (df) diff-full:在命令行中展示所有的不同
  • (e) edit:在命令行中來編輯沖突
  • (mc) mine-conflict:用我本地的代碼來覆蓋服務(wù)器的代碼
  • (tc) theirs-conflict:用服務(wù)器的代碼來覆蓋我的代碼
  • (p) postpone:延遲解決沖突,展示所有沖突的文件,手動(dòng)解決沖突 -> $ svn resolved 文件名(person.h)

*注意:如何避免沖突

  • 1>盡量在修改文件之前,先update
  • 2>如果修改公共文件,最好跟同事說一聲,讓它先別修改,修改完之后,讓他更新>>

  • <h5>SVN圖形化界面工具</h5>
  • 1.項(xiàng)目經(jīng)理初始化項(xiàng)目
    • 1>項(xiàng)目經(jīng)理將服務(wù)器已有的內(nèi)容下載到本地
      • 記住format的選擇 -> 1.7(最高)
    • 2>需要忽略的文件
      • xcuserdata
        • xcode會(huì)默認(rèn)記錄之前停留文件,下次打開依然停留在該文件,這個(gè)不需要共享
        • xcode會(huì)默認(rèn)記錄之前目錄的打開狀況,同事不需要共享
        • 斷點(diǎn)信息,不需要進(jìn)行共享
  • 2.在xcode中使用svn的注意點(diǎn)
    • 1>如果使用到靜態(tài)庫需要特別注意,必須使用命令行將靜態(tài)庫添加到svn的管理之下
    • 2>如果使用到了storyboard也需要特別注意
      • 如果能使用xib,盡量使用xib
      • 如果在項(xiàng)目當(dāng)中使用到了storyboard,盡量保證只有一個(gè)人在操作storyboard
    • 3>checkout的方式
      • 使用命令行
      • 使用cornerstone(圖形化界面工具)
      • Xcode
    • 4>公司開發(fā)技巧(避免沖突)
      • 盡量寫一些代碼就提交到服務(wù)器,實(shí)時(shí)跟服務(wù)器的代碼保持同步

  • <h5>目錄規(guī)范</h5>
  • 規(guī)范項(xiàng)目的svn目錄結(jié)構(gòu)一般有3個(gè)文件夾
    • trunk:主干,當(dāng)前開發(fā)項(xiàng)目的主目錄
    • branches:分支目錄,添加非主線功能時(shí)使用,開發(fā)測(cè)試之后,可以合并到主干項(xiàng)目中
    • tags:標(biāo)記目錄,通常作為重大的版本的備份

<h4>Git</h4>

  • <h5>什么是git?</h5>
    • git是一款開源的分布式版本控制工具
    • 在世界上所有的分布式版本控制工具中,git是最快、最簡(jiǎn)單、最流行的
  • <h5>集中式版本控制</h5>


    集中式版本控制.png
  • <h5>分布式版本控制</h5>


    分布式版本控制.png
  • <h5>git和svn的簡(jiǎn)單對(duì)比</h5>
    • 速度:在很多情況下,git的速度遠(yuǎn)遠(yuǎn)比svn快
    • 結(jié)構(gòu):svn是集中式管理,git是分布式管理
    • 其他:
      • svn使用分支比較笨拙,git可以輕松擁有無限分枝
      • svn必須聯(lián)網(wǎng)才能正常工作,git支持本地版本控制工作
      • 就版本的svn會(huì)在每一個(gè)目錄放置一個(gè).svn,git只會(huì)在根目錄擁有一個(gè).git
  • <h5>svn的工作流程</h5>


    SVN的工作流程.png

  • 分布式和集中式的最大區(qū)別在于:在分布式下
    • 開發(fā)者可以本地提交
    • 每個(gè)開發(fā)者機(jī)器上都有一個(gè)服務(wù)器的數(shù)據(jù)庫

  • <h5>git的工作流程</h5>


    git的工作流程.png
  • <h5>git的使用</h5>
  • 跟svn一樣,你可以通過命令行敲指令或者圖像界面客戶端使用git
  • 在Mac上,比較好用的git圖形界面客戶端有
  • 幾個(gè)專用名詞的譯名:
    • Workspace : 工作區(qū)
    • Index/Stage : 暫存區(qū)
    • Repository : 本地倉庫
    • Remote : 遠(yuǎn)程倉庫
  • <h5>Git的工作原理</h5>
  • 如果想了解git的工作原理,有幾個(gè)核心概念必須知道
    • 工作區(qū)(Working Directory):倉庫文件夾里除了.git目錄以外的內(nèi)容(項(xiàng)目所在的文件目錄)
    • 版本庫(Repository):工作區(qū)又一個(gè)隱藏目錄文件.git目錄(可通過命令 ls -ah 查看隱藏文件)這就是Git的版本庫,用于存儲(chǔ)記錄版本信息
    • 暫緩區(qū)(stage)
    • 分支(master):git自動(dòng)創(chuàng)建的第一個(gè)分支
    • HEAD指針:用于指向當(dāng)前分枝
  • <h5>Git的命令行演示</h5>
  • 0.安裝Git
    • $ brew install git :Mac
    • $ sudo apt-get install git-core or $ sudo apt-get install git :Ubuntu or some linux OS


  • 1.如果使用Git,必須給Git配置用戶名和郵箱
    • 給當(dāng)前的git倉庫配置用戶名和郵箱
    • $ git config user.name "Vincent"
    • $ git config user.email "vn_vincent@outlook.com"
    • 給git配置全局的用戶名和郵箱
    • $ git config --global user.name "Vincent"
    • $ git config --global user.email "vn_vincent@outlook.com"


  • 2.新建代碼庫
    • $ mkdir demo:建立目錄
    • $ cd demo:進(jìn)入demo目錄
    • $ git init :創(chuàng)建一個(gè)本地倉庫
    • $ git remote add origin gitAddress :本地庫“關(guān)聯(lián)”遠(yuǎn)程庫
    • $ Git remote remove origin :取消本地目錄下關(guān)聯(lián)的遠(yuǎn)程庫

  • $ git clone gitAddress :從遠(yuǎn)程倉庫克隆項(xiàng)目代碼
  • $ git clone -b C gitAddress :從遠(yuǎn)程倉庫克隆“指定分支C”上的代碼
  • $ git pull origin master:把遠(yuǎn)端“origin”節(jié)點(diǎn)的“master”拉回本機(jī)且進(jìn)行合并


  • 3.初始化項(xiàng)目
    • $ touch main.m:創(chuàng)建了main.m
    • $ git add main.m:將main.m添加到暫緩區(qū)(staging area)
    • $ git commit -m "初始化項(xiàng)目":將在暫緩區(qū)的所有內(nèi)容提交到本地版本庫,并清空暫緩區(qū)
    • $ git push -u origin master


  • 4.增加/刪除文件
    • $ git add [file] :將制定的文件添加到暫存區(qū)
    • $ git add . :添加當(dāng)前目錄下的所有文件
    • $ git add -p :添加每個(gè)變化前,都會(huì)要求確認(rèn);對(duì)于同一個(gè)文件的多處變化,可以實(shí)現(xiàn)分次提交
    • $ git add -u :暫存修改和刪除的文件,不包括新增的文件
    • $ git add -A :暫存所有的文件,包括新增的,修改和刪除的文件。
    • $ git rm [file1] [file2] ... :刪除工作區(qū)為難,并且將這次刪除放入暫存區(qū)
    • $ git rm -cached [file1] [file2] :(說法1: 刪除本地倉庫文件,但不會(huì)刪除文件);(說法2: 停止追蹤指定文件,但該文件回保留在工作區(qū))
    • $ git mv [file-original] [file-renamed] :改名文件,并且將這個(gè)改名放入暫存區(qū)
      *注意:添加的文件或者修改的文件都要通過add命令將該文件添加到暫緩區(qū)


  • 5.代碼提交
    • $ git commit -m "first commit" :提交暫存區(qū)刀倉庫區(qū)
    • $ git commit [file1] [file2] ... -m [message] :提交暫存區(qū)的指定文件到倉庫區(qū)
    • $ git commit -a :提交工作區(qū)自上次commit之后的變化,直接到倉庫區(qū)
    • $ git commit -am:自動(dòng)把所有已經(jīng)跟蹤過的文件暫存起來一并提交,從而跳過$ git add步驟,參數(shù) -am 也可寫成 -a -m
    • $ git commit -v :提交時(shí)顯示所有diff(擴(kuò)展)消息
    • $ git commit -p:commit文件的一部分,適合工作量比較大的情況。之后,git會(huì)對(duì)這塊修改彈出一個(gè)提示,詢問你是否stage,按y/n來選擇是否commit這塊修改,?可以查看其他操作的說明
    • $ git commit --amend:最終只會(huì)有一次提交,第二次提交將代替第一次提交的結(jié)果。其使用場(chǎng)景:適用于提交完發(fā)現(xiàn)落掉幾個(gè)文件沒添加,或者提交信息寫錯(cuò)的情況
    • $ git commit --amend [file1] [file2] ... :重做上一次commit,并包括指定文件的新變化
    • $ git commit --amend -m [message] :使用一次新的commit,代替上一次提交;如果代碼沒有任何新改變,則用來改寫上一次commit的提交信息
    • $ git commit --amend --reset-author:在上一次commit之后想重新更新一下時(shí)間。amend實(shí)際上修改了上一個(gè)commit。所以如果已經(jīng)push了上一個(gè)commit,請(qǐng)盡量不要amend。如果一定要amend已經(jīng)push了的commit,請(qǐng)確保這個(gè)commit所在的branch只有你一個(gè)人在使用(負(fù)責(zé)會(huì)給其他人帶來災(zāi)難),然后在amend之后使用 $ git push -force。只要多加小心,該命令貌似沒什么卵用


  • 6.分支
    • $ git branch A :創(chuàng)建分支
    • $ git checkout -b A :創(chuàng)建分支A,并且切換到A分支上
    • $ git checkout B :切換到B分支上
    • $ git branch -a :查看所有本地分支和遠(yuǎn)程分支
    • $ git merge B :合并指定分支B到當(dāng)前分支
    • $ git branch -d B :刪除分支
    • $ git push origin --delete B :刪除遠(yuǎn)程分支B
    • $ git branch -dr [remote / branch] :也是刪除遠(yuǎn)程分支
    • $ git push origin 本地分支A : 遠(yuǎn)程分支A將本地分支push到遠(yuǎn)程分支,并且命名遠(yuǎn)程分支為A
    • $ git fetch origin :同步遠(yuǎn)程倉庫
    • $ git push -u origin master :關(guān)聯(lián)后,使用該命令第一次推動(dòng)master分支的所有內(nèi)容,后續(xù)在推送的時(shí)候就可以省略后面三個(gè)參數(shù),其中u代表上游(upstream)的意思
    • $ git push --set-upstream origin A:git提示使用此命令


  • 7.撤銷
    • $ git checkout --文件 :恢復(fù)暫存區(qū)的指定文件到工作區(qū)(丟棄工作區(qū)的修改,包括修改后還沒有放到暫存區(qū)增加到暫換區(qū)后又作了修改兩種情況。總之,讓該文件會(huì)到最后一次$ git commit$ git add之后的狀況。注意:沒有-,就變成了切換分支的命令了

    • 在還沒有add的時(shí)候
    • $ git checkout 那個(gè)路徑下的文件夾或者文件名 :(就能撤銷未添加的修改)
    • 如果已經(jīng)add過的文件:
    • $ git reset HEAD 那個(gè)路徑下的文件夾或者文件名 :(就能回到未添加的狀態(tài)),然后再用$ git checkout [file]方法撤銷修改
  • 注意:如果你把某個(gè)文件刪除了,或者是新添加的文件,都不會(huì)在恢復(fù)或者去掉,但是會(huì)把文件中的添加的代碼去掉

  • 如果已經(jīng)commit過的文件:
  • $ git reset -hard HEAD^ :那么如果要回退到上上個(gè)版本只需把HEAD^改成HEAD^^以此類推。那如果要回退到前100個(gè)版本的話,使用上面的方法肯定不方便,我們可以使用下面的簡(jiǎn)單指令操作:$ git reset -hard HEAD~100 即可
  • 不過還有一種比較實(shí)用的方法:
  • $ git reset -hard [你要回退的版本號(hào)] :這樣就能直接回退到你置頂?shù)哪且淮翁峤?/li>

  • $ git reflog :可獲取到每次提交的版本號(hào)

  • 已經(jīng)push過的
  • 粗暴的方法:(只需兩行命令)
  • $ git reset -hard 1243ad3(commit唯一標(biāo)識(shí)) 或者$ git checkout (commit唯一標(biāo)識(shí) 前7位)
  • $ git push origin HEAD -force :(強(qiáng)行push)

  • +7.改寫提交
    本地端的歷史記錄狀態(tài).png

    $git rebase -i HEAD~~:使用rebase -i命令選擇要修改的提交
  • 預(yù)設(shè)文字編輯器會(huì)開啟從HEAD到HEAD~~的提交,如下圖顯示內(nèi)容
pick 9a54fd4 添加commit的說明
pick 0d4a808 添加pull的說明

# Rebase 326fc9f..0d4a808 onto d286baa
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

將第二行的“pick”改為“squash”,存儲(chǔ)后并推出,由于合并后要提交,所以編輯器會(huì)提示您編輯這個(gè)最新的提交訊息,請(qǐng)編輯訊息后存儲(chǔ)并提出,
這樣,兩個(gè)提交就合并成一個(gè)提交了,請(qǐng)使用log命令確認(rèn)歷史記錄

修改后master分支內(nèi)容.png



  • 8.查看文件狀態(tài)
    • $ git status
    • 紅色:該文件被添加或者被修改,但是沒有添加到git的暫緩區(qū)
    • 綠色:該文件在暫緩區(qū),但是沒有提交到本地版本庫


  • 9.給命令行起別名
    • $ git config alias.st "status"
    • $ git config alias.ci "commit -m"
    • $ git config --global alias.st "status"


  • 10.查看版本信息
    • $ git log:-> 版本號(hào)是由sha1算法生成的40位哈希值
    • $ git log -p -2:除顯示基本信息之外,還顯示每次提交的內(nèi)容差異,-2意思是僅顯示最近兩次提交。特別適用于進(jìn)行代碼審查,或者快速瀏覽某個(gè)搭檔提交的commit所帶來的變化
  • $ git log --graph:查看分支合并圖
  • $ git reflog:-> 可以查看所有版本會(huì)退的操作(比git log功能更強(qiáng)大)

  • 11.版本回退:
    • $ git reset --hard HEAD:回到當(dāng)前版本
    • $ git reset --hard HEAD^:回到上一個(gè)版本
    • $ git reset --hard HEAD^^:回到上上個(gè)版本
    • $ git reset --hard HEAD~100:回到前100個(gè)版本
    • $ git reset --hard 版本號(hào)(前5位)
  • 12.給log起別名:
    • $ 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"

  • git add和git commit的原理
    • $ git add:把文件修改或者新添加的文件添加到暫緩區(qū)
    • $ git commit:把暫緩區(qū)的所有內(nèi)容提交到當(dāng)前分枝

  • <h5>Git常見問題</h5>
    • 在使用git對(duì)源代碼進(jìn)行push到遠(yuǎn)程倉庫的時(shí)候可能會(huì)出錯(cuò),信息如下:


      Snip20170505_1.png
    • 此時(shí)很多人會(huì)嘗試下面的命令把當(dāng)前分支上傳到master分支上:$ git push -u origin master但是任然沒有解決問題。
    • 出現(xiàn)錯(cuò)誤的主要原因是github/gitlab中的某些文件不在本地代碼庫目錄中,可以通過如下命令進(jìn)行代碼合并【注:pull=fetch+merge】:git pull --rebase origin master,如上方法,即可解決err問題。
  • 注意:git和svn不同,僅僅跟蹤文件的變動(dòng),不跟蹤目錄,所以,一個(gè)空目錄,如果里面沒有文件,即便 $ git add 這個(gè)目錄,另外在別處 checkout 的時(shí)候,是沒有這個(gè)空目錄的。
    • 只跟蹤文件變化,不跟蹤目錄,這么設(shè)計(jì)是有原因的。但這會(huì)帶來一些小麻煩。有時(shí)候,確實(shí)需要在代碼倉庫中保留某個(gè)空目錄。比如測(cè)試時(shí)需要用到的空目錄。下面來看看如何解決。
      1. 目錄是空的:
      • 這種情況下只需要在目錄下創(chuàng)建 .gitkeep 文件,然后在項(xiàng)目的 .gitignore 中設(shè)置不忽略 .gitkeep就可以了
      • .gitkeep是一個(gè)約定俗成的文件名并不會(huì)嗲來特殊規(guī)則
      1. 目錄中一定存在文件
      • 這就需要首先在根目錄中設(shè)置 !.gitignore,然后在目標(biāo)目錄也創(chuàng)建一個(gè) .gitignore文件,并在文件中設(shè)置
*
!.gitignore

git在使用中遇到的問題以及注意點(diǎn):
1.由于在項(xiàng)目中一般為多人開發(fā),所以在使用git的時(shí)候一定要注意:

  • 在更改項(xiàng)目之前,一定要記得先pull項(xiàng)目到最新的版本

  • 如果本地有做項(xiàng)目備份,在commit->pull->push的時(shí)候確認(rèn)是否在備份分支做的操作,如果是,請(qǐng)注意,一定要切回主分支然后merge備份分支的內(nèi)容,

  • <h5>Git的共享版本庫</h5>

    • git服務(wù)器的搭建非常繁瑣(linux)
    • 可以把代碼托管到(GitHub/GitLab/OSChina)
    • 一個(gè)文件夾也可以做共享版本庫
    • 一個(gè)U盤也可以做共享版本庫,詳見:把Git Repository建到U盤上去
  • 1.一個(gè)文件夾作為共享版本庫

    • $ git init --bare
  • 2.將共享版本庫的所有內(nèi)容下載到本地

    • $ git clone 共享版本庫地址
  • 3.刪除忽略文件

    • $ touch .gitignore -> GitHub -> 搜索“.gitignore” -> 選擇*最多的 -> 找到Object-C,復(fù)制下來
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore

## Build generated
build/
DerivedData/

## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata/

## Other
*.moved-aside
*.xccheckout
*.xcscmblueprint

## Obj-C/Swift specific
*.hmap
*.ipa
*.dSYM.zip
*.dSYM

# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/

# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts

Carthage/Build

# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
# screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/#source-control

fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output

# Code Injection
#
# After new code Injection tools there's a generated folder /iOSInjectionProject
# https://github.com/johnno1962/injectionforxcode

iOSInjectionProject/
  • 4.版本回退
    • $ git reset --hard HEAD^:回到上一個(gè)版本(張三)
    • $ git push -f:強(qiáng)制上傳至共享版本庫
    • $ git reset --hard HEAD^:回到上一個(gè)版本(經(jīng)理)
  • <h5>Git的版本備份</h5>
  • 1.假設(shè)Xian1.0版本開發(fā)完畢,將1.0版本上傳到AppStore,對(duì)1.0版本進(jìn)行備份(打上標(biāo)簽)
    • $ git tag -a Xian1.0 -m "這是Xian1.0版本"
    • $ git tag
  • 2.需要將標(biāo)簽push到共享版本庫
    • $ git push origin Xian1.0
  • 3.開始Xian2.0版本的開發(fā)
  • 4.發(fā)現(xiàn)Xian1.0版本有bug,在經(jīng)理的文件夾下面創(chuàng)建一個(gè)文件夾,用于修復(fù)bug,將共享版本庫所有內(nèi)容clon
    • $ git clone
  • 5.將當(dāng)前的代碼轉(zhuǎn)為Xian1.0標(biāo)簽,創(chuàng)建分枝,并切換到該分枝
    • $ git checkout Xian1.0:轉(zhuǎn)為1.0標(biāo)簽
    • $ git checkout -b Xian1.1fixBug:創(chuàng)建分枝,并切換到該分枝
  • 6.在分支中修復(fù)bug,上傳到AppStore,將修復(fù)好的版本,打上tag,并上傳至共享版本庫
    • $ git tag -a Xian1.1 -m "這是修復(fù)了1.0bug的1.1版本"
    • $ git push origin Xian1.1
  • 7.跟當(dāng)前正在開發(fā)的2.0版本進(jìn)行合并
    • source Control -> pull -> Xian1.1fixBug
  • 8.刪除分支
    • $ git branch:查看當(dāng)前在哪個(gè)分支
    • $ git branch -r:查看本地版本庫的分支
    • $ git branch -d Xian1.1fixBug:刪除本地分支
    • $ git branch -r -d origin/Xian1.1fixBug:刪除本地版本庫分支
    • $ git push origin --delete Xian1.1fixBug

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容