Git版本控制

一踢俄、版本控制

版本控制,通過文檔控制記錄各個模塊的改動晴及,并給每次改動添加序號都办,用于存儲、追蹤目錄和文件的修改歷史。

二琳钉、版本控制軟件

  • GIT 分布式版本控制系統(tǒng)
    Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng),分布式版本控制系統(tǒng)的安全性要高很多势木,因為每個人電腦里都有完整的版本庫,即使沒有網(wǎng)絡(luò)你也可以提交變動到版本庫(因為本地就有一個完整的版本庫)歌懒,git的中心庫和SVN等傳統(tǒng)版本控制系統(tǒng)不同啦桌,它不是一切的中心(大腦),而僅僅也是一個副本及皂,它的存在只是為了方便協(xié)作開發(fā)甫男,大家方便提交變動和同步變動。但是這里說的不依賴網(wǎng)絡(luò)验烧,并不是完全不依賴網(wǎng)絡(luò)就能完成所以的事情板驳,比如讓其他開發(fā)人員拿到你的改動,所以說這里所說的不依賴網(wǎng)絡(luò)只是相對的噪窘,在沒有網(wǎng)絡(luò)的情況下笋庄,可以提交變動到本地的版本庫,但最終還是要依賴網(wǎng)絡(luò)提交變動讓其他開發(fā)人員看到倔监。一旦長時間不進(jìn)行代碼同步(不同開發(fā)者之間)直砂,很可能會產(chǎn)生變動沖突,這時候就需要人工來解決沖突浩习。

分布式静暂,去中心化,GIT在我們每個人的電腦上都有一個獨立完整的庫谱秽,我們平時上傳代碼的中央服務(wù)器和我們電腦上的庫的內(nèi)容基本上完全一樣洽蛀。

  • SVN 集中式版本控制軟件
    SVN是一個開放源代碼的版本控制系統(tǒng),它采用了分支管理系統(tǒng)疟赊,管理著隨時間改變的數(shù)據(jù)郊供,這些數(shù)據(jù)放置在一個中央資料檔案庫(repository)中。這個檔案庫很像一個普通的文件服務(wù)器,不過它會記住每一次文件的變動近哟。這樣你就可以把檔案恢復(fù)到舊的版本,或是瀏覽文件的變動歷史驮审。Subversion是一個通用的系統(tǒng),可用來管理任何類型的文件,其中包括了程序源碼。

集中式吉执,顧名思義就是將資源集中起來疯淫。每次修改完文件上傳到中央服務(wù)器。當(dāng)需要修改時戳玫,再從中央服務(wù)器下載下來熙掺。這也暴露出它的一個弊端,必須需要網(wǎng)絡(luò)才能從中央服務(wù)器下載下來咕宿。

版本庫是集中存放在中央服務(wù)器中币绩;
在每次操作時蜡秽,都需要從服務(wù)器獲取最新的版本;
在操作完之后类浪,都需要把自己做的推送到服務(wù)器中载城;
問題:
必須聯(lián)網(wǎng)才能工作;
網(wǎng)絡(luò)不好時费就;

三诉瓦、Git安裝

  • Linux版本安裝
- 安裝
  $ sudo apt-get install git

- 檢測是否安裝成功
  $ git --version

四、Git常用命令速查表

Git常用命令速查表.jpg

五力细、GIT操作 【本地倉庫】

  • 什么是版本庫
    版本庫又被稱為倉庫repository睬澡,初期可以理解為一個目錄,這個目錄里面管理的文件都可以被稱為被git管理起來的眠蚂,每個文件的修改煞聪,刪除等的操作git都能進(jìn)行跟蹤。
  • 設(shè)置GIT
// 后續(xù)代碼是托管到GitHub中的逝慧,所以這里直接設(shè)置成GitHub的用戶名和GitHub郵箱

$ git config --global user.email "GitHub郵箱(12345678@163.com)"
$ git config --global user.name "GitHub的用戶名(bridgeZQ)"
  • 創(chuàng)建版本庫
- 切換到需要添加版本控制的目錄中
  $ cd dir/
- 初始化本地倉庫
  $ git init

會在對應(yīng)目錄中會看到 .git目錄昔脯,就是用來跟蹤管理的版本庫,千萬不要手動修改該目錄的文件笛臣。

  • 添加本地git忽略清單 .gitignore 【說明哪些文件是不需要被管理的】
    忽略規(guī)則是一行一個(根目錄和其他目錄云稚,目錄名相同時,即加上對應(yīng)路徑沈堡,如果是根目錄則是“/”)

