Git學(xué)習(xí)總結(jié)

Part 1 Git基本介紹

版本控制基本功能

所有的版本控制系統(tǒng),只能跟蹤文本文件的改動,比如TXT文件,網(wǎng)頁禁偎,所有的程序代碼等等,Git也不例外阀坏。版本控制系統(tǒng)可以告訴你每次的改動如暖,比如在第5行加了一個單詞“Linux”,在第8行刪了一個單詞“Windows”忌堂。而圖片盒至、視頻這些二進(jìn)制文件,雖然也能由版本控制系統(tǒng)管理士修,但沒法跟蹤文件的變化枷遂,只能把二進(jìn)制文件每次改動串起來,也就是只知道圖片從100KB改成了120KB棋嘲,但到底改了什么內(nèi)容酒唉,版本控制系統(tǒng)不知道,也沒法知道沸移。

Git優(yōu)勢

  1. 適合分布式開發(fā)痪伦,每一個個體都可以作為服務(wù)器。每一次Clone就是從服務(wù)器上pull到了所有的內(nèi)容雹锣,包括版本信息网沾。
  2. 公共服務(wù)器壓力和數(shù)據(jù)量都不會太大。
  3. 速度快蕊爵、靈活辉哥,分支之間可以任意切換。
  4. 任意兩個開發(fā)者之間可以很容易的解決沖突在辆,并且單機(jī)上就可以進(jìn)行分支合并证薇。
  5. 離線工作,不影響本地代碼編寫匆篓,等有網(wǎng)絡(luò)連接以后可以再上傳代碼浑度,并且在本地可以根據(jù)不同的需要,本地新建自己的分支鸦概。
  6. 在本機(jī)可以對同一個文件將它進(jìn)行簽出及修改箩张,并在最終簽入時甩骏,選擇保留哪一段代碼,如果在同一文件同一行有沖突時先慷,可以對沖突進(jìn)行選擇保留哪一個版本饮笛。
  7. 免費(fèi)。

Part 2 Git基本操作

本地操作

創(chuàng)建版本庫

  • Step 1: 創(chuàng)建項目目錄论熙,進(jìn)入目錄福青。

    $ mkdir myproject
    $ cd myproject
    
  • Step 2: 初始化本地倉庫。

    myproject $ git init
    myproject $ git add .
    myproject $ git commit -m "add myproject"
    

提交添加和修改操作

  • Step 1: 添加項目文件脓诡。創(chuàng)建文件example.txt无午,輸入文本This is an example.

  • Step 2: 提交修改祝谚。

    myproject $ git add example.txt
    myproject $ git commit -m "add example.txt"
    

查看倉庫狀態(tài)

  • 可以隨時查看倉庫的狀態(tài)

    myproject $ git status
    
  • 若倉庫狀態(tài)告知有修改宪迟,可以使用下屬命令查看具體修改內(nèi)容

    myproject $ git diff example.txt
    

版本退回

  • Step 1: 查看版本記錄。使用--pretty=oneline參數(shù)使顯示更簡潔交惯。

    myproject $ git log --pretty=oneline
    
  • Step 2: HEAD表示當(dāng)前版本次泽,HEAD^表示上一版本,HEAD^^表示上上一版本席爽,往上100個版本HEAD~100意荤。

    # 退回上一版本
    myproject $ git reset --hard HEAD^
    # 退回上上一個版本
    myproject $ git reset --hard HEAD^^
    

    或者通過git log查看提交歷史,找到每個版本的commit id,如xxxxx...,xxxxxcommit_id的前5位拳昌,則可以退回到xxxxx...對應(yīng)的版本

    myproject $ git reset --hard xxxxx
    

    若想再次返回到最新版袭异,但卻找不到最新版的commit id钠龙,則使用以下命令查看命令歷史

    myproject $ git reflog
    

    找到最新版本的commit id,再次使用git reset --hard commit_id即可返回最新版本

