源代碼管理

git

==========Wh.少爺===========

顯?示隱藏?文件
defaults write com.apple.finder AppleShowAllFiles -bool true

1.git簡介

  • 什么是 git?
    -- git 是一款開源的分布式版本控制工具
    -- 在世界上所有的分布式版本控制工具中井赌,git 是最快芍碧、最簡單个绍、最流行的
  • git的起源
    -- 作者是Linux之父:Linus Benedict Torvalds
    -- 當(dāng)初開發(fā)git僅僅是為了輔助Linux內(nèi)核的開發(fā)(管理源代碼)
  • git的現(xiàn)狀
    -- 在國外已經(jīng)非常普及,國內(nèi)并未普及(在慢慢普及)
    -- 越來越多的開源項(xiàng)目已經(jīng)轉(zhuǎn)移到git

2.git 和 svn的區(qū)別

  • 速度
    -- 在很多情況下,git的速度遠(yuǎn)遠(yuǎn)比SVN快
  • 結(jié)構(gòu)
    -- SVN是集中式管理,git是分布式管理
  • 其他
    -- SVN使用分支比較笨拙,git可以輕松擁有無限個(gè)分支
    -- SVN必須聯(lián)網(wǎng)才能正常工作距贷,git支持本地版本控制工作
    -- 舊版本的SVN會(huì)在每一個(gè)目錄置放一個(gè).svn柄冲,git只會(huì)在根目錄擁有一個(gè).git

3.git 工作流程

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

分布式管理


Paste_Image.png

4.git 的基本使用

  • git 的重要概念及工作原理

    • 工作區(qū)(Working Directory):倉庫文件夾里除.git目錄以外的內(nèi)容

    • 版本庫(Repository):.git目錄吻谋,用于存儲(chǔ)記錄版本信息

      • 暫緩區(qū)(stage)
      • 分支(master):git自動(dòng)創(chuàng)建的第一個(gè)分支
      • HEAD指針:用于指向當(dāng)前分支
    git add和git commit的原理
    git add :把文件修改添加到暫存區(qū)
    git commit :把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支
    
  • 學(xué)習(xí)git指令:

    • 學(xué)習(xí)git指令和SVN指令的學(xué)習(xí)其實(shí)是一樣的, 只不過展現(xiàn)的方式不太一樣现横, git是通過使用指南的方式告訴我們某一個(gè)指令如何使用
    • 這個(gè)指南其實(shí)是一個(gè)不可編輯的vim
    $ git help
    查看svn所有命令的幫助
    $ git help 子命
    
. 要退出幫助信息漓拾,按"q"

. 翻看下頁,按"空格"

. 翻看上頁戒祠,按"CTRL+B"

. 要搜索相關(guān)文字骇两,按"/"然后輸"相關(guān)文字"
  • git常規(guī)指令:
    • git status 查看文件狀態(tài)

    • git add 添加文件到“暫存區(qū)”

      • 添加之前的顏色
        紅色 代表在”工作區(qū)“
      • 添加到暫存區(qū)之后的顏色
        綠色 代碼在”暫存區(qū)“
    • git commit 文件名稱 添加文件到”本地倉庫“

      • 注意:如果沒有在commit后面加上 -m說明修改了什么, 會(huì)自動(dòng)進(jìn)入vim界面,要求我們輸入修改信息,按鍵盤上的i代表開始輸入內(nèi)容
        輸入完畢之后按 esc 然后按 :wq
        所以:如果以后在終端中提交最好在后面加上-m

      • 注意:git中的add和SVN中的add不太一樣姜盈, SVN中只需要add一次低千,而git中每次新建或者修改之后都需要重新add

    • 查看log
      查看所有版本庫日志$ git log
      查看指定文件的版本庫日志git log 文件名
      git reflog 查看所有修改信息(所有版本)

      • 注意: GIt中的版本號(hào)是一個(gè)”40位“的哈希值, 而SVN中的版本號(hào)是一個(gè)遞增的整數(shù)
   配置帶顏色的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 config alias.st status