在項目開發(fā)中静陈,有時候想把某些目錄或文件加入忽略規(guī)則中,但在清單中添加之后發(fā)現(xiàn)是無效的诞丽。即是某些文件已經(jīng)被納入了版本管理中鲸拥,則修改. gitignore是無效的。解決方法:
git rm -r --cached . git add .
$ git commit -m '更新gitignore忽略清單'
最好是在項目開始時僧免,創(chuàng)建好. gitignore文件刑赶!
后續(xù)工作是先在GitHub中克隆或拉取最新版本的遠(yuǎn)程倉庫在項目開發(fā)中。

  • 查看本倉庫的變更狀態(tài)
$ git status // 查看倉庫當(dāng)前的狀態(tài) 
$ git status -s // 輸出簡要的變更日志 
文件狀態(tài)說明: 
' ' 沒有修改
'A' 被添加到本地代碼倉庫 【add】
'C' 沖突 【clash】 
'D' 被刪除 【delete】
'I' 被忽略 【ignore】 
'M' 被修改 【modification】 
'R' 被替換 【replace】 
'X' 外部定義創(chuàng)建的版本目錄 
'?' 文件沒有被添加到本地版本庫內(nèi)
'!' 文件丟失或者不完整(不是通過git命令刪除的文件) 
'~' 受控文件被其他文件阻隔
  • 添加本地托管(暫存)文件
  - 添加指定文件名的文件
    $ git add index.html  
  - 添加通配符匹配的文件
    $ git add *.js
  - 添加所有未托管的文件(忽略.gitignore清單中的列表)
    $ git add .       // 或使用 $ git add - -all
  • 提交被托管的文件變化到本地倉庫(版本庫)
$ git commit -m "提交代碼對應(yīng)的版本說明"

備注:
   自動創(chuàng)建的一個分支master

注1: -m后面輸入的是本次提交的說明【就是所謂的日志】懂衩,可以輸入任意內(nèi)容角撞,當(dāng)然最好是有意義的,這樣你就能從歷史記錄里方便地找到改動記錄
注2: 再次修改文件勃痴,則重復(fù)git add和git commit命令
注3: 為什么GIT添加文件需要add、commit兩步操作热康?因為commit可以一次提交很多文件沛申,所以你可以多次add不同的文件

  • 對比差異
$ git diff filename   // 對比當(dāng)前版本和存儲在本地倉庫中最后一個版本的差異
  • 查看提交日志
  $ git log

  $ git log --pretty=oneline
  • 版本回退
工作原理: 
每當(dāng)修改一個文件,并且使用commit提交之后姐军,其實就相當(dāng)于保存了一個快照 
// 回退到上一版本
$ git reset --hard HEAD^ 

// 回退到上上版本 
$ git reset --hard HEAD^^ 

// 回退到上100個版本 
$ git reset --hard HEAD~100 

// 指定版本回退 
$ git reset - -hard xxxxxx // xxx是對應(yīng)版本的hash值前6位 

// 重返未來(從上往下尋找第一個commit的操作铁材,則是未來的最新的版本) 

$ git reflog // 查看歷史執(zhí)行過的git操作 

$ git reset --hard xxx // 對應(yīng)的hash值

在git中尖淘,用HEAD表示當(dāng)前版本。git在歷史的版本之間來回切換著觉,使用git reset --hard commit id

  • 撤銷操作
a.修改了文件內(nèi)容村生,但是還沒有添加到暫存區(qū)
$ git checkout  // 查看可撤銷文件
$ git checkout  --  xxx  // 撤銷對應(yīng)文件,即回到最新版本

六饼丘、GIT操作 【遠(yuǎn)程倉庫】

  • GitHub和Git概念區(qū)分
- git是一個工具
- github是一個網(wǎng)站
- github網(wǎng)站提供的是git服務(wù)(即可以將代碼托管到github服務(wù)器中)
- github服務(wù)是"免費(fèi)的"趁桃,但免費(fèi)服務(wù)的前提是開源(如果代碼需要閉源服務(wù),即是要收費(fèi)的)
  • github創(chuàng)建代碼管理倉庫
拷貝對應(yīng)倉庫的地址(注意HTTPS或SSH方式)
  • 關(guān)聯(lián)遠(yuǎn)程倉庫
- 添加遠(yuǎn)程倉庫并起名叫origin
    $ git remote add origin https://github.com/cxy/Git.git(HTTPS方式)

- 查看現(xiàn)有的服務(wù)器列表
    $ git remote -v

添加遠(yuǎn)程倉庫并起名(默認(rèn))叫origin肄鸽,可自行修改卫病。

  • 刪除遠(yuǎn)程倉庫的關(guān)聯(lián)
  // 遠(yuǎn)程倉庫的名字
  $ git remote rm origin
  • 推送本地倉庫內(nèi)容到遠(yuǎn)程倉庫
  $ git push -u origin master  // 提交到服務(wù)器中的master分支
  • 拉取(獲取)遠(yuǎn)程倉庫內(nèi)容到本地倉庫
    取回遠(yuǎn)程倉庫的變化,并與本地分支合并典徘。