對比工作區(qū)文件與版本庫最新版本

  • 查看工作區(qū)和版本庫里面最新版本的區(qū)別

    myproject $ git diff HEAD -- example.txt
    

撤銷操作

  • Scenario 1: 當(dāng)改亂了工作區(qū)某個文件的內(nèi)容炬藤,想直接丟棄工作區(qū)的修改時

    myproject $ git checkout -- example.txt
    
  • Scenario 2: 當(dāng)不但改亂了工作區(qū)某個文件的內(nèi)容,還添加到了暫存區(qū)時碴里,想丟棄修改沈矿,分兩步

    • 使用以下命令回到Scenario 1
    myproject $ git reset HEAD example.txt
    
    • 按照Scenario 1中的命令撤銷操作
  • Scenario 3: 在沒有推送到遠(yuǎn)程庫而已經(jīng)提交了不合適的修改到本地版本庫時,想要撤銷本次提交, 參考版本退回*操作咬腋。

刪除文件

  • Step 1: 刪除文件

    myproject $ rm example.txt
    
  • Step 2.1: 確認(rèn)刪除

    myproject $ git rm example.txt
    myproject $ git commit -m "remove example.txt"
    
  • Step 2.2: 撤銷刪除羹膳,把誤刪的文件恢復(fù)到最新版本。

    myproject $ git checkout -- example.txt
    

    git checkout其實是用版本庫里的版本替換工作區(qū)的版本根竿,無論工作區(qū)是修改還是刪除

分支管理

  • 查看當(dāng)前分支

    $ git branch
    
  • 創(chuàng)建分支

    $ git branch <branch_name>
    
  • 切換分支

    $ git checkout <branch_name>
    
  • 創(chuàng)建分支并切換

    $ git checkout -b <branch_name>
    
  • 刪除分支

    # 無修改或完成所有提交下
    $ git branch -d <branch_name>
    # 有修改或有未完成的提交陵像,需要強(qiáng)行刪除
    $ git branch -D <branch_name>
    
  • 合并分支,合并指定分支到當(dāng)前分支

    $ git merge <branch_name>
    
  • 查看分支合并情況

    $ git log --graph --pretty=oneline --abbrev-commit
    
  • 普通模式合并。合并分支時寇壳,加上--no-ff參數(shù)就可以用普通模式合并醒颖,合并后的歷史有分支,能看出來曾經(jīng)做過合并壳炎,而fast forward合并就看不出來曾經(jīng)做過合并泞歉。

    $ git merge --no-ff -m "some infos" <branch_name>
    
  • 儲存當(dāng)前工作區(qū)。當(dāng)前工作尚未提交,但又接到比較緊急的任務(wù)腰耙,需要儲存當(dāng)前工作區(qū)榛丢,在完成緊急任務(wù)后讀取之前儲存的工作區(qū),繼續(xù)工作挺庞。

    • 儲存工作區(qū)
    $ git stash
    
    • 查看所儲存的工作區(qū)
    $ git stash list
    
    • 恢復(fù)工作區(qū)

      • 恢復(fù)后晰赞,stash內(nèi)容不刪除,需要手動刪除
      # 恢復(fù)
      $ git stash apply
      # 刪除
      $ git stash drop
      
      • 恢復(fù)切自動刪除stash中的內(nèi)容
      $git stash pop
      
      • 若儲存了多個工作區(qū)选侨,需要先使用git stash list查看stash內(nèi)容宾肺,再使用下列命令恢復(fù)
          git stash apply stash@{0}
      

解決沖突

在當(dāng)前分支修改了一文件,在某一分支對同一文件的同一地方做了修改侵俗,當(dāng)把該分支合并到當(dāng)前分支時锨用,由于是對同一個文件的同一個地方做了修改,會發(fā)生沖突隘谣。

解決方案:修改當(dāng)前分支的文件增拥,使其結(jié)果與合并后的相同,再提交寻歧。

