git總結(jié)

一靡羡、簡(jiǎn)介

1.概述

Git 是一個(gè)開(kāi)源的分布式版本控制系統(tǒng)隆判,用于敏捷高效地處理任何或小或大的項(xiàng)目麻蹋。
Git 是 Linus Torvalds 為了幫助管理 Linux 內(nèi)核開(kāi)發(fā)而開(kāi)發(fā)的一個(gè)開(kāi)放源碼的版本控制軟件。
Git 與常用的版本控制工具 CVS, Subversion 等不同佛嬉,它采用了分布式版本庫(kù)的方式夜只,不必服務(wù)器端軟件支持垒在。


集中式和分布式管理工具.png

2.工作流程

一般工作流程如下:

  1. 克隆 Git 資源作為工作目錄。
  2. 在克隆的資源上添加或修改文件扔亥。
  3. 如果其他人修改了场躯,你可以更新資源。
  4. 在提交前查看修改旅挤。
  5. 提交修改踢关。
  6. 在修改完成后,如果發(fā)現(xiàn)錯(cuò)誤粘茄,可以撤回提交并再次修改并提交签舞。


    git工作流程.png

3.基本配置

  1. git config: 環(huán)境設(shè)置命令
    通常情況下,安裝完Git后的第一件事就是設(shè)置用戶(hù)名稱(chēng)和郵件地址柒瓣。每一個(gè)Git的提交都會(huì)使用這些信息儒搭,如果不設(shè)置則無(wú)法進(jìn)行提交。

    git config --global user.name "goto456" // 設(shè)置用戶(hù)名稱(chēng)
    git config --global user.email "goto456@126.com" // 設(shè)置郵件地址
    

    使用--global參數(shù)表示設(shè)置了全局的環(huán)境芙贫,如果想對(duì)與特定的項(xiàng)目使用不同的用戶(hù)名和郵件地址搂鲫,則可已在該項(xiàng)目目錄下不使用--global參數(shù)設(shè)置不同的用戶(hù)名和郵件地址。

    git config --list命令可以列出當(dāng)前Git所有的配置信息磺平。

  2. ssh-keygen: 生成SSH公鑰
    生成公鑰之前先檢查系統(tǒng)中是否已經(jīng)有了公鑰魂仍,公鑰一般在~/.ssh/目錄下。如果該目錄下存在id_rsa.pub文件褪秀,這就是公鑰(id_rsa 文件是私鑰)蓄诽;如果不存在此文件薛训,甚至連.ssh目錄都不存在媒吗,則需要用 ssh-keygen 命令來(lái)生成。如下所示:

    ssh-keygen // 然后一直按回車(chē)鍵 
    

    這就可以生成 SSH key 了乙埃,公鑰id_rsa.pub文件的內(nèi)容大致如下所示:

    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/bdrJjo6HNCuzhpTZNVsTju5NnksTca2kRzfbZlFs+8S4bs8hTlo6aV/GJPkTT0zxJfuOgfd4B4O8Xh0NQg51Zl4yCsFdnIKFA0tgBOg/H5oi48Ypoo8hHfvtxqYrG1Blhf0t6HhkHz9Fd8StCUIDQv7yHHvuuPFumh3/8PNG8DDPQqWsqXmK2XozT goto456@126.com
    

二闸英、基本命令

1.獲取倉(cāng)庫(kù)

獲取一個(gè) Git 倉(cāng)庫(kù)有2中方法:
本地初始化一個(gè)倉(cāng)庫(kù)
從遠(yuǎn)程克隆一個(gè)倉(cāng)庫(kù)到本地

對(duì)于第1種方式,如果想對(duì)本地現(xiàn)有的一個(gè)項(xiàng)目用 Git 來(lái)管理介袜,可以直接進(jìn)入該項(xiàng)目的目錄下執(zhí)行如下命令甫何,就可以將其初始化成一個(gè) Git 倉(cāng)庫(kù)了:git init

對(duì)于第二種方式,也是最常用的方式遇伞,比如你在 GitHub 上(或者其他代碼托管網(wǎng)站)已經(jīng)建立了一個(gè)項(xiàng)目辙喂,你就可以將該項(xiàng)目從遠(yuǎn)程克隆到本地,這就有了該項(xiàng)目在本地的 Git 倉(cāng)庫(kù)。

git clone git@github.com:goto456/leetcode.git // 通過(guò)ssh方式克隆
git clone https://github.com/goto456/leetcode.git // 通過(guò)https方式克隆

