Git知識(shí)梳理及基礎(chǔ)操作

概念相關(guān)

Git概念

  • Git 是目前業(yè)界最流行的分布式版本控制系統(tǒng)(Version Control System)岔擂,本質(zhì)上來(lái)說(shuō)Git是個(gè)軟件
    • 分布式
      • 客戶端并不只提取最新版本的文件快照位喂, 而是把代碼倉(cāng)庫(kù)完整地鏡像下來(lái),包括完整的歷史記錄乱灵。 這么一來(lái)塑崖,任何一處協(xié)同工作用的服務(wù)器發(fā)生故障,事后都可以用任何一個(gè)鏡像出來(lái)的本地倉(cāng)庫(kù)恢復(fù)
    • 版本控制
      • 版本控制是一種記錄一個(gè)或若干文件內(nèi)容變化痛倚,以便將來(lái)查閱特定版本修訂情況的系統(tǒng)

Git概念的理解

這里用大學(xué)生寫(xiě)論文這個(gè)事做比對(duì)规婆,加深理解

  1. 你準(zhǔn)備寫(xiě)論文蝉稳,先立題抒蚜,然后開(kāi)始收集資料,最后開(kāi)始動(dòng)筆耘戚。這個(gè)過(guò)程就可以看作使用git軟件在本地創(chuàng)建倉(cāng)庫(kù)(或者是從github/gitlab上拉代碼下來(lái))嗡髓,準(zhǔn)備完成項(xiàng)目的初始版本
  2. 論文初稿寫(xiě)好了,要仔細(xì)檢查一遍收津,然后提交給老師器贩。這個(gè)過(guò)程可以理解為使用git將寫(xiě)好的項(xiàng)目發(fā)送到github/gitlab,準(zhǔn)備接下來(lái)的測(cè)試朋截,需求對(duì)接,以及找bug
  3. 然后在接下來(lái)的2個(gè)月內(nèi)吧黄,老師來(lái)來(lái)回回的給你提出了10多個(gè)甚至更多的問(wèn)題部服,你就來(lái)來(lái)回回的改。這個(gè)過(guò)程就可以理解為每當(dāng)你發(fā)現(xiàn)了代碼有問(wèn)題拗慨,就使用git用你的修改后的代碼更新github/gitlab上的代碼廓八,每次更新負(fù)責(zé)檢查你的代碼的人都看得到奉芦,并且還會(huì)提過(guò)新的問(wèn)題
  4. 老師說(shuō)OK了,可以提交論文剧蹂,算你過(guò)了声功。這個(gè)過(guò)程就可以理解為你的本地代碼經(jīng)過(guò)了無(wú)數(shù)的更改后,終于穩(wěn)定了宠叼,可以拿給客戶用了先巴,更新最終版本到github/gitlab上,部署上線···

GitHub

  • GitHub 本質(zhì)上是一個(gè)代碼托管平臺(tái)冒冬,它提供的是基于 Git 的代碼托管服務(wù)伸蚯。
  • 對(duì)于一個(gè)團(tuán)隊(duì)來(lái)說(shuō),即使不使用 GitHub简烤,他們也可以通過(guò)自己搭建和管理 Git 服務(wù)器來(lái)進(jìn)行代碼庫(kù)的管理

Git三大區(qū)域

  • 工作區(qū)
    • 就是你寫(xiě)代碼的地方剂邮,代碼在哪個(gè)文件夾下
  • 暫存區(qū)
    • 暫存區(qū)是用來(lái)存放你使用git軟件跟蹤文件具體變化的區(qū)域。要注意的是横侦,工作區(qū)的代碼在沒(méi)有使用git軟件管理前挥萌,和版本庫(kù)沒(méi)有任何關(guān)系
  • 版本庫(kù)
    • 是指代碼托管平臺(tái),存儲(chǔ)你上傳的每次更改結(jié)果枉侧,當(dāng)然也可以拉取遠(yuǎn)程代碼到本地

分支

  • 一般每個(gè)代碼都有master分支引瀑,master分支包含了上線版本的完整代碼。
  • 在開(kāi)發(fā)測(cè)試階段棵逊,有可能master分支代碼有問(wèn)題伤疙,那么就可以基于master代碼做出代碼更改,但是代碼更改又不是全部更改辆影,可能指更改幾行徒像,或者添加新的文件等等,那么此時(shí)就要?jiǎng)?chuàng)建新的分支(粗俗的理解為復(fù)制master代碼一份蛙讥,(但是真實(shí)情況锯蛀,是用指針指向?qū)崿F(xiàn)的,不是復(fù)制)次慢,指針同時(shí)指向新創(chuàng)建的分支以及master旁涤,此時(shí)還沒(méi)有做任何更改),然后更改新分支內(nèi)容的文件迫像,修改好沒(méi)有問(wèn)題劈愚,就可以提交新分支到代碼托管平臺(tái),此時(shí)遠(yuǎn)端就可以看得到新的一個(gè)分支的產(chǎn)生闻妓,再?zèng)Q定是否需要合并到master分支