標(biāo)簽管理

  • 新建標(biāo)簽

    # 默認(rèn)為HEAD
    $ git tag <tagname>
    # 可以指定 commit id
    $ git tag <tagname> commit_id
    
  • 指定標(biāo)簽信息

    $ git tag -a <tagname> -m "some infos"
    
  • 查看所有標(biāo)簽

    $ git tag
    
  • 刪除標(biāo)簽

    # 刪除本地標(biāo)簽
    $ git tag -d <tagname>
    # 刪除遠(yuǎn)程倉庫標(biāo)簽
    $ git tag -d <tagname>
    $ git push origin :refs/tags/<tagname>
    
  • 推送某個標(biāo)簽到遠(yuǎn)程

    # 推送標(biāo)簽到遠(yuǎn)程
    $ git push origin <tagname>
    # 推送全部未推送過的本地標(biāo)簽
    $ git push origin --tags
    

忽略特殊文件

當(dāng)出于保密等需求需要保留一些文件不推送它們時掌栅,需要使用忽略特殊文件。

  • Step 1: 在項目根目錄下新建文件.gitignore码泛。
  • Step 2: 將需要忽略的文件名或后綴添加在.gitignore猾封。

官方標(biāo)配.gitignore文件: https://github.com/github/gitignore

  • 需要強(qiáng)制加入被忽略的文件

    $ git add -f <file>
    

本地-遠(yuǎn)程交互操作

與遠(yuǎn)程庫建立聯(lián)系

  • Step 1: 生成密鑰,可以全部設(shè)置為默認(rèn)值噪珊。

    $ cd
    ~ $ ssh-keygen -t rsa -C "email@domain.com"
    
  • Step 2: 復(fù)制明碼到遠(yuǎn)程倉庫

    ~ $ cat .ssh/id_rsa.pub
    

    id_rsa.pub中的內(nèi)容復(fù)制晌缘,登陸遠(yuǎn)程倉庫如github.com,建立新的密鑰痢站,建立完成后可以直接通過命令行推送本地倉庫到遠(yuǎn)程倉庫磷箕。

添加遠(yuǎn)程倉庫

  • Step 1: 在遠(yuǎn)程倉庫新建Repository名為myproject

  • Step 2: 把一個已有的本地倉庫myproject與遠(yuǎn)程倉庫的myproject關(guān)聯(lián)阵难。

    $ git remote add origin git@github.com:Account/myproject.git
    

    其中,AccountGithub賬戶名岳枷,origin為遠(yuǎn)程庫的默認(rèn)名字

  • Step 3: 把本地倉庫的所有內(nèi)容推送到遠(yuǎn)程庫上

    $ git push -u origin master
    

    使用git push命令把當(dāng)前分支master推送到遠(yuǎn)程origin中。參數(shù)-u,Git不但會把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支呜叫,還會把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來空繁。

  • Step 4: 完成本地提交后,使用以下命令將本地master分支的最新修改推送至Github

從遠(yuǎn)程庫Clone到本地庫

  • Step 1: 準(zhǔn)備好遠(yuǎn)程庫的倉庫朱庆,如,account/myproject盛泡。

  • Step 2: 將遠(yuǎn)程庫account/myproject克隆到本地

    $ git clone git@github.com: account/myproject
    

從本地倉庫推送(push)到遠(yuǎn)程倉庫

  • 已經(jīng)關(guān)聯(lián)遠(yuǎn)程庫origin,需要將本地倉庫的分支同步到遠(yuǎn)程倉庫的分支

    $ git push origin <branch_name>
    

從遠(yuǎn)程倉庫拉回(pull)到本地倉庫

  • 已經(jīng)關(guān)聯(lián)遠(yuǎn)程庫origin椎工,需要將遠(yuǎn)程倉庫的分支同步到本地倉庫的分支

    $ git pull origin master
    