以上2種方式有如下區(qū)別:

  1. https方式:不管是誰(shuí)巍耗,只要拿到該項(xiàng)目的 url 可以隨便 clone秋麸,但是在 push 到遠(yuǎn)程的時(shí)候需要驗(yàn)證用戶(hù)名和密碼;
  2. ssh方式:需要現(xiàn)將你電腦的SSH key(SSH公鑰)添加到GitHub(或者其他代碼托管網(wǎng)站)上炬太,這樣在 clone 項(xiàng)目和 push 項(xiàng)目到遠(yuǎn)程時(shí)都不需要輸入用戶(hù)名和密碼灸蟆。

2.工作區(qū)、暫存區(qū)和版本庫(kù)

工作區(qū)(Working Directory):就是你在電腦里能看到的目錄
版本庫(kù)(Repository):工作區(qū)有一個(gè)隱藏目錄.git亲族,這個(gè)不算工作區(qū)炒考,而是Git的版本庫(kù)。

Git的版本庫(kù)里存了很多東西霎迫,其中最重要的就是稱(chēng)為stage(或者叫index)的暫存區(qū)斋枢,還有Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支master
,以及指向master的一個(gè)指針叫HEAD知给。


工作區(qū)暫存區(qū)和版本庫(kù).png

3.提交修改

  1. git status 查看當(dāng)前狀態(tài)
    可以在任何時(shí)候使用該命令查看當(dāng)前的狀態(tài)杏慰。一般會(huì)顯示當(dāng)前所處的分支,以及當(dāng)前工作區(qū)是否干凈炼鞠,是否有文件要提交缘滥。
    當(dāng)你克隆遠(yuǎn)程倉(cāng)庫(kù)到本地后,通過(guò)該命令查看當(dāng)前狀態(tài)時(shí)谒主,顯示信息如下圖所示:


    查看當(dāng)前狀態(tài)1.png

    當(dāng)你修改了一個(gè)文件后朝扼,再用該命令查看當(dāng)前狀態(tài),顯示信息如下圖所示:


    查看當(dāng)前狀態(tài)2.png
  2. git diff: 顯示變更內(nèi)容
    當(dāng)你對(duì)文件進(jìn)行了修改霎肯,想查看進(jìn)行了哪些修改時(shí)擎颖,可以通過(guò)該命令查看。
    git diff命令會(huì)顯示修改的文件中哪些內(nèi)容進(jìn)行了修改观游,包括新增了哪些內(nèi)容搂捧,刪除了哪些內(nèi)容。

    git diff README.md      //后面接文件名懂缕,表示只顯示該文件的變更
    

    例如:我對(duì) README.md 文件進(jìn)行了修改允跑,刪除了1行,新增了2行搪柑,然后用該命令查看進(jìn)行了哪些修改聋丝,如下圖所示: (“+” 表示新增的內(nèi)容,“-” 表示刪除的內(nèi)容)


    查看內(nèi)容變更.png
  3. git add: 添加到暫存區(qū)
    無(wú)論你新增了一個(gè)文件或者對(duì)已有的文件進(jìn)行了修改工碾,都需要將其添加到暫存區(qū)弱睦,然后提交到版本庫(kù)。

    git add hello.txt      //后面接文件名渊额,表示將某個(gè)文件添加到暫存區(qū)   
    git add .                 //后面接一個(gè)點(diǎn)况木,表示將全部文件添加到暫存區(qū)
    

    如果是刪除的文件垒拢,用git add -A 文件名,或者git rm 文件名 添加到暫存區(qū)


    添加hellow文件.png
  4. git commit: 提交到版本庫(kù)
    該命令是將添加到暫存區(qū)的變更提交到版本庫(kù):

    git commit -m "變更的說(shuō)明信息" 
    
    提交到版本庫(kù).png