Git準(zhǔn)備

安裝Git

# Ubuntu上安裝
sudo apt install git-all

# mac會(huì)提示你進(jìn)行安裝
git --version 

設(shè)置Git的user信息

三個(gè)不同的作用域菌羽,默認(rèn)為local

  • git config --local user.name

    • 如果在本地環(huán)境中需要管理多個(gè)git用戶,一般在某個(gè)你需要管理的本地git倉(cāng)庫(kù)內(nèi)設(shè)置(局部倉(cāng)庫(kù)生效)
  • git config --global user.email

    • 一般來(lái)講第一次設(shè)置或者是只有一個(gè)賬戶需要管理的話由缆,設(shè)置全局用戶信息即可注祖,完整命令如下
    • git config --global user.email your_email@domain.com
    • git config --global user.name your_name
  • git config --system

    • 針對(duì)系統(tǒng)所有登錄的用戶都有效猾蒂,用的不多
  1. 顯示git 本機(jī)的配置

  • git config --list --local

  • git config --list --global

  • git config --list --system

配置優(yōu)先級(jí)

local > global

  • 如果全局配置已經(jīng)配置好,那么在當(dāng)前倉(cāng)庫(kù)下可以重新設(shè)置本地的user.name和user.email是晨,那么之后的提交(commit)都以本地的user.name 和user.email為準(zhǔn)

基本命令

初始化倉(cāng)庫(kù)

創(chuàng)建本地版本庫(kù)

  1. 創(chuàng)建一個(gè)準(zhǔn)備放完整項(xiàng)目的文件夾(mkdir your_project_name)

  2. cd 到新創(chuàng)建的文件夾 (cd your_project_name)

  3. 在文件夾里面初始化倉(cāng)庫(kù) (git init)

  4. 將本地所有內(nèi)容(包括不同分支)推送到遠(yuǎn)程倉(cāng)庫(kù)

    git remote add origin https://github.com/user/repo.git
    git push --all
    

克隆遠(yuǎn)端版本庫(kù)

  1. 從遠(yuǎn)程拉取master代碼肚菠,建立本地庫(kù)和遠(yuǎn)端的連接(git clone gitlab/github倉(cāng)庫(kù)地址)
    • https方式
    • ssh方式
      • 需要配置密鑰
  2. cd your_project_name
    • 可以進(jìn)行新建分支,更改代碼等操作了

管理分支

理解

舉例來(lái)說(shuō)罩缴,從遠(yuǎn)端第一次clone代碼下來(lái)蚊逢,默認(rèn)是master分支,那么在本地就會(huì)生成遠(yuǎn)端master的鏡像靴庆,此時(shí)本地分支的名稱也是master时捌,一般來(lái)講不推薦在本地的master分支上做協(xié)同開(kāi)發(fā),而是要基于master創(chuàng)建一個(gè)新的分支炉抒,在此分支上進(jìn)行相應(yīng)的開(kāi)發(fā)工作

查看分支

  • git branch -a
    • 查看所有分支
  • git branch -v
    • 查看本地分支
  • git branch -r
    • 查看所有遠(yuǎn)程分支
  • git branch -vv
    • 查看本地分支和遠(yuǎn)程分支的關(guān)系以及版本情況

創(chuàng)建本地新分支(基于當(dāng)前所在分支)

以下這幾個(gè)命令都可以達(dá)成目的

  • git checkout -b branch_name
    • 創(chuàng)建分支branch_name奢讨,并切換到branch_name分支
  • git switch -c branch_name
    • 創(chuàng)建分支branch_name,并切換到branch_name分支
  • git branch branch_name
    • 創(chuàng)建分支
  • git checkout branch_name
    • 切換分支

拉取最新代碼

