<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          萬(wàn)字詳解!Git 入門最佳實(shí)踐

          共 11487字,需瀏覽 23分鐘

           ·

          2021-01-29 07:39


          轉(zhuǎn)自:gafish ?
          鏈接:https://github.com/gafish/gafish.github.com

          Git?簡(jiǎn)介

          Git 是一種分布式版本控制系統(tǒng),它可以不受網(wǎng)絡(luò)連接的限制,加上其它眾多優(yōu)點(diǎn),目前已經(jīng)成為程序開(kāi)發(fā)人員做項(xiàng)目版本管理時(shí)的首選,非開(kāi)發(fā)人員也可以用 Git 來(lái)做自己的文檔版本管理工具。

          2013年,淘寶前端團(tuán)隊(duì)開(kāi)始全面采用 Git 來(lái)做項(xiàng)目管理,我也是那個(gè)時(shí)候開(kāi)始接觸和使用,從一開(kāi)始的零接觸到現(xiàn)在的重度依賴,真是感嘆 Git 的強(qiáng)大。

          Git 的api很多,但其實(shí)平時(shí)項(xiàng)目中90%的需求都只需要用到幾個(gè)基本的功能即可,所以本文將從 實(shí)用主義 和 深入探索 2個(gè)方面去談?wù)勅绾卧陧?xiàng)目中使用 Git,一般來(lái)說(shuō),看完 實(shí)用主義 這一節(jié)就可以開(kāi)始在項(xiàng)目中動(dòng)手用。

          說(shuō)明:本文的操作都是基于 Mac 系統(tǒng)

          準(zhǔn)備階段

          進(jìn)入 Git官網(wǎng)下載合適你的安裝包,當(dāng)前我下載到的版本是 2.11.0,本文也將在這個(gè)版本上演示效果。安裝好 Git 后,打開(kāi)命令行工具,進(jìn)入工作文件夾(為了便于理解我們?cè)谙到y(tǒng)桌面上演示),創(chuàng)建一個(gè)新的demo文件夾。進(jìn)入 Github網(wǎng)站 注冊(cè)一個(gè)賬號(hào)并登錄,進(jìn)入:

          https://github.com/gafish/gafish.github.com

          點(diǎn)擊 Clone or download ,再點(diǎn)擊 Use HTTPS,復(fù)制項(xiàng)目地址 :

          https://github.com/gafish/gafish.github.com.git 備用。

          再回到命令行工具,一切就緒,接下來(lái)進(jìn)入本文的重點(diǎn)。

          常用操作

          所謂實(shí)用主義,就是掌握了以下知識(shí)就可以玩轉(zhuǎn) Git,輕松應(yīng)對(duì)90%以上的需求。以下是實(shí)用主義型的Git命令列表,先大致看一下

          git?clone
          git?config
          git?branch
          git?checkout
          git?status
          git?add
          git?commit
          git?push
          git?pull
          git?log
          git?tag

          接下來(lái),將通過(guò)對(duì):https://github.com/gafish/gafish.github.com

          倉(cāng)庫(kù)進(jìn)行實(shí)例操作,講解如何使用 Git 拉取代碼到提交代碼的整個(gè)流程。

          git clone

          從git服務(wù)器拉取代碼

          git?clone?https://github.com/gafish/gafish.github.com.git

          代碼下載完成后在當(dāng)前文件夾中會(huì)有一個(gè) gafish.github.com 的目錄,通過(guò) cd gafish.github.com 命令進(jìn)入目錄。

          git config

          配置開(kāi)發(fā)者用戶名和郵箱

          git?config?user.name?gafish
          [email protected]

          每次代碼提交的時(shí)候都會(huì)生成一條提交記錄,其中會(huì)包含當(dāng)前配置的用戶名和郵箱。

          git branch

          創(chuàng)建、重命名、查看、刪除項(xiàng)目分支,通過(guò) Git 做項(xiàng)目開(kāi)發(fā)時(shí),一般都是在開(kāi)發(fā)分支中進(jìn)行,開(kāi)發(fā)完成后合并分支到主干。

          git?branch?daily/0.0.0

          創(chuàng)建一個(gè)名為 daily/0.0.0 的日常開(kāi)發(fā)分支,分支名只要不包括特殊字符即可。

          git?branch?-m?daily/0.0.0?daily/0.0.1

          如果覺(jué)得之前的分支名不合適,可以為新建的分支重命名,重命名分支名為 daily/0.0.1

          git branch

          通過(guò)不帶參數(shù)的branch命令可以查看當(dāng)前項(xiàng)目分支列表

          git?branch?-d?daily/0.0.1

          如果分支已經(jīng)完成使命則可以通過(guò) -d 參數(shù)將分支刪除,這里為了繼續(xù)下一步操作,暫不執(zhí)行刪除操作

          git checkout

          切換分支

          git?checkout?daily/0.0.1

          切換到 daily/0.0.1 分支,后續(xù)的操作將在這個(gè)分支上進(jìn)行

          git status

          查看文件變動(dòng)狀態(tài)

          通過(guò)任何你喜歡的編輯器對(duì)項(xiàng)目中的 README.md 文件做一些改動(dòng),保存。

          git status

          通過(guò) git status 命令可以看到文件當(dāng)前狀態(tài) Changes not staged for commit: (改動(dòng)文件未提交到暫存區(qū))

          On?branch?daily/0.0.1
          Changes?not?staged?for?commit:
          ??(use?"git?add?..."?to?update?what?will?be?committed)
          ??(use?"git?checkout?--?..."?to?discard?changes?in?working?directory)
          ????modified:???README.md
          no?changes?added?to?commit?(use?"git?add"?and/or?"git?commit?-a")
          git?add

          添加文件變動(dòng)到暫存區(qū)

          git?add?README.md

          通過(guò)指定文件名 README.md 可以將該文件添加到暫存區(qū),如果想添加所有文件可用 git add . 命令,這時(shí)候可通過(guò) git status 看到文件當(dāng)前狀態(tài) Changes to be committed: (文件已提交到暫存區(qū))

          On?branch?daily/0.0.1
          Changes?to?be?committed:
          ??(use?"git?reset?HEAD?..."?to?unstage)
          ????modified:???README.md

          git commit

          提交文件變動(dòng)到版本庫(kù)

          git?commit?-m?'這里寫(xiě)提交原因'

          通過(guò) -m 參數(shù)可直接在命令行里輸入提交描述文本

          git push

          將本地的代碼改動(dòng)推送到服務(wù)器

          git?push?origin?daily/0.0.1

          origin 指代的是當(dāng)前的git服務(wù)器地址,這行命令的意思是把 daily/0.0.1 分支推送到服務(wù)器,當(dāng)看到命令行返回如下字符表示推送成功了。

          Counting?objects:?3,?done.
          Delta?compression?using?up?to?8?threads.
          Compressing?objects:?100%?(2/2),?done.
          Writing?objects:?100%?(3/3),?267?bytes?|?0?bytes/s,?done.
          Total?3?(delta?1),?reused?0?(delta?0)
          remote:?Resolving?deltas:?100%?(1/1),?completed?with?1?local?objects.
          To?https://github.com/gafish/gafish.github.com.git
          ?*?[new?branch]??????daily/0.0.1?->?daily/0.0.1

          現(xiàn)在我們回到Github網(wǎng)站的項(xiàng)目首頁(yè),點(diǎn)擊 Branch:master 下拉按鈕,就會(huì)看到剛才推送的 daily/00.1分支了

          git pull

          將服務(wù)器上的最新代碼拉取到本地

          git?pull?origin?daily/0.0.1

          如果其它項(xiàng)目成員對(duì)項(xiàng)目做了改動(dòng)并推送到服務(wù)器,我們需要將最新的改動(dòng)更新到本地,這里我們來(lái)模擬一下這種情況。

          進(jìn)入Github網(wǎng)站的項(xiàng)目首頁(yè),再進(jìn)入 daily/0.0.1 分支,在線對(duì) README.md 文件做一些修改并保存,然后在命令中執(zhí)行以上命令,它將把剛才在線修改的部分拉取到本地,用編輯器打開(kāi) README.md ,你會(huì)發(fā)現(xiàn)文件已經(jīng)跟線上的內(nèi)容同步了。

          如果線上代碼做了變動(dòng),而你本地的代碼也有變動(dòng),拉取的代碼就有可能會(huì)跟你本地的改動(dòng)沖突,一般情況下 Git 會(huì)自動(dòng)處理這種沖突合并,但如果改動(dòng)的是同一行,那就需要手動(dòng)來(lái)合并代碼,編輯文件,保存最新的改動(dòng),再通過(guò) git add . 和 git commit -m 'xxx' 來(lái)提交合并。

          git log

          查看版本提交記錄

          git?log

          通過(guò)以上命令,我們可以查看整個(gè)項(xiàng)目的版本提交記錄,它里面包含了提交人、日期、提交原因等信息,得到的結(jié)果如下:

          commit?c334730f8dba5096c54c8ac04fdc2b31ede7107a
          Author:?gafish?
          Date:???Wed?Jan?11?09:44:13?2017?+0800
          ????Update?README.md
          commit?ba6e3d21fcb1c87a718d2a73cdd11261eb672b2a
          Author:?gafish?
          Date:???Wed?Jan?11?09:31:33?2017?+0800
          ????test
          .....

          提交記錄可能會(huì)非常多,按 J 鍵往下翻,按 K 鍵往上翻,按 Q 鍵退出查看

          git tag

          為項(xiàng)目標(biāo)記里程碑

          git?tag?publish/0.0.1
          git?push?origin?publish/0.0.1

          當(dāng)我們完成某個(gè)功能需求準(zhǔn)備發(fā)布上線時(shí),應(yīng)該將此次完整的項(xiàng)目代碼做個(gè)標(biāo)記,并將這個(gè)標(biāo)記好的版本發(fā)布到線上,這里我們以 publish/0.0.1 為標(biāo)記名并發(fā)布,當(dāng)看到命令行返回如下內(nèi)容則表示發(fā)布成功了

          Total?0?(delta?0),?reused?0?(delta?0)
          To?https://github.com/gafish/gafish.github.com.git
          ?*?[new?tag]?????????publish/0.0.1?->?publish/0.0.1
          .gitignore

          設(shè)置哪些內(nèi)容不需要推送到服務(wù)器,這是一個(gè)配置文件

          touch?.gitignore

          .gitignore 不是 Git 命令,而在項(xiàng)目中的一個(gè)文件,通過(guò)設(shè)置 .gitignore 的內(nèi)容告訴 Git 哪些文件應(yīng)該被忽略不需要推送到服務(wù)器,通過(guò)以上命令可以創(chuàng)建一個(gè) .gitignore 文件,并在編輯器中打開(kāi)文件,每一行代表一個(gè)要忽略的文件或目錄,如:

          demo.html
          build/

          以上內(nèi)容的意思是 Git 將忽略 demo.html 文件 和 build/ 目錄,這些內(nèi)容不會(huì)被推送到服務(wù)器上

          小結(jié)

          通過(guò)掌握以上這些基本命令就可以在項(xiàng)目中開(kāi)始用起來(lái)了,如果追求實(shí)用,那關(guān)于 Git 的學(xué)習(xí)就可以到此結(jié)束了,偶爾遇到的問(wèn)題也基本上通過(guò) Google 也能找到答案,如果想深入探索 Git 的高階功能,那就繼續(xù)往下看 深入探索 部分。

          深入探索

          • 基本概念
            • 工作區(qū)(Working Directory) 就是你在電腦里能看到的目錄,比如上文中的 gafish.github.com 文件夾就是一個(gè)工作區(qū)
            • 本地版本庫(kù)(Local Repository) 工作區(qū)有一個(gè)隱藏目錄 .git,這個(gè)不算工作區(qū),而是 Git 的版本庫(kù)。
            • 暫存區(qū)(stage) 本地版本庫(kù)里存了很多東西,其中最重要的就是稱為 stage(或者叫index)的暫存區(qū),還有 Git 為我們自動(dòng)創(chuàng)建的第一個(gè)分支 master,以及指向 master 的一個(gè)指針叫 HEAD。
            • 遠(yuǎn)程版本庫(kù)(Remote Repository) 一般指的是 Git 服務(wù)器上所對(duì)應(yīng)的倉(cāng)庫(kù),本文的示例所在的github倉(cāng)庫(kù)就是一個(gè)遠(yuǎn)程版本庫(kù)

          以上概念之間的關(guān)系:工作區(qū)、暫存區(qū)、本地版本庫(kù)、遠(yuǎn)程版本庫(kù)之間幾個(gè)常用的 Git 操作流程如下圖所示:

          分支(Branch)

          分支是為了將修改記錄的整個(gè)流程分開(kāi)存儲(chǔ),讓分開(kāi)的分支不受其它分支的影響,所以在同一個(gè)數(shù)據(jù)庫(kù)里可以同時(shí)進(jìn)行多個(gè)不同的修改

          主分支(Master)前面提到過(guò) master 是 Git 為我們自動(dòng)創(chuàng)建的第一個(gè)分支,也叫主分支,其它分支開(kāi)發(fā)完成后都要合并到 master標(biāo)簽(Tag)

          標(biāo)簽是用于標(biāo)記特定的點(diǎn)或提交的歷史,通常會(huì)用來(lái)標(biāo)記發(fā)布版本的名稱或版本號(hào)(如:publish/0.0.1),雖然標(biāo)簽看起來(lái)有點(diǎn)像分支,但打上標(biāo)簽的提交是固定的,不能隨意的改動(dòng),參見(jiàn)上圖中的1.0 / 2.0 / 3.0

          HEAD

          HEAD 指向的就是當(dāng)前分支的最新提交

          以上概念了解的差不多,那就可以繼續(xù)往下看,下面將以具體的操作類型來(lái)講解 Git 的高階用法

          操作文件

          git?add
          #添加文件到暫存區(qū)

          git?add?-i
          #通過(guò)此命令將打開(kāi)交互式子命令系統(tǒng),你將看到如下子命令

          ***Commands***
          ??1:?status??????2:?update??????3:?revert??????4:?add?untracked
          ??5:?patch??????6:?diff??????7:?quit??????8:?help

          通過(guò)輸入序列號(hào)或首字母可以選擇相應(yīng)的功能,具體的功能解釋如下:

          status:#功能上和?git?add?-i?相似,沒(méi)什么鳥(niǎo)用
          update:#詳見(jiàn)下方?git?add?-u
          revert:#把已經(jīng)添加到暫存區(qū)的文件從暫存區(qū)剔除,其操作方式和?update?類似
          add untracked:#可以把新增的文件添加到暫存區(qū),其操作方式和?update?類似
          patch:#詳見(jiàn)下方?git?add?-p
          diff:#比較暫存區(qū)文件和本地版本庫(kù)的差異,其操作方式和?update?類似
          quit:#退出?git?add?-i?命令系統(tǒng)
          help#查看幫助信息
          git?add?-p

          直接進(jìn)入交互命令中最有用的 patch 模式

          這是交互命令中最有用的模式,其操作方式和 update 類似,選擇后 Git 會(huì)顯示這些文件的當(dāng)前內(nèi)容與本地版本庫(kù)中的差異,然后您可以自己決定是否添加這些修改到暫存區(qū),在命令行 Stage deletion [y,n,q,a,d,/,?]? 后輸入 y,n,q,a,d,/,? 其中一項(xiàng)選擇操作方式,具體功能解釋如下:

          • y:接受修改
          • n:忽略修改
          • q:退出當(dāng)前命令
          • a:添加修改
          • d:放棄修改
          • /:通過(guò)正則表達(dá)式匹配修改內(nèi)容
          • ?:查看幫助信息
          git?add?-u

          直接進(jìn)入交互命令中的 update 模式

          它會(huì)先列出工作區(qū) 修改 或 刪除 的文件列表,新增 的文件不會(huì)被顯示,在命令行 Update>> 后輸入相應(yīng)的列表序列號(hào)表示選中該項(xiàng),回車?yán)^續(xù)選擇,如果已選好,直接回車回到命令主界面

          git?add?--ignore-removal?.
          #添加工作區(qū)?修改?或?新增?的文件列表,?刪除?的文件不會(huì)被添加

          git?commit
          #把暫存區(qū)的文件提交到本地版本庫(kù)

          git?commit?-m?'第一行提交原因'??-m?'第二行提交原因'
          #不打開(kāi)編輯器,直接在命令行中輸入多行提交原因

          git?commit?-am?'提交原因'
          #將工作區(qū)?修改?或?刪除?的文件提交到本地版本庫(kù),?新增?的文件不會(huì)被提交

          git?commit?--amend?-m?'提交原因'
          #修改最新一條提交記錄的提交原因

          git?commit?-C?HEAD
          #將當(dāng)前文件改動(dòng)提交到?HEAD?或當(dāng)前分支的歷史ID

          git?mv
          #移動(dòng)或重命名文件、目錄

          git?mv?a.md?b.md?-f
          #將?a.md?重命名為?b.md?,同時(shí)添加變動(dòng)到暫存區(qū),加?-f?參數(shù)可以強(qiáng)制重命名,相比用?mv?a.md?b.md?命令省去了?git?add?操作

          git?rm
          #從工作區(qū)和暫存區(qū)移除文件

          git?rm?b.md
          #從工作區(qū)和暫存區(qū)移除文件?b.md?,同時(shí)添加變動(dòng)到暫存區(qū),相比用?rm?b.md?命令省去了?git?add?操作

          git?rm?src/?-r
          #允許從工作區(qū)和暫存區(qū)移除目錄

          git?status

          git?status?-s
          #以簡(jiǎn)短方式查看工作區(qū)和暫存區(qū)文件狀態(tài),示例如下:
          ?M?demo.html
          ???test.html

          git?status?--ignored
          #查看工作區(qū)和暫存區(qū)文件狀態(tài),包括被忽略的文件

          操作分支

          git?branch
          #查看、創(chuàng)建、刪除分支

          git?branch?-a
          #查看本地版本庫(kù)和遠(yuǎn)程版本庫(kù)上的分支列表

          git?branch?-r
          #查看遠(yuǎn)程版本庫(kù)上的分支列表,加上?-d?參數(shù)可以刪除遠(yuǎn)程版本庫(kù)上的分支

          git?branch?-D
          #分支未提交到本地版本庫(kù)前強(qiáng)制刪除分支

          git?branch?-vv
          #查看帶有最后提交id、最近提交原因等信息的本地版本庫(kù)分支列表
          git?merge
          #將其它分支合并到當(dāng)前分支

          git?merge?--squash
          #將待合并分支上的?commit?合并成一個(gè)新的?commit?放入當(dāng)前分支,適用于待合并分支的提交記錄不需要保留的情況
          git?merge?--no-ff
          #默認(rèn)情況下,Git 執(zhí)行"快進(jìn)式合并"(fast-farward merge),會(huì)直接將 Master 分支指向 Develop 分支,使用?--no-ff 參數(shù)后,會(huì)執(zhí)行正常合并,在 Master 分支上生成一個(gè)新節(jié)點(diǎn),保證版本演進(jìn)更清晰。
          git?merge?--no-edit
          #在沒(méi)有沖突的情況下合并,不想手動(dòng)編輯提交原因,而是用?Git?自動(dòng)生成的類似?Merge?branch?'test'的文字直接提交

          git?checkout
          #切換分支

          git?checkout?-b?daily/0.0.1
          #創(chuàng)建?daily/0.0.1?分支,同時(shí)切換到這個(gè)新創(chuàng)建的分支

          git?checkout?HEAD?demo.html
          #從本地版本庫(kù)的?HEAD(也可以是提交ID、分支名、Tag名)?歷史中檢出?demo.html?覆蓋當(dāng)前工作區(qū)的文件,如果省略?HEAD?則是從暫存區(qū)檢出

          git?checkout?--orphan?new_branch
          #這個(gè)命令會(huì)創(chuàng)建一個(gè)全新的,完全沒(méi)有歷史記錄的新分支,但當(dāng)前源分支上所有的最新文件都還在,真是強(qiáng)迫癥患者的福音,但這個(gè)新分支必須做一次 git commit 操作后才會(huì)真正成為一個(gè)新分支。

          git?checkout?-p?other_branch
          #這個(gè)命令主要用來(lái)比較兩個(gè)分支間的差異內(nèi)容,并提供交互式的界面來(lái)選擇進(jìn)一步的操作,這個(gè)命令不僅可以比較兩個(gè)分支間的差異,還可以比較單個(gè)文件的差異。

          git?stash
          #在 Git 的棧中保存當(dāng)前修改或刪除的工作進(jìn)度,當(dāng)你在一個(gè)分支里做某項(xiàng)功能開(kāi)發(fā)時(shí),接到通知把昨天已經(jīng)測(cè)試完沒(méi)問(wèn)題的代碼發(fā)布到線上,但這時(shí)你已經(jīng)在這個(gè)分支里加入了其它未提交的代碼,這個(gè)時(shí)候就可以把這些未提交的代碼存到棧里。

          git?stash
          #將未提交的文件保存到Git棧中

          git?stash?list
          #查看棧中保存的列表

          git?stash?show?stash@{0}
          #顯示棧中其中一條記錄

          git?stash?drop?stash@{0}
          #移除棧中其中一條記錄

          git?stash?pop
          #從Git棧中檢出最新保存的一條記錄,并將它從棧中移除

          git?stash?apply?stash@{0}
          #從Git棧中檢出其中一條記錄,但不從棧中移除

          git?stash?branch?new_banch
          #把當(dāng)前棧中最近一次記錄檢出并創(chuàng)建一個(gè)新分支

          git?stash?clear
          #清空棧里的所有記錄

          git?stash?create
          #為當(dāng)前修改或刪除的文件創(chuàng)建一個(gè)自定義的棧并返回一個(gè)ID,此時(shí)并未真正存儲(chǔ)到棧里

          git?stash?store?xxxxxx
          #將?create?方法里返回的ID放到?store?后面,此時(shí)在棧里真正創(chuàng)建了一個(gè)記錄,但當(dāng)前修改或刪除的文件并未從工作區(qū)移除

          $?git?stash?create
          09eb9a97ad632d0825be1ece361936d1d0bdb5c7
          $?git?stash?store?09eb9a97ad632d0825be1ece361936d1d0bdb5c7
          $?git?stash?list
          stash@{0}:?Created?via?"git?stash?store".

          操作歷史

          git?log
          #顯示提交歷史記錄

          git?log?-p
          #顯示帶提交差異對(duì)比的歷史記錄

          git?log?demo.html
          #顯示?demo.html?文件的歷史記錄

          git?log?--since="2?weeks?ago"
          #顯示2周前開(kāi)始到現(xiàn)在的歷史記錄,其它時(shí)間可以類推

          git?log?--before="2?weeks?ago"
          #顯示截止到2周前的歷史記錄,其它時(shí)間可以類推

          git?log?-10
          #顯示最近10條歷史記錄

          git?log?f5f630a..HEAD
          #顯示從提交ID?f5f630a?到?HEAD?之間的記錄,HEAD?可以為空或其它提交ID

          git?log?--pretty=oneline
          #在一行中輸出簡(jiǎn)短的歷史記錄

          git?log?--pretty=format:"%h"?
          #格式化輸出歷史記錄

          Git 用各種 placeholder 來(lái)決定各種顯示內(nèi)容,我挑幾個(gè)常用的顯示如下:

          %H:?#commit?hash
          %h:?#縮短的commit?hash
          %T:?#tree?hash
          %t:?#縮短的?tree?hash
          %P:?#parent?hashes
          %p:?#縮短的?parent?hashes
          %an:?#作者名字
          %aN:?#mailmap的作者名
          %ae:?#作者郵箱
          %ad:?#日期?(--date=?制定的格式)
          %ar:?#日期,?相對(duì)格式(1?day?ago)
          %cn:?#提交者名字
          %ce:?#提交者?email
          %cd:?#提交日期?(--date=?制定的格式)
          %cr:?#提交日期,?相對(duì)格式(1?day?ago)
          %d:?#ref名稱
          %s:?#commit信息標(biāo)題
          %b:?#commit信息內(nèi)容
          %n:?#換行
          git?cherry-pick
          #合并分支的一條或幾條提交記錄到當(dāng)前分支末梢

          git?cherry-pick?170a305
          #合并提交ID?170a305?到當(dāng)前分支末梢

          git?reset
          #將當(dāng)前的分支重設(shè)(reset)到指定的??或者?HEAD

          git?reset?--mixed?
          #--mixed?是不帶參數(shù)時(shí)的默認(rèn)參數(shù),它退回到某個(gè)版本,保留文件內(nèi)容,回退提交歷史

          git?reset?--soft?
          #暫存區(qū)和工作區(qū)中的內(nèi)容不作任何改變,僅僅把?HEAD?指向?

          git?reset?--hard?
          #自從??以來(lái)在工作區(qū)中的任何改變都被丟棄,并把?HEAD?指向?

          git?rebase
          #重新定義分支的版本庫(kù)狀態(tài)

          git?rebase?branch_name
          #合并分支,這跟 merge 很像,但還是有本質(zhì)區(qū)別,看下圖:

          合并過(guò)程中可能需要先解決沖突,然后執(zhí)行 git rebase --continue

          git?rebase?-i?HEAD~~
          #打開(kāi)文本編輯器,將看到從?HEAD?到?HEAD~~?的提交如下

          pick?9a54fd4?添加commit的說(shuō)明
          pick?0d4a808?添加pull的說(shuō)明
          #?Rebase?326fc9f..0d4a808?onto?d286baa
          #
          #?Commands:
          #??p,?pick?=?use?commit
          #??r,?reword?=?use?commit,?but?edit?the?commit?message
          #??e,?edit?=?use?commit,?but?stop?for?amending
          #??s,?squash?=?use?commit,?but?meld?into?previous?commit
          #??f,?fixup?=?like?"squash",?but?discard?this?commit's?log?message
          #??x,?exec?=?run?command?(the?rest?of?the?line)?using?shell
          #

          將第一行的 pick 改成 Commands 中所列出來(lái)的命令,然后保存并退出,所對(duì)應(yīng)的修改將會(huì)生效。

          如果移動(dòng)提交記錄的順序,將改變歷史記錄中的排序。

          git?revert
          #撤銷某次操作,此次操作之前和之后的?commit?和?history?都會(huì)保留,并且把這次撤銷作為一次最新的提交

          git?revert?HEAD
          #撤銷前一次提交操作

          git?revert?HEAD?--no-edit
          #撤銷前一次提交操作,并以默認(rèn)的?Revert?"xxx"?為提交原因

          git?revert?-n?HEAD
          #需要撤銷多次操作的時(shí)候加?-n?參數(shù),這樣不會(huì)每次撤銷操作都提交,而是等所有撤銷都完成后一起提交

          git?diff
          #查看工作區(qū)、暫存區(qū)、本地版本庫(kù)之間的文件差異,用一張圖來(lái)解釋
          git?diff?--stat
          #通過(guò)?--stat?參數(shù)可以查看變更統(tǒng)計(jì)數(shù)據(jù)

          ?test.md?|?1?-
          ?1?file?changed,?1?deletion(-)
          git?reflog
          #reflog?可以查看所有分支的所有操作記錄(包括commit和reset的操作、已經(jīng)被刪除的commit記錄,跟?git?log?的區(qū)別在于它不能查看已經(jīng)刪除了的commit記錄

          遠(yuǎn)程版本庫(kù)連接

          如果在GitHub項(xiàng)目初始化之前,文件已經(jīng)存在于本地目錄中,那可以在本地初始化本地版本庫(kù),再將本地版本庫(kù)跟遠(yuǎn)程版本庫(kù)連接起來(lái)

          git?init
          #在本地目錄內(nèi)部會(huì)生成.git文件夾

          git?remote?-v
          #不帶參數(shù),列出已經(jīng)存在的遠(yuǎn)程分支,加上?-v?列出詳細(xì)信息,在每一個(gè)名字后面列出其遠(yuǎn)程url

          git?remote?add?origin?https://github.com/gafish/gafish.github.com.git
          #添加一個(gè)新的遠(yuǎn)程倉(cāng)庫(kù),指定一個(gè)名字,以便引用后面帶的URL

          git?fetch
          #將遠(yuǎn)程版本庫(kù)的更新取回到本地版本庫(kù)

          git?fetch?origin?daily/0.0.1
          #默認(rèn)情況下,git fetch 取回所有分支的更新。如果只想取回特定分支的更新,可以指定分支名。

          問(wèn)題排查

          git?blame
          #查看文件每行代碼塊的歷史信息

          git?blame?-L?1,10?demo.html
          #截取?demo.html?文件1-10行歷史信息

          git?bisect
          #二分查找歷史記錄,排查BUG

          git?bisect?start
          #開(kāi)始二分查找

          git?bisect?bad
          #標(biāo)記當(dāng)前二分提交ID為有問(wèn)題的點(diǎn)

          git?bisect?good
          #標(biāo)記當(dāng)前二分提交ID為沒(méi)問(wèn)題的點(diǎn)

          git?bisect?reset
          #查到有問(wèn)題的提交ID后回到原分支

          更多操作

          git?submodule
          #通過(guò)?Git?子模塊可以跟蹤外部版本庫(kù),它允許在某一版本庫(kù)中再存儲(chǔ)另一版本庫(kù),并且能夠保持2個(gè)版本庫(kù)完全獨(dú)立

          git?submodule?add?https://github.com/gafish/demo.git?demo
          #將?demo?倉(cāng)庫(kù)添加為子模塊

          git?submodule?update?demo
          #更新子模塊?demo

          git?gc
          #運(yùn)行Git的垃圾回收功能,清理冗余的歷史快照

          git?archive
          #將加了tag的某個(gè)版本打包提取

          git?archive?-v?--format=zip?v0.1?>?v0.1.zip
          #--format 表示打包的格式,如 zip,-v 表示對(duì)應(yīng)的tag名,后面跟的是tag名,如 v0.1。

          總結(jié)

          本文只是對(duì) Git 的所有功能中的部分實(shí)用功能做了一次探秘,Git非常強(qiáng)大,還有很多功能有待我們?nèi)グl(fā)現(xiàn),限于本文篇幅,咱就此打住吧,預(yù)知更多好用功能,請(qǐng)善用谷歌。


          良許個(gè)人微信


          添加良許個(gè)人微信即送3套程序員必讀資料


          → 精選技術(shù)資料共享

          → 高手如云交流社群





          本公眾號(hào)全部博文已整理成一個(gè)目錄,請(qǐng)?jiān)诠娞?hào)里回復(fù)「m」獲取!

          推薦閱讀:

          圖解 | 你管這破玩意兒叫網(wǎng)絡(luò)?

          知乎萬(wàn)贊:計(jì)算機(jī)應(yīng)屆生月薪大多是多少?

          剛剛用華為鴻蒙跑了個(gè)“hello world”!跑通后,我特么開(kāi)始懷疑人生....


          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹(shù)莓派,等等。在公眾號(hào)內(nèi)回復(fù)「1024」,即可免費(fèi)獲取!!


          瀏覽 42
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久另类TS人妖一区二区 | 大香蕉伊人av | 亚洲无码视频播放 | 亚洲无码特色毛片 | 欧美成人精品高清视频在线观看 |