SVN & Git轉

PS:本文所有$符號之后為在終端中執(zhí)行的命令仰猖。

版本控制系統(tǒng)

版本控制

版本控制(Version Control)的作用是追蹤文件的變化。為什么需要版本控制奈籽?簡單說饥侵,就是當你出錯了,可以很容易地回到?jīng)]出錯時的狀態(tài)衣屏。

你可能已經(jīng)在不知不覺中躏升,布置了自己的版本控制系統(tǒng)。比如狼忱,創(chuàng)建了類似下面這樣的文件名:

  • 論文_0510.doc
  • 論文_0514.doc
  • 論文_0521.doc
  • 論文_修改版.doc
  • 論文_最終不修改版.doc

這就是軟件中為什么有"Save As"命令的原因膨疏。它使得你可以在不破壞源文件的基礎上,得到一個類似的新文件钻弄。文件的多版本保存是一個常見問題佃却,通常的解決辦法是這樣的:

  • 做一個文件備份(比如Document.old.txt)。
  • 在文件名中加入版本號或日期(比如Document_V1.txt窘俺,DocumentMarch2007.txt)饲帅。
  • 在多人編輯的環(huán)境下,共享一個文件目錄批销,并且要求每個人編輯完以后洒闸,在文件上做出標識染坯。

什么是版本控制系統(tǒng)(VCS)均芽?

大型的、頻繁修改的单鹿、多人編寫的軟件項目掀宋,需要一個版本控制系統(tǒng)(簡稱VCS,行話叫做"文件數(shù)據(jù)庫"),追蹤文件的變化劲妙,避免出現(xiàn)混亂湃鹊。

一次典型的使用過程是這樣的:

愛麗絲add一個文件(list.txt)進入repo。然后镣奋,她又把這個文件check out币呵,做了一次編輯(在文件中加入milk這個單詞)。接著侨颈,她將修改后的文件check in余赢,并附有一條checking message("加入了新的條目")。第二天早上哈垢,鮑勃update了他本地的working set妻柒,看到了list.txt的最新修訂版,其中包含了單詞"milk"耘分。如果他使用changelog或diff举塔,都可以發(fā)現(xiàn)前一天愛麗絲加入"milk"這個詞。

網(wǎng)上有許多VCS軟件可供選擇求泰,并且都有詳細的教程或手冊央渣,比如SVN、CVS拜秧、RCS痹屹、Git、Perforce等等枉氮。

版本庫

版本庫又名倉庫志衍,英文名repository,你可以簡單理解成一個目錄聊替,這個目錄里面的所有文件都可以被版本控制系統(tǒng)管理起來楼肪,每個文件的修改、刪除惹悄,都能跟蹤春叫,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”泣港。

SVN

在Mac環(huán)境下暂殖,由于Mac自帶了SVN的服務器端和客戶端功能,所以我們可以在不裝任何第三方軟件的前提下使用SVN功能当纱,不過還需做一下簡單的配置呛每。

為什么使用SVN

  1. 進行權限管理,針對不同的人坡氯,開放不同的權限晨横。比如Alex是進行A項目的洋腮,Bob進行B項目的,那么SVN可以有效的管理每個人看到的項目手形,Alex不可能獲得Bob的項目啥供,同樣Bob也不可能獲得Alex的項目。
  2. 對于代碼進行追蹤库糠,代碼不會遺失伙狐。不如今天代碼修改亂了,需要恢復到某一天的瞬欧,那么我們只需要選擇一下恢復的日期即可進行恢復鳞骤。

搭建SVN服務器

1. 創(chuàng)建代碼倉庫,存儲客戶端上傳的代碼

先在~/Desktop目錄(這個目錄可以是任意非中文路徑)新建一個svn目錄黍判,以后可以在svn目錄下創(chuàng)建多個倉庫目錄豫尽。

打開終端,切換到該目錄cd ~/Desktop/svn顷帖,創(chuàng)建一個learnsvn倉庫美旧,輸入命令:svnadmin create ./learnsvn,執(zhí)行成功后贬墩,會發(fā)現(xiàn)在該目錄下多了一個LimitFree目錄榴嗅。

2. 配置SVN的用戶權限