$ git config alias.ci "commit -m"
```

個(gè)人建議:除非特殊原因馏颂,最好不要設(shè)置別名示血,否則換一臺(tái)機(jī)器就不會(huì)用了

 . 注意: git默認(rèn)沒有簡寫指令

 . 注意: 一般情況下不建議自定義簡寫指令

 . git中的簡寫稱之為起別名
  • 版本號(hào),讓我們在任意版本之間穿梭

       git reset —hard 版本號(hào)(只需要寫前7位)
       其中—hard代表強(qiáng)制重置
       回到當(dāng)前版本救拉,放棄所有沒有提交的修改
       $ git reset --hard HEAD
       回到上一個(gè)版本
       $ git reset --hard HEAD^
       回到之前第3個(gè)修訂版本
       $ git reset --hard HEAD~(3)
       回到指定版本號(hào)的版本
       $ git reset e695b67
       查看分支引用記錄
       $ git reflog
    
```

   - 已經(jīng)提交
   
   ```
    git reset —hard HEAD^ 返回上一個(gè)版本
    其中—hard代表強(qiáng)制重置
    git reset —hard 版本號(hào)(只需要寫前7位)
   ```
   - 未提交
   
   ```
    git checkout 文件名 回退到上一次提交的版本
    git reset —hard HEAD  回退到上一次提交的版, 注意HEAD后面沒有尖號(hào)^
   ```      
  • 單個(gè)文件的修改管理

     查看文件變化
     $ git diff
     如果顯示綠色代表新增
     如果顯示紅色代表刪除
     撤銷對(duì)文件做的修改
     $ git checkout Person.h
     從代碼庫(暫存區(qū)中刪除文件)
    

a.本地操作

  • 1.創(chuàng)建代碼庫 & 配置個(gè)人信息

    • 1> 進(jìn)入工作目錄中难审,新建一個(gè)“本地倉庫”
       $ cd 進(jìn)入工作目錄
       $ git init
    
    • 2> 告訴git你是誰
      告訴git怎么聯(lián)系你
     $ git config user.name lnj
     $ git config user.email lnj@itcast.cn
    

    》上面一種配置方式是一次性的配置, 會(huì)配置到被管理文件的亿絮。git文件夾下的config 中

    》下面一種配置方式是一勞永逸的方式:
    兩個(gè)命令會(huì)將用戶信息保存在用戶目錄下的 .gitconfig 文件中

     $ git config --global user.name lmj
     $ git config --global user.email lmj@itcast.cn
    
    • 3> 查看當(dāng)前所有配置
     $ git config -l
    
  • 2.實(shí)際開發(fā)

    • 1> 創(chuàng)建代碼告喊,開始開發(fā)
       $ touch main.c
       $ open main.c
    
    • 2> 將代碼添加到代碼庫
     查看當(dāng)前代碼庫狀態(tài)
     $ git status
     將文件添加到代碼庫
     $ git add main.c
     將修改提交到代碼庫
     $ git commit -m "添加了main.c"      
    

    提示:

    在此一定要使用 -m 參數(shù)指定修改的備注信息

    否則會(huì)進(jìn)入 vim 編輯器麸拄,如果對(duì)vim不熟悉,會(huì)是很糟糕的事情

    將當(dāng)前文件夾下的所有新建或修改的文件一次性添加到代碼庫
    $ git add .

    • 3> 添加多個(gè)文件
     $ touch Person.h Person.m
     $ git add .
     $ git commit -m "添加了Person類"
     $ open Person.h
     $ git add .
     $ git commit -m "增加Person類屬性"
    

b.團(tuán)隊(duì)開發(fā)