$ git pull origin master    // 從master分支中獲取代碼

一蟀苛,錯誤描述
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'git@github.com:compassblog/PythonExercise.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

二,錯誤原因
GitHub遠(yuǎn)程端添加了README.md文件后逮诲,無法再次推的主要原因是GitHub中的README.md文件不在本地代碼目錄中帜平,或者拉取不成功時。

三梅鹦,解決方法
執(zhí)行下面命令進(jìn)行代碼合并:
git pull --rebase origin master

  • 克隆(下載遠(yuǎn)程倉庫)
    從零開發(fā)裆甩,先有遠(yuǎn)程倉庫,之后從遠(yuǎn)程倉庫克隆帘瞭。
 // 將遠(yuǎn)程服務(wù)器中代碼克隆一份到本地
$ git clone https://github.com/userName/projectName test 
// 沒有指定每次淑掌,默認(rèn)即是倉庫名 
$ git clone https://github.com/userName/projectName

七、HTTPS和SSH認(rèn)證方式

  • HTTPS方式
- git remote add origin https://github.com/bridgeZQ.test.git
- git push -u origin master 或 git pull origin master
【每次操作都需要輸入賬號密碼】

與遠(yuǎn)程倉庫交互時蝶念,可以是HTTPS和SSH方式兩種抛腕,更多建議使用SSH方式,操作更加簡單!

  • SSH方式(要進(jìn)行了SSH認(rèn)證)
- git remote add origin git@github.com:bridgeZQ/test.gti
- git push -u origin master 或 git pull origin master

創(chuàng)建的倉庫中媒殉,操作可以是HTTPS和SSH

八担敌、GitHub中SSH認(rèn)證

1.創(chuàng)建 .ssh 目錄

  $ mkdir  ~/.ssh

2.切換到.ssh目錄中

 $ cd  ~/.ssh

3.配置全局的name和email(如果已經(jīng)設(shè)置,即忽略該操作廷蓉,這是用于標(biāo)示一個人)

$ git config --global user.email "GitHub郵箱(12345678@163.com)"
$ git config --global user.name "GitHub的用戶名(bridgeZQ)"

4.生成key

  $ ssh-keygen -t rsa -C "zyz@1000phone.com"   // 與上面填寫的郵箱與之對應(yīng)
  備注: 連續(xù)三次回車全封,密碼是設(shè)置為空

5.復(fù)制.ssh目錄中的id_rsa.pub文件內(nèi)容,即是key (當(dāng)前用戶的目錄下)

  例如: home/zq/.ssh/id_rsa.pub

6.在github中添加key

  View profile and more -> settings -> SSH and GPG keys -> New SSH key

  備注:
   不要最后的郵箱!! 
   ssh-rsa和KEY之間就一個空格桃犬,后面都不能出現(xiàn)空格刹悴,即是一行!

7.檢測是否添加成功

 $ ssh git@github.com
  提示: Hi xxx! You've successfully authenticated, but GitHub does not provide shell access. 說明設(shè)置成功

九、分支管理

  • 分支的作用
    開發(fā)中攒暇,準(zhǔn)備一個新的功能土匀,但需要2周時間才能完成。第一周已經(jīng)寫了50%形用,如果立即提交就轧,由于代碼沒有寫完证杭,不完整的代碼會導(dǎo)致其他人也不能干活了。如果等代碼全部寫再提交妒御,又會存在丟失每天進(jìn)度的巨大風(fēng)險解愤。
    有了分支,可以避免此類問題乎莉。創(chuàng)建一個屬于自己的分支送讲,別人看不到,還繼續(xù)在原來的分支上正常工作梦鉴。而我們在自己的分支上干活李茫,想提交就提交,直到開發(fā)完畢后肥橙,在一次性合并到原來的分支上魄宏。這既安全,又不會影響到別人工作存筏。
  • 特點
    Git分支是與眾不同的宠互,無論創(chuàng)建、切換和刪除分支椭坚,Git在非常短的時間呃逆就能完成予跌,無論版本庫是1個文件還是1萬個文件。
  • master主分支
    在版本管理中善茎,每次提交券册,Git都把他們串成一條時間線(沿著時間軸添加),在Git中這個分支叫主分支垂涯,即master分支烁焙。
    每次提交,master分支都會向前移動一步耕赘,這樣不斷的提交骄蝇,master分支線也越來越長。
  • Git分支操作(版本庫其實就是一個時間軸)