主要是修改./learnsvn/conf目錄下的三個文件

  • 打開svnserve.conf,將下列配置項前面的#和空格都去掉

    # anon-access = read  
    # auth-access = write  
    # password-db = passwd
    # authz-db = authz
    

    anon-access = read代表匿名訪問的時候是只讀的陶舞,若改為anon-access = none代表禁止匿名訪問嗽测,需要帳號密碼才能訪問

  • 打開passwd,在[users]下面添加帳號和密碼

    [users]
    # harry = harryssecret
    # sally = sallyssecret
    chaosky = 123
    student = 123456
    

    帳號是chaosky肿孵,密碼是123

  • 打開authz唠粥,配置用戶組和權限

    我們可以將在passwd里添加的用戶分配到不同的用戶組里,以后的話停做,就可以對不同用戶組設置不同的權限晤愧,沒有必要對每個用戶進行單獨設置權限。

    在[groups]下面添加組名和用戶名蛉腌,多個用戶之間用逗號(,)隔開

    [groups]  
    topgroup=chaosky,student
    

    說明chaosky和student都是屬于topgroup這個組的官份,接下來再進行權限配置。

    使用[/]代表svn服務器中的所有資源庫

    [/]  
    @topgroup = rw
    

    上面的配置說明topgroup這個組中的所有用戶對所有資源庫都有讀寫(rw)權限烙丛,組名前面要用@

    如果是用戶名舅巷,不用加@,比如chaosky這個用戶有讀寫權限

    [/]  
    chaosky = rw
    

3. 啟動SVN服務器

在終端輸入命令:svnserve -d -r ~/Desktop/svnsvnserve -d -r ~/Desktop/svn/learnsvn

沒有任何提示就說明啟動成功了

4. 關閉SVN服務器

打開活動監(jiān)視器河咽,輸入svnserve钠右,強制退出進程。

使用SVN客戶端功能

SVN客戶端有兩種使用方式库北,命令行和GUI界面軟件(CornerStone)

命令行工具

usage: svn <subcommand> [options] [args]
Subversion command-line client.
Type 'svn help <subcommand>' for help on a specific subcommand.
Type 'svn --version' to see the program version and RA modules
  or 'svn --version --quiet' to see just the version number.

Most subcommands take file and/or directory arguments, recursing
on the directories.  If no arguments are supplied to such a
command, it recurses on the current directory (inclusive) by default.

Available subcommands:
   add
   auth
   blame (praise, annotate, ann)
   cat
   changelist (cl)
   checkout (co)
   cleanup
   commit (ci)
   copy (cp)
   delete (del, remove, rm)
   diff (di)
   export
   help (?, h)
   import
   info
   list (ls)
   lock
   log
   merge
   mergeinfo
   mkdir
   move (mv, rename, ren)
   patch
   propdel (pdel, pd)
   propedit (pedit, pe)
   propget (pget, pg)
   proplist (plist, pl)
   propset (pset, ps)
   relocate
   resolve
   resolved
   revert
   status (stat, st)
   switch (sw)
   unlock
   update (up)
   upgrade

Subversion is a tool for version control.
For additional information, see http://subversion.apache.org/

CornerStone

添加代碼倉庫

填寫SVN倉庫信息

基本操作

checkout(檢出)

add(添加文件)

delete(刪除文件)

modify (修改文件)

commit(提交)

update(更新)

resolve conflict(解決沖突)

revert(恢復初始狀態(tài))

Git

安裝Git

直接從AppStore安裝Xcode爬舰,Xcode集成了Git,不過默認沒有安裝寒瓦,你需要運行命令xcode-select --install安裝“Command Line Tools”情屹,點“Install”就可以完成安裝了。

創(chuàng)建版本庫

  1. 選擇一個合適的地方杂腰,創(chuàng)建一個空目錄:

    $ mkdir learngit
    $ cd learngit
    
  2. 通過git init命令把這個目錄變成Git可以管理的倉庫:

    $ git init
    Initialized empty Git repository in /Users/Chaosky/Desktop/learngit/.git/
    

    瞬間Git就把倉庫建好了垃你,而且告訴你是一個空的倉庫(empty Git repository),細心的讀者可以發(fā)現(xiàn)當前目錄下多了一個.git的目錄喂很,這個目錄是Git來跟蹤管理版本庫的惜颇,沒事千萬不要手動修改這個目錄里面的文件,不然改亂了少辣,就把Git倉庫給破壞了凌摄。