一般在改動(dòng)前焰薄,都要先更新下最新代碼(將遠(yuǎn)端代碼拉下來(lái)拿诸,避免別人修改過(guò)和你的版本有沖突)

  • git pull
    • 一般不指定的情況下,將當(dāng)前工作區(qū)的分支名稱的最新版本代碼拉取下來(lái)
  • git pull origin branch_name
    • 拉取遠(yuǎn)端指定分支代碼塞茅,更新本地
  • git checkout -b new_branch origin/new_branch
    • 基于遠(yuǎn)端分支創(chuàng)建本地分支并切換到本地分支
  • git fetch + git merge
    • 基于遠(yuǎn)端同一個(gè)分支做更改亩码,可能會(huì)產(chǎn)生沖突,先f(wàn)etch看下和本地當(dāng)前分支有哪些不同野瘦,沒(méi)有問(wèn)題就將遠(yuǎn)程修改合并到我當(dāng)前的本地分支
    • 對(duì)于不同人對(duì)不同文件在遠(yuǎn)端內(nèi)容的修改描沟,git會(huì)自動(dòng)檢測(cè)合并,不會(huì)發(fā)生沖突

修改工作區(qū)內(nèi)容并提交

工作區(qū)的內(nèi)容變更需要先提交到暫存區(qū)鞭光,然后確認(rèn)無(wú)誤后可以確認(rèn)并推送到遠(yuǎn)端進(jìn)行版本的更新吏廉,如果有問(wèn)題,也可以撤銷修改等

  • git add 你修改的文件/新添加的文件
    • add的作用就是將工作區(qū)(你修改的內(nèi)容)內(nèi)容的變動(dòng)提交到暫存區(qū)惰许,后面可以提交席覆,也可以撤銷,如果是新文件汹买,則是將此文件開(kāi)始納入被git跟蹤版本的范圍
    • -u
      • 參數(shù)佩伤,如果一次修改了多個(gè)文件,不需要帶文件名晦毙,可以將已經(jīng)被git管理的文件一次性添加到暫存區(qū)
  • git commit -m "你本次提交對(duì)于版本內(nèi)容變更的描述生巡,越詳細(xì)越好"
    • 將暫存區(qū)的變動(dòng)確認(rèn),生成新的版本號(hào)信息见妒,本地新版本生成孤荣,之后就可以推送到遠(yuǎn)端了
  • git commit -am "你本次提交對(duì)于版本內(nèi)容變更的描述,越詳細(xì)越好"
    • 這是上面add + commit命令的合并,這一條命令即可生成一個(gè)新的版本號(hào)垃环,之后可以推送到遠(yuǎn)端版本庫(kù)

推送分支到遠(yuǎn)端倉(cāng)庫(kù)