- 查看分支(當(dāng)前分支前面會有一個*)
 $ git branch

- 查看分支的日志信息
 $ git branch -v

 - 新建分支 
 $ git branch version2 // 新的分支version2(主分支是master) 

- 切換分支(不同分支中操骡,就會顯示不同分支下的內(nèi)容) 
// 切換分支 
$ git checkout version2 
// 推送分支 
$ git push origin verion2 

- 創(chuàng)建與切換同時進(jìn)行
 $ git checkout -b version3 
// 創(chuàng)建version3分支九火,并切換到version3 

- 合并分支 
// 假如此時操作的是在version2分支中 
$ git checkout master 
// 再進(jìn)行合并,即將version2中內(nèi)容合并到master分支中 
$ git merge version2 
// 將version2分支的工作成果合并到master分支上
 // 合并完之后册招,再推送到GitHub 
$ git push origin master
 
- 刪除分支 
$ git branch -d version2 // 刪除分支version2
  • 分支策略
    master主分支應(yīng)該是非常穩(wěn)定的岔激,一般都是用于發(fā)布新版本,平時此分支上不干活是掰。
    干活都在dev分支上鹦倚,也就是說dev分支是不穩(wěn)定的,到某個時候冀惭,例如1.0版本時震叙,再把dev分支合并到master上,在master分支發(fā)布1.0版本散休。
    而你和小伙伴每個人都在dev分支上干活媒楼,每個人都有自己的分支,時不時的往dev分支上合并即可戚丸。
  • 多人協(xié)作
- 推送分支 
$ git push origin master 
$ git push origin dev 

- 抓取分支 從遠(yuǎn)程庫中clone時划址,默認(rèn)只能看到master分支內(nèi)容; 
想要在dev分支上開發(fā)限府,就必須克隆origin的dev分支到本地; 
$ git checkout -b dev origin/dev

實際的工作流程:先pull[抓取]夺颤,后push[推送]
git pull origin master
git pull --rebase origin master

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市胁勺,隨后出現(xiàn)的幾起案子世澜,更是在濱河造成了極大的恐慌,老刑警劉巖署穗,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寥裂,死亡現(xiàn)場離奇詭異,居然都是意外死亡案疲,警方通過查閱死者的電腦和手機(jī)封恰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褐啡,“玉大人诺舔,你說我怎么就攤上這事”钙瑁” “怎么了低飒?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長萍恕。 經(jīng)常有香客問我逸嘀,道長,這世上最難降的妖魔是什么允粤? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任崭倘,我火速辦了婚禮,結(jié)果婚禮上类垫,老公的妹妹穿的比我還像新娘司光。我一直安慰自己,他們只是感情好悉患,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布残家。 她就那樣靜靜地躺著,像睡著了一般售躁。 火紅的嫁衣襯著肌膚如雪坞淮。 梳的紋絲不亂的頭發(fā)上茴晋,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機(jī)與錄音回窘,去河邊找鬼诺擅。 笑死,一個胖子當(dāng)著我的面吹牛啡直,可吹牛的內(nèi)容都是我干的烁涌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼酒觅,長吁一口氣:“原來是場噩夢啊……” “哼撮执!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起舷丹,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抒钱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后掂榔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體继效,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年装获,在試婚紗的時候發(fā)現(xiàn)自己被綠了瑞信。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡穴豫,死狀恐怖凡简,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情精肃,我是刑警寧澤秤涩,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站司抱,受9級特大地震影響筐眷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜习柠,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一匀谣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧资溃,春花似錦武翎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春垫毙,著一層夾襖步出監(jiān)牢的瞬間霹疫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工综芥, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留更米,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓毫痕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親迟几。 傳聞我的和親對象是個殘疾皇子消请,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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

  • 第1章 Shell和vi 1.1什么是shell 在計算機(jī)科學(xué)中,Shell俗稱殼类腮,用來區(qū)別于Kernel(核)臊泰,...
    福爾摩雞閱讀 909評論 0 1
  • 買來一顆漂亮的大柚子 金黃的柚子皮 蓋不住果肉甜香 一瓣一瓣剝開 哎 又被老板坑了 中看不中吃的家伙
    彭小彭閱讀 88評論 0 0
  • 第一次做蔥油面的時候,給我老爸嘗蚜枢,他說老抽放多了缸逃,有點咸。我就馬上說厂抽,那明天你做給我吃吧需频!他說好,我明天做 第二天...
    天竺葵閱讀 235評論 0 0
  • 寂靜的黑夜里 無聲的空房間 徘徊的身影搖擺著 為誰而神傷 月光散漫窗戶 倒影出的孤影 沉吟的身軀低著頭 為誰而落寞...
    素昀閱讀 105評論 0 0