把文件添加到版本庫

  1. 編寫一個README.md文件,內(nèi)容如下:

    Git is a version control system.
    Git is free software.
    

    一定要放到learngit目錄下(子目錄也行)漓帅,因為這是一個Git倉庫锨亏,放到其他地方Git再厲害也找不到這個文件。

  2. 用命令git add告訴Git忙干,把文件添加到倉庫:

    $ git add readme.txt
    

    執(zhí)行上面的命令器予,沒有任何顯示,這就對了捐迫,Unix的哲學是“沒有消息就是好消息”,說明添加成功。

  3. 用命令git commit告訴Git惠啄,把文件提交到倉庫:

    $ git commit -m "wrote a readme file"
    [master (root-commit) cb926e7] wrote a readme file
    1 file changed, 2 insertions(+)
    create mode 100644 readme.txt
    

    簡單解釋一下git commit命令皇耗,-m后面輸入的是本次提交的說明,可以輸入任意內(nèi)容赞哗,當然最好是有意義的勾习,這樣你就能從歷史記錄里方便地找到改動記錄。

    git commit命令執(zhí)行成功后會告訴你懈玻,1個文件被改動(我們新添加的readme.txt文件)巧婶,插入了兩行內(nèi)容(readme.txt有兩行內(nèi)容)。

    為什么Git添加文件需要add涂乌,commit一共兩步呢艺栈?因為commit可以一次提交很多文件,所以你可以多次add不同的文件湾盒,比如:

    $ git add file1.txt
    $ git add file2.txt file3.txt
    $ git commit -m "add 3 files."
    

工作區(qū)和暫存區(qū)

  • 工作區(qū)(Working Directory)

    就是你在電腦里能看到的目錄湿右。

  • 版本庫(Repository)

    Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū)罚勾,還有Git為我們自動創(chuàng)建的第一個分支master毅人,以及指向master的一個指針叫HEAD吭狡。

    前面講了我們把文件往Git版本庫里添加的時候,是分兩步執(zhí)行的:

    第一步是用git add把文件添加進去丈莺,實際上就是把文件修改添加到暫存區(qū)划煮;

    版本庫狀態(tài)
    版本庫狀態(tài)

    第二步是用git commit提交更改,實際上就是把暫存區(qū)的所有內(nèi)容提交到當前分支缔俄。

    版本庫狀態(tài)
    版本庫狀態(tài)

    你可以簡單理解為弛秋,需要提交的文件修改通通放到暫存區(qū),然后俐载,一次性提交暫存區(qū)的所有修改蟹略。

    ?

版本庫管理

  • git status

    查看倉庫當前的狀態(tài),要隨時掌握工作區(qū)的狀態(tài)遏佣,使用git status命令挖炬。

  • git diff

    如果git status告訴你有文件被修改過,用git diff可以查看修改內(nèi)容状婶。

  • git log

    顯示從最近到最遠的提交日志茅茂。在Git中,用HEAD表示當前版本太抓,也就是最新的提交空闲,上一個版本就是HEAD^ ,上上一個版本就是HEAD^^ 走敌,當然往上100個版本寫100個^比較容易數(shù)不過來碴倾,所以寫成HEAD~100。

  • git reset --hard commit_id

    在版本的歷史之間進行切換掉丽,commit_id為提交版本的id跌榔。

  • git reflog

    用來記錄你的每一次命令

  • 撤銷修改

    場景1:當你改亂了工作區(qū)某個文件的內(nèi)容,想直接丟棄工作區(qū)的修改時捶障,用命令git checkout -- README.md僧须。

    場景2:當你不但改亂了工作區(qū)某個文件的內(nèi)容,還添加到了暫存區(qū)時项炼,想丟棄修改担平,分兩步,第一步用命令git reset HEAD README.md锭部,就回到了場景1暂论,第二步按場景1操作。

  • git rm

    用于刪除一個文件拌禾。如果一個文件已經(jīng)被提交到版本庫取胎,那么你永遠不用擔心誤刪,但是要小心,你只能恢復文件到最新版本闻蛀,你會丟失最近一次提交后你修改的內(nèi)容匪傍。

遠程倉庫

分布式版本控制系統(tǒng)通常也有一臺充當“中央服務器”的電腦,而充當"中央服務器"角色的倉庫就是遠程倉庫觉痛,但這個服務器的作用僅僅是用來方便“交換”大家的修改役衡,沒有它大家也一樣干活,只是交換修改不方便而已秧饮。