4.撤銷(xiāo)修改與版本回退

  1. 撤銷(xiāo)文件的修改包括以下兩個(gè)場(chǎng)景:
    從工作區(qū)撤銷(xiāo)某個(gè)文件修改(修改當(dāng)然也包括刪除):
    git checkout -- filename //filename替換為你想撤回的文件名
    
    從暫存區(qū)撤銷(xiāo)某個(gè)文件修改:
    git reset HEAD filename  //filename替換為你想撤回的文件名
    
  2. 回退版本
    git log: 查看歷史提交
    如果發(fā)現(xiàn)提交了一個(gè)錯(cuò)誤版本火惊,想回退到上個(gè)版本時(shí)子库,就可以通過(guò)該命令來(lái)查看所有的歷史版本,以選擇回退到歷史的哪個(gè)版本矗晃。
    git log                  //查看歷史版本
    git log --graph     //以圖形的方式查看歷史
    
    執(zhí)行后仑嗅,如下圖所示:
    查看歷史提交1.png

    git reset: 回退版本
    常用于回退版本或者在各個(gè)版本間進(jìn)行跳躍切換。 我們可以先用 git log 看一下當(dāng)前歷史版本张症,如下圖所示:
    查看歷史提交2.png

    如果要回退兩個(gè)版本仓技,則只需要輸入:git reset HEAD~2或者git reset --hard a8336834b50daafa0793370

5.拉取與提交

  1. git pull: 拉取遠(yuǎn)程分支到本地并合并
    一般是本地分支的進(jìn)度落后于遠(yuǎn)程分支時(shí),需要使用該命令俗他。
    命令:git pull origin master
    origin 表示遠(yuǎn)程代碼庫(kù)的一個(gè)別名(也可以修改為其他名字脖捻,可通過(guò) git remote 修改),master 表示需要拉取合并的分支名稱(chēng)兆衅。
    命令:git pull --rebase origin master用 rebase 的方式進(jìn)行地沮,不會(huì)產(chǎn)生 merge 保持分支干凈、整潔

  2. git push: 推送本地分支到遠(yuǎn)程
    當(dāng)修改完成羡亩,本地的改動(dòng)都已經(jīng)提交到本地庫(kù)摩疑,則可以將本地分支推送到遠(yuǎn)程代碼庫(kù)了。
    命令:git push origin master
    origin 表示遠(yuǎn)程代碼庫(kù)的一個(gè)別名(也可以修改為其他名字畏铆,可通過(guò) git remote 修改)雷袋,master 表示需要推送的分支名稱(chēng)。
    如果辞居,push 的過(guò)程中提示當(dāng)前分支進(jìn)度落后于遠(yuǎn)程的分支楷怒,則需要通過(guò) git pull 命令來(lái)拉取遠(yuǎn)程最新?tīng)顟B(tài)和本地分支進(jìn)行合并,完成之后再 push 到遠(yuǎn)程就可以了瓦灶。

6.標(biāo)簽管理

git tag: 標(biāo)簽的操作
用于給某次提交打個(gè)標(biāo)簽鸠删,例如截止到某次提交后完成了某個(gè)重大版本的開(kāi)發(fā),則可以在該次提交打上一個(gè)版本的 tag 贼陶。

命令:git tag v1.0 為當(dāng)前提交打上 v1.0 的標(biāo)簽
命令:git tag v1.0 ab1591eb4e06c1e93fdd50126b9fab8a88d89155 為這個(gè)節(jié)點(diǎn)打上 v1.0 的標(biāo)簽
命令:git tag -a <tagname> -m "blablabla..."可以指定標(biāo)簽信息刃泡;
命令:git tag可以查看所有標(biāo)簽。
命令:git show tag_name 顯示某個(gè) tag 的詳細(xì)信息(git show commit_id 顯示某次提交的詳細(xì)信息)
命令:git push origin <tagname>可以推送一個(gè)本地標(biāo)簽每界;
命令:git push origin --tags可以推送全部未推送過(guò)的本地標(biāo)簽捅僵;
命令:git tag -d <tagname>可以刪除一個(gè)本地標(biāo)簽家卖;
命令:git push origin :refs/tags/<tagname>提交到遠(yuǎn)端眨层。

三、分支使用及場(chǎng)景

1.分支總覽

當(dāng)前分支.png
創(chuàng)建dev分支.png
master分支合并dev分支.png
刪除dev分支.png

2.創(chuàng)建上荡、刪除與合并分支

git branch用于顯示本地所有分支以及當(dāng)前所在哪個(gè)分支趴樱。圖中顯示本地有 master 和 dev 兩個(gè)分支馒闷,并且正處在 master 分支上。git branch -vv還能看到遠(yuǎn)程分支與關(guān)聯(lián)情況:

查看當(dāng)前所處分支.png

git branch branchName用于新建名為 branchName 的新分支叁征。后接origin/dev纳账,標(biāo)識(shí)創(chuàng)建分支并關(guān)聯(lián)dev分支:
創(chuàng)建分支.png

git branch -D branchName用于刪除名為 branchName 的分支:
刪除分支.png