遠(yuǎn)程倉庫(專門用于團(tuán)隊(duì)開發(fā)的代碼倉庫

SVN需要一個(gè)單獨(dú)的服務(wù)器

Git不需要: 文件中黔姜、U盤中拢切、云上、github秆吵、OSChina...

1.新建git遠(yuǎn)程倉庫,這個(gè)倉庫僅僅是用于管理代碼,不參與開發(fā)

  ```
  # 切換目錄
  $ cd /Users/lnj/Desktop/git演練/公司/weibo
  # 建立空白代碼庫(專門用于團(tuán)隊(duì)開發(fā))
  $ git init --bare
  ```

2.項(xiàng)目經(jīng)理初始化項(xiàng)目

 - 切換目錄
 
 ```
  $ cd /Users/lnj/Desktop/git演練/經(jīng)理
 ```
 - "克隆"代碼庫到本地
 
 ```
  $ git clone /Users/lnj/Desktop/git演練/公司/weibo/
 ```
 - 忽略不需要加入版本控制器的文件以及文件夾.gitignore
 
 ```
 touch .gitignore
 open .gitignore
 
 ```
 
 - 要忽略的?文件 可以去https://github.com/github/gitignore/blob/master/Objective-C.gitignore查看OC需要忽略 的內(nèi)容,將內(nèi)容填寫到. gitignore中,.gitignore一定要在和.git隱藏文件夾同一級(jí)的目錄下


    - 生成好.gitignore文件之后失球, 還需要將.gitignore文件添加到版本控制
    
 ```  
    git add  .gitignore
    git commit .gitignore -m”將.gitignore文件添加到版本控制”
 ```
 
   - 新建項(xiàng)目,初始化項(xiàng)目在.git同目錄下      
  
 ```
   source conrol—>commit  將代碼提交到本地倉庫
   source conrol—>push 將代碼提交到遠(yuǎn)程倉庫
 ```

3.新人加入
- git clone 共享代碼庫的地址
- 修改代碼—>git commit —>git push

4.分支管理

```  
 # 查看當(dāng)前標(biāo)簽
 $ git tag
 在本地代碼庫給項(xiàng)目打上一個(gè)標(biāo)簽
 $ git tag -a v1.0 -m 'Version 1.0'
 將標(biāo)簽添推送到遠(yuǎn)程代碼庫中
 $ git push origin v1.0

 使用tag,就能夠?qū)㈨?xiàng)目快速切換到某一個(gè)中間狀態(tài)帮毁,例如產(chǎn)品開發(fā)線上的某一個(gè)穩(wěn)     定版本
 簽出v1.0標(biāo)簽
 $ git checkout v1.0
 從簽出狀態(tài)創(chuàng)建v1.0bugfix分支
 $ git checkout -b bugfix1.0

 查看遠(yuǎn)程分支
 $ git branch -r
 刪除遠(yuǎn)程分支
 $ git branch -r -d origin/bugfix1.0
 
 $ git merge v1.0
 
``` 

5.注意
- git中默認(rèn)就會(huì)創(chuàng)建一個(gè)分支实苞, 這個(gè)分支叫做origin/master, 相當(dāng)于svn中的trunk
- 專業(yè)人員只需要在git倉庫的hooks文件夾中寫一些指令烈疚, 就可以完成自動(dòng)測試(壓力測試黔牵、自動(dòng)測試、集成測試爷肝、冒煙測試猾浦、。灯抛。金赦。)
- 和SVN一樣, 如果服務(wù)器倉庫的代碼被修改了对嚼, 我們再提交代碼也會(huì)報(bào)錯(cuò)夹抗。
fetch first == out of data

 **要先從服務(wù)器`pull`之后再提交***


 - 總結(jié):
   git和svn最大的區(qū)別
   
     1.git每次修改新增都需要add 
             
     2.git每臺(tái)電腦都有一個(gè)倉庫
     
     3.git是先提交到本地倉庫, 再提交到遠(yuǎn)程倉庫

c.新人服務(wù)器的搭建

1.新建一個(gè)新人服務(wù)器
cd /Users/lnj/Desktop/... 新人服務(wù)器
2.初始化倉庫
git init --bare

3.添加一個(gè)新的遠(yuǎn)程倉庫
source control —> master —>config —>remotes —>add —> add remote


Snip20160126_4.png

4.將經(jīng)理最新的代碼提交到新人服務(wù)器
xcode -> source control -> push


Snip20160126_5.png

5.經(jīng)理分配新人服務(wù)器的地址給新人

c.分支 —bug 修復(fù)

1.開發(fā)

2.發(fā)布

 ```
 # 查看當(dāng)前標(biāo)簽
 $ git tag
 在本地代碼庫給項(xiàng)目打上一個(gè)標(biāo)簽
 $ git tag -a v1.0 -m 'Version 1.0'
 將標(biāo)簽添推送到遠(yuǎn)程代碼庫中
 $ git push origin v1.0 
 ```  

3.保存穩(wěn)定版本

4.繼續(xù)開發(fā)

5.出現(xiàn)bug

6.分配員工到分支上修復(fù)bug

     ```
     >員工從服務(wù)器下載最新代碼
     $git clone /Users/lnj/Desktop/纵竖。漠烧。。
     》員工利用git checkout v1.0指令快速切換到1.0版本
     》根據(jù)提示:開啟一個(gè)新的分支開始修復(fù)代碼
     $git checkout -b 1.0bug_fix
     》修復(fù)完成之后再打個(gè)標(biāo)簽
     $ git tag -a v1.1 -m 'Version 1.1'
     $ git push origin v1.0  將標(biāo)簽添推送到遠(yuǎn)程代碼庫中
     ```

7.合并修復(fù)后的代碼到主線

 在修復(fù)bug 的代碼中
   ![Snip20160126_6.png](http://upload-images.jianshu.io/upload_images/1482869-c551aa564d9a484e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

8.備份穩(wěn)定版本
d.如何使用/學(xué)習(xí)第三方框架
優(yōu)秀的第三方框架都在 github.com

1> 搜索
2> git clone 獲得完整版本
$ git clone https://github.com/AFNetworking/AFNetworking.git
3> 獲取最新版本 git pull

  • 進(jìn)入clone的本地文件夾
    $ git pull

4> 看github上的文檔,優(yōu)秀的第三方框架都有好的文檔
5> 編寫測試程序,看運(yùn)行結(jié)果
6> 針對(duì)感興趣的部分,看源代碼

7> 有問題去http://stackoverflow.com

e.通過Xcode將代碼提交到github上

1.注冊一個(gè) github賬號(hào)

2.新建遠(yuǎn)程倉庫


Snip20160126_9.png

Snip20160126_12.png

3.復(fù)制遠(yuǎn)程倉庫地址


Snip20160126_15.png

4.添加遠(yuǎn)程倉庫

  - a-
 ![Snip20160126_14.png](http://upload-images.jianshu.io/upload_images/1482869-be0d032e0b29b0ab.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  ![Snip20160126_17.png](http://upload-images.jianshu.io/upload_images/1482869-6c6540bc4331f2ad.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  
 ![Snip20160126_18.png](http://upload-images.jianshu.io/upload_images/1482869-9f14a056141ef826.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)     
 ![Snip20160126_20.png](http://upload-images.jianshu.io/upload_images/1482869-1fcf716895f09d83.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  ![Snip20160126_22.png](http://upload-images.jianshu.io/upload_images/1482869-20dffd907faae958.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

  - b-
通過 git clone  遠(yuǎn)程倉庫地址

5.在代碼倉庫創(chuàng)建工程靡砌,提交 SourceControl -> commit -> push
push 成功之后已脓,github上 就有了代碼倉庫。

6.配置SSH Keys
- 點(diǎn)擊昵稱來到個(gè)人主頁
- 點(diǎn)擊主頁中的設(shè)置(setting)
- 點(diǎn)擊SSH Keys
- 點(diǎn)擊 generating SSH keys

  - 1.檢查本地的ssh keys
    在“用戶目錄”下 ls -al ~/.ssh
  - 2.如果文件夾不存在需要手動(dòng)創(chuàng)建一個(gè)  mkdir .ssh(可不要)
  - 3.根據(jù)github的提示2生成ssh keys
   在.ssh目錄下執(zhí)行 
   `$ssh-keygen -t rsa -b 4096 -C "your_email@example.com"`
   輸入完成之后連續(xù)按下回車通殃, 知道出現(xiàn)牛逼的圖形位置
  - 4.生成完公鑰和私鑰之后輸入
   ls -la查看是否生成成功   id_rsa(私鑰) id_rsa.pub(公鑰)
  - 5.根據(jù)提示3獲得公鑰
   pbcopy < ~/.ssh/id_rsa.pub
   打開id_rsa.pub文件拷貝里面的內(nèi)容
  - 6.點(diǎn)擊 setting —》 ssh key —>add ssh key
    將剛才獲取到得公鑰添加進(jìn)去
    ![Snip20160126_24.png](http://upload-images.jianshu.io/upload_images/1482869-55a83561ebc199e5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    ![Snip20160126_25.png](http://upload-images.jianshu.io/upload_images/1482869-57686487cdf35778.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  - 7.更具github第4步提示度液, 驗(yàn)證公鑰
    驗(yàn)證成功網(wǎng)頁上的灰色圓點(diǎn)會(huì)變成綠色
  - 8.拷貝到公鑰之后打開github主頁      
   》點(diǎn)擊倉庫(Repositories)
   》再點(diǎn)擊new來到github創(chuàng)建倉庫界面
   
  - 9.通過github提供的地址下載一個(gè)空得倉庫到本地
  
   》創(chuàng)建一個(gè)新的項(xiàng)目到本地倉庫文件夾中
   
   》利用Xcode提交代碼到github
   
   》注意:要求輸入用戶名密碼時(shí)候,輸入的是github上顯示的昵稱而不是登錄賬號(hào)
 
  ```

6.刪除代碼倉庫

Snip20160126_26.png
Snip20160126_27.png

7.怎么把別人的代碼倉庫弄到自己的代碼倉庫


Snip20160126_28.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末画舌,一起剝皮案震驚了整個(gè)濱河市堕担,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌骗炉,老刑警劉巖照宝,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異句葵,居然都是意外死亡厕鹃,警方通過查閱死者的電腦和手機(jī)兢仰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剂碴,“玉大人把将,你說我怎么就攤上這事∫涿” “怎么了察蹲?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長催训。 經(jīng)常有香客問我洽议,道長,這世上最難降的妖魔是什么漫拭? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任亚兄,我火速辦了婚禮,結(jié)果婚禮上采驻,老公的妹妹穿的比我還像新娘挂洛。我一直安慰自己句喷,他們只是感情好绞呈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布俐东。 她就那樣靜靜地躺著,像睡著了一般痘系。 火紅的嫁衣襯著肌膚如雪菲嘴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天碎浇,我揣著相機(jī)與錄音临谱,去河邊找鬼。 笑死奴璃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的城豁。 我是一名探鬼主播苟穆,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼唱星!你這毒婦竟也來了雳旅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤间聊,失蹤者是張志新(化名)和其女友劉穎攒盈,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哎榴,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡型豁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年僵蛛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迎变。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡充尉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衣形,到底是詐尸還是另有隱情驼侠,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布谆吴,位于F島的核電站倒源,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏句狼。R本人自食惡果不足惜相速,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鲜锚。 院中可真熱鬧突诬,春花似錦、人聲如沸芜繁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骏令。三九已至蔬捷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間榔袋,已是汗流浹背周拐。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凰兑,地道東北人妥粟。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像吏够,于是被迫代替她去往敵國和親勾给。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容