遠(yuǎn)程倉庫操作

  • 查看遠(yuǎn)程倉庫名字

    $ git remote
    
  • 查看遠(yuǎn)程倉庫詳細(xì)信息

    $ git remote -v
    
  • 刪除已關(guān)聯(lián)的遠(yuǎn)程倉庫

    # origin為遠(yuǎn)程倉庫名字
    $ git remote rm origin
    
  • 關(guān)聯(lián)多個遠(yuǎn)程倉庫饭于。假設(shè)當(dāng)前沒有任何關(guān)聯(lián)的遠(yuǎn)程倉庫蜀踏。

    # 先關(guān)聯(lián)Github的遠(yuǎn)程倉庫
    $ git remote add github git@github.com: Acount/repository_name.git
    # 再關(guān)聯(lián)Gitee的遠(yuǎn)程倉庫
    $ git remote add gitee git@gitee: Acount/repository_name.git
    # 推送到Github 
    $ git push github master
    # 推送到Gitee
    $ git push gitee master
    

Part 3 使用Git開發(fā)常見工作流

開源多人協(xié)作

  • Step 1: 選擇遠(yuǎn)程倉庫,如github.com,gitee.com等掰吕,注冊公用賬戶果覆,新建項目Repository,將本地倉庫與遠(yuǎn)程倉庫建立聯(lián)系殖熟,將本地代碼推送到遠(yuǎn)程局待。詳細(xì)操作步驟參閱Part 2中的本地-遠(yuǎn)程交互操作遠(yuǎn)程庫建立聯(lián)系添加遠(yuǎn)程倉庫小節(jié)。
  • Step 2: 每個開發(fā)者在相同的遠(yuǎn)程倉庫注冊個人賬戶菱属,將遠(yuǎn)程倉庫Clone到本地庫钳榨。詳細(xì)步驟參閱Part 2中的本地-遠(yuǎn)程交互操作從遠(yuǎn)程庫Clone到本地庫小節(jié)。
  • Step 3: 遠(yuǎn)程倉庫的master分支一般為發(fā)行版纽门,或穩(wěn)定版薛耻;新建分支dev為開發(fā)版,各個開發(fā)者在開發(fā)過程中推送本地的dev到遠(yuǎn)程赏陵,項目管理人定期或不定期從dev中更新master饼齿。
  • Step 4: 開發(fā)者試圖用git push origin <branch-name>推送自己的修改。
  • Step 5: 如果推送失敗蝙搔,則因為遠(yuǎn)程分支比你的本地更新缕溉,需要先用git pull試圖合并;如果合并有沖突吃型,則解決沖突证鸥,并在本地提交。
  • Step 6: 沒有沖突或者解決掉沖突后勤晚,再用git push origin <branch-name>推送就能成功枉层。
  • Step 7: 如果git pull提示no tracking information,則說明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒有創(chuàng)建运翼,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>返干。

閉源多人協(xié)作

與前文開源多人協(xié)作的不同之處是兴枯,閉源多人協(xié)作需要搭建私有Git服務(wù)器血淌。搭建Git服務(wù)器需要準(zhǔn)備一臺運(yùn)行Linux的機(jī)器,推薦使用Ubuntu财剖。

  • Step 1: 安裝git

    $ sudo apt-get install git
    
  • Step 2: 創(chuàng)建一個git用戶悠夯,用來運(yùn)行g(shù)it服務(wù)

    $ sudo adduser git
    
  • Step 3: 創(chuàng)建證書登錄。收集所有需要登錄的用戶的公鑰躺坟,就是他們自己的id_rsa.pub文件沦补,把所有公鑰導(dǎo)入到/home/git/.ssh/authorized_keys文件里,一行一個咪橙。此步驟原理類似前文本地-遠(yuǎn)程交互操作中的與遠(yuǎn)程庫建立聯(lián)系夕膀。

  • Step 4: 初始化倉庫虚倒。選定一個目錄作為Git倉庫,如/srv/sample.git

    $ cd /srv
    srv $ sudo git init --bare sample.git
    # 限制用戶直接登錄服務(wù)器修改倉庫
    srv $ sudo chown -R git:git sample.git
    
  • Step 5: 出于安全考慮产舞,禁用shell登陸魂奥。編輯/etc/passwd文件完成。找到類似下面的一行:

    git:x:1001:1001:,,,:/home/git:/bin/bash
    

    修改為

    git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
    

    則git用戶可以正常通過ssh使用git易猫,但無法登錄shell耻煤。