git checkout branchName用于從當(dāng)前分支切換到名為 branchName的分支上:
切換分支.png

git checkout -b branchName用于新建名為 branchName的分支并切換到該分支上。后面同樣可以接origin/dev這樣的參數(shù)捺疼,表示并關(guān)聯(lián)遠(yuǎn)程的dev分支:
新建并切換到新建的分支.png

git merge命令用于合并指定分支到當(dāng)前分支疏虫。
需要注意的是,如果對(duì)同一份文件做了不同的修改啤呼,就會(huì)產(chǎn)生沖突卧秘,這時(shí)候需要手動(dòng)解決沖突,再提交官扣,完成merge翅敌。
例如以下文件就是在merge的時(shí)候產(chǎn)生的沖突:

<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

3.分支策略管理

在實(shí)際開(kāi)發(fā)中,我們應(yīng)該按照幾個(gè)基本原則進(jìn)行分支管理:
首先惕蹄,master分支應(yīng)該是非常穩(wěn)定的蚯涮,也就是僅用來(lái)發(fā)布新版本,平時(shí)不能在上面干活卖陵;
那在哪干活呢遭顶?干活都在dev分支上,也就是說(shuō)泪蔫,dev分支是不穩(wěn)定的液肌,到某個(gè)時(shí)候,比如1.0版本發(fā)布時(shí)鸥滨,再把dev分支合并到master上嗦哆,在master分支發(fā)布1.0版本;
你和你的小伙伴們每個(gè)人都在dev分支上干活婿滓,每個(gè)人都有自己的分支老速,時(shí)不時(shí)地往dev分支上合并就可以了。
所以凸主,團(tuán)隊(duì)合作的分支看起來(lái)就像這樣:


分支策略管理.png

4.臨時(shí)保存工作現(xiàn)場(chǎng)

修復(fù)bug時(shí)橘券,我們會(huì)通過(guò)創(chuàng)建新的bug分支進(jìn)行修復(fù),然后合并卿吐,最后刪除旁舰;
當(dāng)手頭工作沒(méi)有完成時(shí),先把工作現(xiàn)場(chǎng)git stash一下嗡官,然后去修復(fù)bug箭窜,修復(fù)后,再git stash pop衍腥,回到工作現(xiàn)場(chǎng)磺樱;

5.從某個(gè)分支的提交復(fù)制粘貼到另一個(gè)分支

git cherry-pick <commit>
也可以用AndroidStudio工具纳猫,進(jìn)行cherry-pick,這里就不詳細(xì)展開(kāi)了

6.AndroidStudio查看git操作

這里主要介紹常用的git diff圖形化界面:


AndroidStudioGit.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末竹捉,一起剝皮案震驚了整個(gè)濱河市芜辕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌块差,老刑警劉巖侵续,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異憨闰,居然都是意外死亡询兴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)起趾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)诗舰,“玉大人,你說(shuō)我怎么就攤上這事训裆】舾” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵边琉,是天一觀的道長(zhǎng)属百。 經(jīng)常有香客問(wèn)我,道長(zhǎng)变姨,這世上最難降的妖魔是什么族扰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮定欧,結(jié)果婚禮上渔呵,老公的妹妹穿的比我還像新娘。我一直安慰自己砍鸠,他們只是感情好扩氢,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著爷辱,像睡著了一般录豺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饭弓,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天双饥,我揣著相機(jī)與錄音,去河邊找鬼弟断。 笑死咏花,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的夫嗓。 我是一名探鬼主播迟螺,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼冲秽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼舍咖!你這毒婦竟也來(lái)了矩父?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤排霉,失蹤者是張志新(化名)和其女友劉穎窍株,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體攻柠,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡球订,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瑰钮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冒滩。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖浪谴,靈堂內(nèi)的尸體忽然破棺而出开睡,到底是詐尸還是另有隱情,我是刑警寧澤苟耻,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布篇恒,位于F島的核電站,受9級(jí)特大地震影響凶杖,放射性物質(zhì)發(fā)生泄漏胁艰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一智蝠、第九天 我趴在偏房一處隱蔽的房頂上張望腾么。 院中可真熱鬧,春花似錦杈湾、人聲如沸哮翘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)饭寺。三九已至,卻和暖如春叫挟,著一層夾襖步出監(jiān)牢的瞬間艰匙,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工抹恳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留员凝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓奋献,卻偏偏與公主長(zhǎng)得像健霹,于是被迫代替她去往敵國(guó)和親旺上。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345