如果有自己的私有倉庫地址,則無需執(zhí)行下面幾個操作泽篮。

  • 注冊遠程倉庫賬號

  • 添加公鑰到Git托管平臺

    1. 生成公鑰

      SSH Keys:SSH key 可以讓你在你的電腦和 Git托管平臺之間建立安全的加密連接盗尸。

      你可以按如下命令來生成sshkey:

      $ ssh-keygen -t rsa -C "xxxxx@xxxxx.com"
      

      其中xxxxx@xxxxx.com需要填寫郵箱信息

      生成SSH key時,如果不清楚需要輸入的信息帽撑,可以全部輸入Enter鍵泼各。

    2. 查看你的public key,并把他添加到Git托管平臺
      $ cat ~/.ssh/id_rsa.pub
      

      具體添加的位置亏拉,查看具體的托管平臺扣蜻。一般來說,在個人資料中可以找到SSH-KEYS類似的字樣就是添加公鑰的地方及塘。

    3. 測試是否添加成功

      測試Git@OSC輸入命令:

      $ ssh -T git@git.oschina.net
      Welcome to Git@OSC, yourname! 
      

      測試Github輸入命令:

      $ ssh -T git@github.com
      Hi chaoskyme! Youve successfully authenticated, but GitHub does not provide shell access.
      

    生成SSH key只需要生成一次莽使,不同的網(wǎng)站再將公鑰拷貝到網(wǎng)站上即可。

  • 在Git托管平臺上創(chuàng)建項目

  • 添加遠程倉庫

    關聯(lián)一個遠程倉庫命令:

    $ git remote add origin git@server-name:path/repo-name.git
    

    其中origin表示遠程倉庫的別名笙僚,默認為origin

    git@server-name:path/repo-name.git表示項目在Git托管平臺上的ssh 地址芳肌。

    關聯(lián)遠程倉庫只需要執(zhí)行上面的命令一次即可。

    關聯(lián)后肋层,第一次推送master分支的所有內(nèi)容命令:

    $ git push -u origin master
    

    此后亿笤,每次本地提交后,只要有必要栋猖,推送最新修改就可以使用命令:

    $ git push origin master
    

    分布式版本系統(tǒng)的最大好處之一是在本地工作完全不需要考慮遠程庫的存在净薛,也就是有沒有聯(lián)網(wǎng)都可以正常工作,而SVN在沒有聯(lián)網(wǎng)的時候是拒絕干活的蒲拉!當有網(wǎng)絡的時候肃拜,再把本地提交推送一下就完成了同步,真是太方便了雌团!

  • 克隆遠程倉庫

    $ git clone git@server-name:path/repo-name.git <repo-name>
    
  • 從遠程分支獲取最新版本到本地爆班,有2個命令

    • git fetch:相當于是從遠程獲取最新版本到本地,不會自動merge

      $ git fetch origin master
      $ git log -p master..origin/master
      $ git merge origin/master
      

      以上命令的含義:

      首先從遠程的origin的master主分支下載最新的版本到origin/master分支上;

      然后比較本地的master分支和origin/master分支的差別;

      最后進行合并辱姨。

    • git pull:相當于是從遠程獲取最新版本并merge到本地

      $ git pull origin master
      

      上述命令其實相當于git fetch 和 git merge

    在實際使用中柿菩,git fetch更安全一些

    因為在merge前,我們可以查看更新情況雨涛,然后再決定是否合并

分支管理

Git鼓勵大量使用分支:

查看分支:git branch

創(chuàng)建分支:git branch <name>

切換分支:git checkout <name>

創(chuàng)建+切換分支:git checkout -b <name>

合并某分支到當前分支:git merge <name>

刪除分支:git branch -d <name>

當Git無法自動合并分支時枢舶,就必須首先解決沖突懦胞。解決沖突后,再提交凉泄,合并完成躏尉。

git log --graph命令可以看到分支合并圖。

推送分支后众,就是把該分支上的所有本地提交推送到遠程庫胀糜。推送時,要指定本地分支蒂誉,這樣教藻,Git就會把該分支推送到遠程庫對應的遠程分支上:

$ git push origin master

標簽管理

git tag <name>用于新建一個標簽,默認為HEAD右锨,也可以指定一個commit id括堤;

git tag -a <tagname> -m "blablabla..."可以指定標簽信息;

git tag -s <tagname> -m "blablabla..."可以用PGP簽名標簽绍移;

git tag可以查看所有標簽

git push origin <tagname>可以推送一個本地標簽悄窃;

git push origin —tags可以推送全部未推送過的本地標簽;

git tag -d <tagname>可以刪除一個本地標簽蹂窖;

git push origin :refs/tags/<tagname>可以刪除一個遠程標簽轧抗。