之后步驟同前開源多人協(xié)作中的Step 2~Step 7

個人開發(fā)

個人開發(fā)單純基于本地倉庫准颓,不涉及到與遠(yuǎn)程倉庫的交互哈蝇。

  • Step 1: 選擇項目目錄myproject,初始化倉庫攘已,詳情參閱前文本地操作中的創(chuàng)建版本庫炮赦。
  • Step 2: 其他操作諸如添加、刪除样勃、修改新文件眼五、添加新特性、修改bug等參考前文本地操作彤灶。

Part 4 參考資料

站在巨人的肩膀上學(xué)習(xí)看幼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市幌陕,隨后出現(xiàn)的幾起案子诵姜,更是在濱河造成了極大的恐慌,老刑警劉巖搏熄,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棚唆,死亡現(xiàn)場離奇詭異,居然都是意外死亡心例,警方通過查閱死者的電腦和手機(jī)宵凌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來止后,“玉大人瞎惫,你說我怎么就攤上這事∫胫辏” “怎么了瓜喇?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長歉糜。 經(jīng)常有香客問我乘寒,道長,這世上最難降的妖魔是什么匪补? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任伞辛,我火速辦了婚禮烂翰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚤氏。我一直安慰自己刽酱,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布瞧捌。 她就那樣靜靜地躺著棵里,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姐呐。 梳的紋絲不亂的頭發(fā)上殿怜,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機(jī)與錄音曙砂,去河邊找鬼头谜。 笑死,一個胖子當(dāng)著我的面吹牛鸠澈,可吹牛的內(nèi)容都是我干的柱告。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼笑陈,長吁一口氣:“原來是場噩夢啊……” “哼际度!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涵妥,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤乖菱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蓬网,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窒所,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年帆锋,在試婚紗的時候發(fā)現(xiàn)自己被綠了吵取。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡锯厢,死狀恐怖皮官,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哲鸳,我是刑警寧澤臣疑,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站徙菠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏郁岩。R本人自食惡果不足惜婿奔,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一缺狠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧萍摊,春花似錦挤茄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至踊沸,卻和暖如春歇终,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逼龟。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工评凝, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腺律。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓奕短,卻偏偏與公主長得像,于是被迫代替她去往敵國和親匀钧。 傳聞我的和親對象是個殘疾皇子翎碑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

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

  • 安裝Git Git的下載地址:Git官網(wǎng)下載地址 Git本地倉庫和命令 配置用戶 下載完Git后,右鍵會有一個Gi...
    TokyoZ閱讀 4,494評論 1 7
  • Git for windows 本文只是自己的一些學(xué)習(xí)總結(jié)之斯,方便自己查看杈女,如果對您閱讀不適,抱歉5趸4镆! 常用命令(...
    Lxs_597閱讀 332評論 0 0
  • 昨天開始學(xué)習(xí)git项乒,摸索一天啰劲,記下若干要點,權(quán)當(dāng)學(xué)習(xí)筆記檀何,以備查漏補(bǔ)缺蝇裤。 GIT配置 ** 安裝 **window...
    風(fēng)間莫一閱讀 210評論 2 1
  • Git是什么? Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)(沒有之一)频鉴。作為一個開發(fā)者栓辜,git這樣的技能基本上是...
    ikook閱讀 2,882評論 12 129
  • 有一天, 恰恰在追問麻麻垛孔, 到底喜歡什么蟲子藕甩? 于是,一場爆笑問答開始啦周荐! 麒羽的麒言妙羽狭莱, 有文僵娃、有畫、有故事腋妙、...
    麒羽記閱讀 309評論 0 3