本地版本生成后(有了commit ID之后),雖然你本地的代碼已經(jīng)更新了返敬,但是遠(yuǎn)端并不知道遂庄,別人也就看不到,這時(shí)候可以選擇推送到遠(yuǎn)端進(jìn)行合并操作劲赠,推送過(guò)去別人就能看到你的代碼更新內(nèi)容了

  • git push
    • 推送當(dāng)前分支版本內(nèi)容到遠(yuǎn)程分支(遠(yuǎn)程如果有此分支涛目,則是更新操作,如果沒(méi)有此分支凛澎,則會(huì)創(chuàng)建一個(gè)新的分支霹肝,名稱和你本地的當(dāng)前分支名稱一樣
    • git branch --set-upstream-to origin/分支名
      • 如果當(dāng)前分支和云端分支沒(méi)有關(guān)系的情況下(一般來(lái)講第一次,會(huì)有提示)塑煎,那么這樣可以建立關(guān)系
    • git branch --unset-upstream
      • 刪除本地當(dāng)前分支和遠(yuǎn)程分支的映射關(guān)系

合并其他分支代碼到master分支

一般來(lái)講沫换,其他分支的修改都是會(huì)最終合并到一個(gè)分支上的(這里以master為例)

  • git merge branch_name
    • 將branch_name的分支合并到當(dāng)前所在分支

刪除分支

刪除分支要注意的是,不能在當(dāng)前分支刪除當(dāng)前分支最铁,至少先要切換到別的分支

  • git checkout -d branch_name
    • 在本地修改完了分支內(nèi)容之后讯赏,可對(duì)分支進(jìn)行刪除操作
  • git branch -D branch_name
    • 強(qiáng)制刪除一個(gè)還沒(méi)有合并的分支
  • git push origin --delete <branch_name>
    • 刪除遠(yuǎn)程分支,按照分支名稱刪除
  • git push origin --delete tag <tag_name>
    • 刪除遠(yuǎn)程分支(按照標(biāo)簽)

工作區(qū)/暫存區(qū)撤銷

  • git reset HEAD -- filename

    • HEAD表示拉取最新代碼下來(lái)沒(méi)有做改動(dòng)的版本(最新版本)
    • 暫存區(qū)內(nèi)容都不要了冷尉,恢復(fù)到和HEAD版本一樣
  • git reset HEAD

    • 將暫存區(qū)所有改動(dòng)清空漱挎,返回當(dāng)前指向的HEAD版本內(nèi)容
  • git checkout -- filename

    • 將工作區(qū)內(nèi)容和暫存區(qū)內(nèi)容同步(j舉例來(lái)說(shuō),暫存區(qū)已經(jīng)保存了一次修改(add)雀哨,然后工作區(qū)對(duì)相同的代碼做更改磕谅,但是覺(jué)得還沒(méi)有保存在暫存區(qū)的內(nèi)容好,那么就可能要將工作區(qū)的內(nèi)容恢復(fù)到和暫存區(qū)一致)

版本回退

想要回退版本雾棺,一般都是本地先回退版本到某個(gè)分支膊夹,然后再推到遠(yuǎn)程,再合并

  • git reset --hard HEAD^
    • 將當(dāng)前分支回退一個(gè)版本
  • git reset --hard HEAD^^
    • 回退到上上個(gè)版本垢村, 版本號(hào)可以回退的版本為head-100
  • git reset --hard 版本號(hào)
    • 回退到具體某個(gè)版本

查看版本號(hào)

各種分支的每一次commit都會(huì)生成一個(gè)版本號(hào)

  • git log
    • 只顯示當(dāng)前分支的 版本變化
  • git log --oneline
    • 顯示版本號(hào)以及每次commit的變動(dòng)內(nèi)容(commit -m "變動(dòng)信息")割疾,列表的形式展示
  • git log -n4
    • 代表著最近4個(gè)記錄
  • git log -n4 --oneline
    • 最近4次記錄,列表的形式展示
  • git log --all
    • 列出本地所有分支的歷史版本
  • git log --all --graph
    • 以樹(shù)形圖的方式展示所有版本歷史信息
  • git log --pretty=oneline
    • 查看版本信息嘉栓,比較美觀宏榕,列表形式展示

其他基礎(chǔ)命令

查看每次更改內(nèi)容及版本差異

  • git diff
    • 還沒(méi)有add之前,可以通過(guò)這個(gè)命令看到對(duì)哪些文件做了更改
  • git diff 版本號(hào)1 版本號(hào)2
    • 可以查看兩個(gè)版本有哪些不同
  • git diff -- filename
    • 只比較工作區(qū)和暫存區(qū)某個(gè)文件的差異
    • 可以比較多個(gè)指定文件侵佃,空格分開(kāi)文件名
  • git diff --cached
    • 暫存區(qū)和HEAD之間的差異(add命令之后)
  • git status
    • 查看當(dāng)前工作區(qū)內(nèi)容和暫存區(qū)內(nèi)容情況

刪除git管理的文件

  • git rm filename
    • 從git 版本庫(kù)刪除文件

重命名git管理的文件

  • git mv filename new_filename
    • 將文件重命名
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末麻昼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子馋辈,更是在濱河造成了極大的恐慌抚芦,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異叉抡,居然都是意外死亡尔崔,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)褥民,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)季春,“玉大人,你說(shuō)我怎么就攤上這事消返≡嘏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵撵颊,是天一觀的道長(zhǎng)宇攻。 經(jīng)常有香客問(wèn)我,道長(zhǎng)倡勇,這世上最難降的妖魔是什么逞刷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮译隘,結(jié)果婚禮上亲桥,老公的妹妹穿的比我還像新娘。我一直安慰自己固耘,他們只是感情好题篷,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著厅目,像睡著了一般番枚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上损敷,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天葫笼,我揣著相機(jī)與錄音,去河邊找鬼拗馒。 笑死路星,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诱桂。 我是一名探鬼主播洋丐,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼挥等!你這毒婦竟也來(lái)了友绝?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤肝劲,失蹤者是張志新(化名)和其女友劉穎迁客,沒(méi)想到半個(gè)月后郭宝,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掷漱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年粘室,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卜范。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡育特,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出先朦,到底是詐尸還是另有隱情,我是刑警寧澤犬缨,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布喳魏,位于F島的核電站,受9級(jí)特大地震影響怀薛,放射性物質(zhì)發(fā)生泄漏刺彩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一枝恋、第九天 我趴在偏房一處隱蔽的房頂上張望创倔。 院中可真熱鬧,春花似錦焚碌、人聲如沸畦攘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)知押。三九已至,卻和暖如春鹃骂,著一層夾襖步出監(jiān)牢的瞬間台盯,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工畏线, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留静盅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓寝殴,卻偏偏與公主長(zhǎng)得像蒿叠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杯矩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359