Git常用命令速查表

參考文章

  1. http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
  2. 參考書籍:《Git權威指南》
  3. http://backlogtool.com/git-guide/cn/

SVN vs Git (集中式 vs 分布式)

先說集中式版本控制系統(tǒng),版本庫是集中存放在中央服務器的瞬测,而干活的時候鸦致,用的都是自己的電腦,所以要先從中央服務器取得最新的版本涣楷,然后開始干活分唾,干完活了,再把自己的活推送給中央服務器狮斗。中央服務器就好比是一個圖書館绽乔,你要改一本書,必須先從圖書館借出來碳褒,然后回到家自己改折砸,改完了,再放回圖書館沙峻。

central-repo
central-repo

集中式版本控制系統(tǒng)最大的毛病就是必須聯(lián)網(wǎng)才能工作睦授。

那分布式版本控制系統(tǒng)與集中式版本控制系統(tǒng)有何不同呢?首先摔寨,分布式版本控制系統(tǒng)根本沒有“中央服務器”去枷,每個人的電腦上都是一個完整的版本庫,這樣,你工作的時候删顶,就不需要聯(lián)網(wǎng)了竖螃,因為版本庫就在你自己的電腦上。既然每個人電腦上都有一個完整的版本庫逗余,那多個人如何協(xié)作呢特咆?比方說你在自己電腦上改了文件A,你的同事也在他的電腦上改了文件A录粱,這時腻格,你們倆之間只需把各自的修改推送給對方,就可以互相看到對方的修改了啥繁。

和集中式版本控制系統(tǒng)相比菜职,分布式版本控制系統(tǒng)的安全性要高很多,因為每個人電腦里都有完整的版本庫输虱,某一個人的電腦壞掉了不要緊些楣,隨便從其他人那里復制一個就可以了脂凶。而集中式版本控制系統(tǒng)的中央服務器要是出了問題宪睹,所有人都沒法干活了。

在實際使用分布式版本控制系統(tǒng)的時候蚕钦,其實很少在兩人之間的電腦上推送版本庫的修改亭病,因為可能你們倆不在一個局域網(wǎng)內(nèi),兩臺電腦互相訪問不了嘶居,也可能今天你的同事病了罪帖,他的電腦壓根沒有開機。因此邮屁,分布式版本控制系統(tǒng)通常也有一臺充當“中央服務器”的電腦整袁,但這個服務器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣干活佑吝,只是交換修改不方便而已坐昙。

distributed-repo
distributed-repo
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市芋忿,隨后出現(xiàn)的幾起案子炸客,更是在濱河造成了極大的恐慌,老刑警劉巖戈钢,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痹仙,死亡現(xiàn)場離奇詭異,居然都是意外死亡殉了,警方通過查閱死者的電腦和手機开仰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抖所,你說我怎么就攤上這事梨州。” “怎么了田轧?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵暴匠,是天一觀的道長。 經(jīng)常有香客問我傻粘,道長每窖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任弦悉,我火速辦了婚禮窒典,結果婚禮上,老公的妹妹穿的比我還像新娘稽莉。我一直安慰自己瀑志,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布污秆。 她就那樣靜靜地躺著劈猪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪良拼。 梳的紋絲不亂的頭發(fā)上战得,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音庸推,去河邊找鬼常侦。 笑死,一個胖子當著我的面吹牛贬媒,可吹牛的內(nèi)容都是我干的聋亡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼际乘,長吁一口氣:“原來是場噩夢啊……” “哼坡倔!你這毒婦竟也來了?” 一聲冷哼從身側響起蚓庭,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤致讥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后器赞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垢袱,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年港柜,在試婚紗的時候發(fā)現(xiàn)自己被綠了请契。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咳榜。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖爽锥,靈堂內(nèi)的尸體忽然破棺而出涌韩,到底是詐尸還是另有隱情,我是刑警寧澤氯夷,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布臣樱,位于F島的核電站,受9級特大地震影響腮考,放射性物質發(fā)生泄漏雇毫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一踩蔚、第九天 我趴在偏房一處隱蔽的房頂上張望棚放。 院中可真熱鬧,春花似錦馅闽、人聲如沸飘蚯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽局骤。三九已至,卻和暖如春拟杉,著一層夾襖步出監(jiān)牢的瞬間庄涡,已是汗流浹背量承。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工搬设, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撕捍。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓拿穴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忧风。 傳聞我的和親對象是個殘疾皇子默色,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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