日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

01、認(rèn)識一下Git!—簡介

Git是當(dāng)前最先進(jìn)、最主流的分布式版本控制系統(tǒng),免費(fèi)、開源!核心能力就是版本控制。再具體一點(diǎn),就是面向代碼文件的版本控制,代碼的任何修改歷史都會被記錄管理起來,意味著可以恢復(fù)到到以前的任意時刻狀態(tài)。支持跨區(qū)域多人協(xié)作編輯,是團(tuán)隊項(xiàng)目開發(fā)的必備基礎(chǔ),所以Git也就成了程序員的必備技能。

主要特點(diǎn):

開源免費(fèi),使用廣泛。

強(qiáng)大的文檔(代碼)的歷史版本管理,直接記錄完整快照(完整內(nèi)容,而非差異),支持回滾、對比。

分布式多人協(xié)作的的代碼協(xié)同開發(fā),幾乎所有操作都是本地執(zhí)行的,支持代碼合并、代碼同步。

簡單易用的分支管理,支持高效的創(chuàng)建分支、合并分支。

Git是linux之父被迫開發(fā)的,為了解決Linux混亂的代碼管理而開發(fā)的。Linux和Git之父 李納斯·托沃茲(Linus Benedic Torvalds),來自1969年的芬蘭。

02、Git是干什么的?—基礎(chǔ)概念

先了解下Git的基本概念,及基本框架、工作流程。

2.1、Git概念匯總

概念名稱描述工作區(qū)(Workspace)就是在電腦里能看到的代碼庫目錄,是我們搬磚的地方,新增、修改的文件會提交到暫存區(qū)暫存區(qū)(stage 或 index)用于臨時存放文件的修改,實(shí)際上上它只是一個文件(.git/index),保存待提交的文件列表信息。版本庫/倉庫(Repository)Git的管理倉庫,管理版本的數(shù)據(jù)庫,記錄文件/目錄狀態(tài)的地方,所有內(nèi)容的修改記錄(版本)都在這里。服務(wù)端/遠(yuǎn)程倉庫(origin 或 remote)服務(wù)端的版本庫,專用的Git服務(wù)器,為多人共享提供服務(wù),承擔(dān)中心服務(wù)器的角色。本地版本庫通過push指令把代碼推送到服務(wù)端版本庫。本地倉庫用戶機(jī)器上直接使用的的的版本庫分支(Branch)分支是從主線分離出去的“副本”,可以獨(dú)立操作而互不干擾,倉庫初始化就有一個默認(rèn)主分支master。

頭(HEAD)HEAD類似一個“指針”,指向當(dāng)前活動 分支 的 最新版本。提交(Commit)把暫存區(qū)的所有變更的內(nèi)容提交到當(dāng)前倉庫的活動分支。推送(Push)將本地倉庫的版本推送到服務(wù)端(遠(yuǎn)程)倉庫,與他人共享。拉取(Pull)從服務(wù)端(遠(yuǎn)程)倉庫獲取更新到本地倉庫,獲取他人共享的更新。獲取(Fetch)從服務(wù)端(遠(yuǎn)程)倉庫更新,作用同拉取(Pull),區(qū)別是不會自動合并。沖突(Conflict)多人對同一文件的工作副本進(jìn)行更改,并將這些更改合并到倉庫時就會面臨沖突,需要人工合并處理。合并(Merge)對有沖突的文件進(jìn)行合并操作,Git會自動合并變更內(nèi)容,無法自動處理的沖突內(nèi)容會提示人工處理。

標(biāo)簽(Tags)標(biāo)簽指的是某個分支某個特定時間點(diǎn)的狀態(tài),可以理解為提交記錄的別名,常用來標(biāo)記版本。master(或main)倉庫的“master”分支,默認(rèn)的主分支,初始化倉庫就有了。Github上創(chuàng)建的倉庫默認(rèn)名字為“main”origin/master表示遠(yuǎn)程倉庫(origin)的“master”分支origin/HEAD表示遠(yuǎn)程倉庫(origin)的最新提交的位置,一般情況等于“origin/master”

2.2、工作區(qū)/暫存區(qū)/倉庫

工作區(qū)、暫存區(qū)、版本庫是Git最基本的概念,關(guān)系如下圖:

工作區(qū)(Workspace)就是在電腦里能看到的代碼庫目錄,是我們搬磚的地方,新增、修改的文件會提交到暫存區(qū)。

在這里新增文件、修改文件內(nèi)容,或刪除文件。

暫存區(qū)(stage或index) 用于臨時存放文件的修改,實(shí)際上上它只是一個文件(.git/index),保存待提交的文件列表信息。

用git add 命令將工作區(qū)的修改保存到暫存區(qū)。

版本庫/倉庫(Repository /r??pɑ?z?t??ri/ 倉庫)Git的管理倉庫,管理版本的數(shù)據(jù)庫,記錄文件/目錄狀態(tài)的地方,所有內(nèi)容的修改記錄(版本)都在這里。就是工作區(qū)目錄下的隱藏文件夾.git,包含暫存區(qū)、分支、歷史記錄等信息。

用git commit 命令將暫存區(qū)的內(nèi)容正式提交到版本庫。

master 為倉庫的默認(rèn)分支master,HEAD是一個“指針”指向當(dāng)前分支的最新提交,默認(rèn)指向最新的master。

如上圖,為對應(yīng)本地倉庫目錄的結(jié)構(gòu)關(guān)系。

KWebNote為項(xiàng)目目錄,也就是Git工作區(qū)。

項(xiàng)目根目錄下隱藏的.git目錄就是Git倉庫目錄了,存放了所有Git管理的信息。

.git/config為該倉庫的配置文件,可通過指令修改或直接修改。

index文件就是存放的暫存區(qū)內(nèi)容。

2.3、Git基本流程(圖)

Git的工作流程核心就下面幾個步驟,掌握了就可以開始寫B(tài)ug了。

0、準(zhǔn)備倉庫:創(chuàng)建或從服務(wù)端克隆一個倉庫。

1、搬磚:在工作目錄中添加、修改代碼。

2、暫存(git add):將需要進(jìn)行版本管理的文件放入暫存區(qū)域。

3、提交(git commit):將暫存區(qū)域的文件提交到Git倉庫。

4、推送(git push):將本地倉庫推送到遠(yuǎn)程倉庫,同步版本庫。

5、獲取更新(fetch/pull):從服務(wù)端更新到本地,獲取他人推送的更新,與他人協(xié)作、共享。

git commit -a指令省略了add到暫存區(qū)的步驟,直接提交工作區(qū)的修改內(nèi)容到版本庫,不包括新增的文件。

git fetch、git pull 都是從遠(yuǎn)程服務(wù)端獲取最新記錄,區(qū)別是git pull多了一個步驟,就是自動合并更新工作區(qū)。

git checkout .、git checkout [file] 會清除工作區(qū)中未添加到暫存區(qū)的修改,用暫存區(qū)內(nèi)容替換工作區(qū)。

git checkout HEAD .、git checkout HEAD [file] 會清除工作區(qū)、暫存區(qū)的修改,用HEAD指向的當(dāng)前分支最新版本替換暫存區(qū)、工作區(qū)。

git diff 用來對比不同部分之間的區(qū)別,如暫存區(qū)、工作區(qū),最新版本與未提交內(nèi)容,不同版本之間等。

git reset是專門用來撤銷修改、回退版本的指令,替代上面checkout的撤銷功能。

2.4、Git狀態(tài)(圖)

Git在執(zhí)行提交的時候,不是直接將工作區(qū)的修改保存到倉庫,而是將暫存區(qū)域的修改保存到倉庫。要提交文件,首先需要把文件加入到暫存區(qū)域中。因此,Git管理的文件有三(+2)種狀態(tài):

未跟蹤(untracked):新添加的文件,或被移除跟蹤的文件,未建立跟蹤,通過git add添加暫存并建立跟蹤。

未修改:從倉庫簽出的文件默認(rèn)狀態(tài),修改后就是“已修改”狀態(tài)了。

已修改(modified):文件被修改后的狀態(tài)。

已暫存(staged):修改、新增的文件添加到暫存區(qū)后的狀態(tài)。

已提交(committed):從暫存區(qū)提交到版本庫。

03、起步:Git安裝配置

Git官網(wǎng):https://www.git-scm.com/ 下載安裝包進(jìn)行安裝。Git的使用有兩種方式:

命令行:Git的命令通過系統(tǒng)命令行工具,或Git提供的命令行工具運(yùn)行(C:Program FilesGitgit-bash.exe)

GUI工具:windows(GUI)、mac(GUI)工具,需單獨(dú)安裝,使用更簡單、更易上手。

指令git --version查看安裝版本號

本文是在Windows 平臺上完成的,不過這個對學(xué)習(xí)Git沒什么影響。

3.1、Git的配置文件

Git有三個主要的配置文件:三個配置文件的優(yōu)先級是①

① 系統(tǒng)全局配置(--system):包含了適用于系統(tǒng)所有用戶和所有倉庫(項(xiàng)目)的配置信息,存放在Git安裝目錄下C:Program FilesGitetcgitconfig。

② 用戶全局配置(--system):當(dāng)前系統(tǒng)用戶的全局配置,存放用戶目錄:C:Users[系統(tǒng)用戶名].gitconfig。

③ 倉庫/項(xiàng)目配置(--local):倉庫(項(xiàng)目)的特定配置,存放在項(xiàng)目目錄下.git/config

倉庫的配置是上面多個配置的集合:

3.2、配置-初始化用戶

當(dāng)安裝Git后首先要做的事情是配置你的用戶信息—— 告訴Git你是誰?配置 用戶名、郵箱地址,每次提交文件時都會帶上這個用戶信息,查看歷史記錄時就知道是誰干的了。

配置用戶信息:

user.name為用戶名,user.email為郵箱。

--global:config的參數(shù),表示用戶全局配置。如果要給特定倉庫配置用戶信息,則用參數(shù)--local配置即可,或直接在倉庫配置文件.git/config里修改。

3.3、配置-忽略.gitignore

工作目錄中的文件并不是全都需要納入版本管理,如日志、臨時文件、私有配置文件等不需要也不能納入版本管理,那該怎么辦呢?

在工作區(qū)根目錄下創(chuàng)建“.gitignore”文件,文件中配置不需要進(jìn)行版本管理的文件、文件夾。“.gitignore”文件本身是被納入版本管理的,可以共享。有如下規(guī)則:

#符號開頭為注釋。

可以使用Linux通配符。

星號(*)代表任意多個字符,

問號(?)代表一個字符,

方括號([abc])代表可選字符范圍,

大括號()代表可選的字符串等。

感嘆號(!)開頭:表示例外規(guī)則,將不被忽略。

路徑分隔符(/f)開頭:,表示要忽略根目錄下的文件f。

路徑分隔符(f/)結(jié)尾:,表示要忽略文件夾f下面的所有文件。

各種語言項(xiàng)目的常用.gitignore文件配置:https://github.com/github/gitignore

04、Git的GUI工具們

如果不想用命令行工具,完全可以安裝一個Git的GUI工具,用的更簡單、更舒服。不用記那么多命令了,極易上手,不過Git基礎(chǔ)還是需要學(xué)習(xí)了解一下的。

?對于Git,建議用命令行,這樣你才能真的理解Git的思想???其實(shí)都只是工具而已,適合自己的就是最好的,沒必要糾結(jié),多寫點(diǎn)Bug更重要!

TortoiseGit:小烏龜,SVN時代就很流行的代碼管理GUI利器。

只有Windows版本,支持中文,需要單獨(dú)下載安裝中文語言包。

??開源,免費(fèi),與文件管理器的良好集成。

??內(nèi)置沖突對比解決工具。

Sourcetree:SourceTree是老牌的Git GUI管理工具了,也號稱是最好用的Git GUI工具。

??適用于 Windows 和 Mac 系統(tǒng),內(nèi)置中文版,自動識別語言。

??免費(fèi)、功能強(qiáng)大,使用簡單。

??功能豐富,基本操作和高級操作都設(shè)計得非常流暢,適合初學(xué)者上手,支持Git Flow。

無沖突對比工具,支持配置第三方組件。

GitHub Desktop:Github官方出品的Git管理工具。

GitKraken:GitKraken是一個跨平臺GUI Git客戶端,有免費(fèi)版,專業(yè)版和企業(yè)版,這些版本啟用了不同的功能。

4.1、SourceTree

SourceTree的官網(wǎng) 下載安裝包,支持Window、Mac系統(tǒng),按照提示完成安裝。

SourceTree支持管理多個倉庫,通過+按鈕,可選擇多種方式添加倉庫。

然后就是可視化的倉庫管理了,不用記住繁瑣的指令(參數(shù))了,可視化操作。

4.2、TortoiseGit

TortoiseGit 官網(wǎng)下載安裝包,及中文語言包,按照提示完成安裝。小烏龜?shù)腉it是集成到操作系統(tǒng)里的,直接右鍵文件夾就可以進(jìn)行Git操作了。

先進(jìn)入設(shè)置:右鍵文件夾菜單 --> TortoiseGit --> Settings 進(jìn)入設(shè)置,設(shè)置中文語言。

小烏龜?shù)母鞣NGit操作都在右鍵菜單了,深度集成到了操作系統(tǒng)的資源管理器中了,文件圖標(biāo)也是有Git狀態(tài)的,比較容易分辨。

4.3、VSCode中的Git

VSCode自帶的Git工具基本已經(jīng)可以滿足日常使用了,既有可視化功能,也能敲命令,習(xí)慣了不就不用安裝其他GUI工具了。不過還是可以再安裝一些VSCode插件,來增強(qiáng)Git功能。

GitLens :在團(tuán)隊項(xiàng)目開發(fā)中非常實(shí)用,必備!!!用于快速查看代碼提交歷史記錄,在代碼上會顯示最近的修改信息,包括提交者,只就這一點(diǎn)就值得推薦了。

Git History:可以輕松快速瀏覽Git文件操作歷史記錄的工具,可視化展示,操作簡單。

05、Git使用入門

5.1、創(chuàng)建倉庫

創(chuàng)建本地倉庫的方法有兩種:

一種是創(chuàng)建全新的倉庫:git init,會在當(dāng)前目錄初始化創(chuàng)建倉庫。

另一種是克隆遠(yuǎn)程倉庫:git clone [url]

注意:Git指令的執(zhí)行,都需在倉庫目錄下。

創(chuàng)建完多出了一個被隱藏的.git目錄,這就是本地倉庫Git的工作場所。

克隆遠(yuǎn)程倉庫,如在github上創(chuàng)建的倉庫“https://github.com/kwonganding/KWebNote.git”

會在當(dāng)前目錄下創(chuàng)建“KWebNote”項(xiàng)目目錄。

5.2、暫存區(qū)add

可以簡單理解為,git add命令就是把要提交的所有修改放到暫存區(qū)(Stage),然后,執(zhí)行g(shù)it commit就可以一次性把暫存區(qū)的所有修改提交到倉庫。

指令描述git add [file1] [file2]添加文件到暫存區(qū),包括修改的文件、新增的文件git add [dir]同上,添加目錄到暫存區(qū),包括子目錄git add .同上,添加所有修改、新增文件(未跟蹤)到暫存區(qū)git rm [file]刪除工作區(qū)文件,并且將這次刪除放入暫存區(qū)

修改文件“R.md”,未暫存:

執(zhí)行g(shù)it add .暫存:

5.3、提交commit-記錄

git commit提交是以時間順序排列被保存到數(shù)據(jù)庫中的,就如游戲關(guān)卡一樣,每一次提交(commit)就會產(chǎn)生一條記錄:id + 描述 + 快照內(nèi)容。

commit id:根據(jù)修改的文件內(nèi)容采用摘要算法(SHA1)計算出不重復(fù)的40位字符,這么長是因?yàn)镚it是分布式的,要保證唯一性、完整性,一般本地指令中可以只用前幾位(6)。即使多年以后,依然可通過id找到曾經(jīng)的任何內(nèi)容和變動,再也不用擔(dān)心丟失了。

描述:針對本次提交的描述說明,建議準(zhǔn)確填寫,就跟代碼中的注釋一樣,很重要。

快照:就是完整的版本文件,以對象樹的結(jié)構(gòu)存在倉庫下.gitobjects目錄里,這也是Git效率高的秘訣之一。

SHA1 是一種哈希算法,可以用來生成數(shù)據(jù)摘要

Git不適合大的非文本文件,會影響計算摘要、快照的性能。

多個提交就形成了一條時間線,每次提交完,會移動當(dāng)前分支master、HEAD的“指針”位置。

Sourcetree上的歷史記錄:

一般情況,每完成一個小功能、一個Bu就可以提交一次,這樣會形成比較清晰的歷史記錄。

指令:

指令描述git commit -m '說明'提交變更,參數(shù)-m設(shè)置提交的描述信息,應(yīng)該正確提交,不帶該參數(shù)會進(jìn)入說明編輯模式git commit -a參數(shù)-a,表示直接從工作區(qū)提交到版本庫,略過了git add步驟,不包括新增的文件git commit [file]提交暫存區(qū)的指定文件到倉庫區(qū)git commit --amend -m使用一次新的commit,替代上一次提交,會修改commit的hash值(id)git log -n20查看日志(最近20條),不帶參數(shù)-n則顯示所

日志git log -n20 --oneline參數(shù)“--oneline”可以讓日志輸出更簡潔(一行)git log -n20 --graph參數(shù)“--graph”可視化顯示分支關(guān)系git log --follow [file]顯示某個文件的版本歷史git blame [file]以列表形式顯示指定文件的修改記錄git reflog查看所有可用的歷史版本記錄(實(shí)際是HEAD變更記錄),包含被回退的記錄(重要)git status查看本地倉庫狀態(tài),比較常用的指令,加參數(shù)-s簡潔模式

通過git log指令可以查看提交記錄日志,可以很方便的查看每次提交修改了哪些文件,改了哪些內(nèi)容,從而進(jìn)行恢復(fù)等操作。

5.4、Git的“指針”引用們

Git中最重要的就是提交記錄了,其他如標(biāo)簽、分支、HEAD 都對提交記錄的“指針”引用,指向這些提交記錄,理解這一點(diǎn)很重要。

提交記錄之間也存在“指針”引用,每個提交會指向其上一個提交。

標(biāo)簽 就是對某一個提交記錄的的 固定 “指針”引用,取一個別名更容易記憶一些關(guān)鍵節(jié)點(diǎn)。存儲在工作區(qū)根目錄下.gitrefstags。

分支 也是指向某一個提交記錄的“指針”引用,“指針”位置可變,如提交、更新、回滾。存儲在工作區(qū)根目錄下.gitrefsheads。

HEAD:指向當(dāng)前活動分支(最新提交)的一個“指針”引用,存在在“.git/HEAD”文件中,存儲的內(nèi)容為“ref: refs/heads/master”。

上圖中:

HEAD始終指向當(dāng)前活動分支,多個分支只能有一個處于活動狀態(tài)。

標(biāo)簽t1在某一個提交上創(chuàng)建后,就不會變了。而分支、HEAD的位置會改變。

打開這些文件內(nèi)容看看,就更容易理解這些“指針”的真面目了。

這里的主分支名字為“main”,是因?yàn)樵搨}庫是從Github上克隆的,Github上創(chuàng)建的倉庫默認(rèn)主分支名字就是“main”,本地創(chuàng)建的倉庫默認(rèn)主分支名字為“master”。

“指針”引用:之所以用引號的“指針”,是為了便于統(tǒng)一和理解。和指針原理類似,都是一個指向,只是實(shí)際上可能更復(fù)雜一點(diǎn),且不同的“指針”引用會有區(qū)別。

5.5、提交的唯一標(biāo)識id,HEAD~n是什么意思?

每一個提交都有一個唯一標(biāo)識,主要就是提交的hash值commit id,在很多指令中會用到,如版本回退、揀選提交等,需要指定一個提交。那標(biāo)識唯一提交有兩種方式:

首先就是commit id,一個40位編碼,指令中使用的時候可以只輸入前幾位(6位)即可。

還有一種就是HEAD~n

,是基于當(dāng)前HEAD

位置的一個相對坐標(biāo)。

HEAD 表示當(dāng)前分支的最新版本,是比較常用的參數(shù)。

HEAD^上一個版本,HEAD^^ 上上一個版本。

HEAD~ 或HEAD~1 表示上一個版本,以此類推,HEAD^10 為最近第10個版本。

HEAD@在git reflog日志中標(biāo)記的提交記錄索引。

通過git log、git reflog可以查看歷史日志,可以看每次提交的唯一編號(hash)。區(qū)別是git reflog可以查看所有操作的記錄(實(shí)際是HEAD變更記錄),包括被撤銷回退的提交記錄。

5.6、比較diff

git diff用來比較不同文件版本之間的差異。

指令描述git diff查看暫存區(qū)和工作區(qū)的差異git diff [file]同上,指定文件git diff --cached查看已暫存的改動,就是暫存區(qū)與新版本HEAD進(jìn)行比較git diff --staged同上git diff --cached [file]同上,指定文件git diff HEAD查看已暫存的+未暫存的所有改動,就是與最新版本HEAD進(jìn)行比較git diff HEAD~同上,與上一個版本比較。HEAD~表示上一個版本,HEAD~10為最近第10個版本git diff [id] [id]查看兩次提交之間的差異git diff [branch]查看工作區(qū)和分支直接的差異

??畫個圖更清晰些:

06、遠(yuǎn)程倉庫

Git作為分布式的版本管理系統(tǒng),每個終端都有自己的Git倉庫。但團(tuán)隊協(xié)作還需一個中間倉庫,作為中心,同步各個倉庫。于是服務(wù)端(遠(yuǎn)程)倉庫就來承擔(dān)這個職責(zé),服務(wù)端不僅有倉庫,還配套相關(guān)管理功能。

可以用公共的Git服務(wù)器,也可以自己搭建一套Git服務(wù)器。

公共Git服務(wù)器,如Github、Gitlab、碼云Gitee、騰訊Coding等。

搭建私有Git服務(wù)器,如開源的Gitlab、Gitea、等。

6.1、遠(yuǎn)程用戶登錄

Git服務(wù)器一般提供兩種登錄驗(yàn)證方式:

遠(yuǎn)程用戶登錄:HTTS

基于HTTPS的地址連接遠(yuǎn)程倉庫,Github的共有倉庫克隆、拉取(pull)是不需要驗(yàn)證的。

推送(push)代碼的時候就會提示輸入用戶名、密碼了,否則無法提交。記住用戶密碼的方式有兩種:

URL地址配置:在原本URL地址上加上用戶名、密碼,https://后加用戶名:密碼@

本地緩存:會創(chuàng)建一個緩存文件.git-credentials,存儲輸入的用戶名、密碼。

遠(yuǎn)程用戶登錄:SSH

SSH(Secure Shell,安全外殼)是一種網(wǎng)絡(luò)安全協(xié)議,通過加密和認(rèn)證機(jī)制實(shí)現(xiàn)安全的訪問和文件傳輸?shù)葮I(yè)務(wù),多用來進(jìn)行遠(yuǎn)程登錄、數(shù)據(jù)傳輸。SSH通過公鑰、私鑰非對稱加密數(shù)據(jù),所以SSH需要生成一個公私鑰對,公鑰放服務(wù)器上,私有自己留著進(jìn)行認(rèn)證。

① 生成公私鑰:通過Git指令ssh-keygen -t rsa生成公私鑰,一路回車即可完成。生成在“C:Users用戶名.ssh”目錄下,文件id_rsa.pub的內(nèi)容就是公鑰。

② 配置公鑰:打開id_rsa.pub文件,復(fù)制內(nèi)容。Github上,打開Setting? SSH and GPG keys ? SSH keys ? 按鈕New SSH key,標(biāo)題(Title)隨意,秘鑰內(nèi)容粘貼進(jìn)去即可。

6.2、遠(yuǎn)程倉庫指令

指令描述git clone [git地址]從遠(yuǎn)程倉庫克隆到本地(當(dāng)前目錄)git remote -v查看所有遠(yuǎn)程倉庫,不帶參數(shù)-v只顯示名稱git remote show [remote]顯示某個遠(yuǎn)程倉庫的信息git remote add [name] [url]增加一個新的遠(yuǎn)程倉庫,并命名git remote rename [old] [new]修改遠(yuǎn)程倉庫名稱git pull [remote] [branch]取回遠(yuǎn)程倉庫的變化,并與本地版本合并git pull同上,針對當(dāng)前分支git fetch [remote]獲取遠(yuǎn)程倉庫的所有變動到本地倉庫,不會自動合并!

需要手動合并git push推送當(dāng)前分支到遠(yuǎn)程倉庫git push [remote] [branch]推送本地當(dāng)前分支到遠(yuǎn)程倉庫的指定分支git push [remote] --force/-f強(qiáng)行推送當(dāng)前分支到遠(yuǎn)程倉庫,即使有沖突,??很危險!git push [remote] --all推送所有分支到遠(yuǎn)程倉庫git push –u參數(shù)–u表示與遠(yuǎn)程分支建立關(guān)聯(lián),第一次執(zhí)行的時候用,后面就不需要了git remote rm [remote-name]刪除遠(yuǎn)程倉庫git pull --rebase使用rebase的模式進(jìn)行合并

6.3、推送push/拉取pull

git push、git pull是團(tuán)隊協(xié)作中最常用的指令,用于同步本地、服務(wù)端的更新,與他人協(xié)作。

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

如果推送的更新與服務(wù)端存在沖突,則會被拒絕,push失敗。一般是有其他人推送了代碼,導(dǎo)致文件沖突,可以先pull代碼,在本地進(jìn)行合并,然后再push。

拉取(pull):從服務(wù)端(遠(yuǎn)程)倉庫更新到本地倉庫。

git pull:拉取服務(wù)端的最新提交到本地,并與本地合并,合并過程同分支的合并。

git fetch:拉取服務(wù)端的最新提交到本地,不會自動合并,也不會更新工作區(qū)。

6.4、fetch與pull有什么不同?

兩者都是從服務(wù)端獲取更新,主要區(qū)別是fetch不會自動合并,不會影響當(dāng)前工作區(qū)內(nèi)容。

git pull=git fetch+git merge

如下面圖中,git fetch只獲取了更新,并未影響master、HEAD的位置。

要更新master、HEAD的位置需要手動執(zhí)行g(shù)it merge合并。

07、Git利器-分支

分支是從主線分離出去的“副本”,分支就像是平行宇宙,可獨(dú)立發(fā)展,獨(dú)立編輯、提交,也可以和其他分支合并。分支是Git的核心必殺利器之一,分支創(chuàng)建、切換、刪除都非常快,他非常的輕量。所以,早建分支!多用分支!

7.1、分支Branch

比如有一個項(xiàng)目團(tuán)隊,準(zhǔn)備10月份發(fā)布新版本,要新開發(fā)一堆黑科技功能,占領(lǐng)市場。你和小伙伴“小美”一起負(fù)責(zé)開發(fā)一個新功能A,開發(fā)周期2周,在這兩周你們的代碼不能影響其他人,不影響主分支。這個時候就可以為這個新功能創(chuàng)建一個分支,你們兩在這個分支上干活,2周后代碼開發(fā)完了、測試通過,就可以合并進(jìn)要發(fā)版的開發(fā)分支了。安全、高效,不影響其他人工作,完美!

在實(shí)際項(xiàng)目中,一般會建幾個主線分支。

master:作為主分支,存放穩(wěn)定的代碼,就是開發(fā)后測試通過的代碼,不允許隨便修改和合并。

開發(fā)分支:用于團(tuán)隊日常開發(fā)用,比如團(tuán)隊計劃10月份開發(fā)10個功能并發(fā)版,則在此分支上進(jìn)行,不影響主分支的穩(wěn)定。

功能A分支:開發(fā)人員根據(jù)自己的需要,可以創(chuàng)建一些臨時分支用于特定功能的開發(fā),開發(fā)完畢后再合并到開發(fā)分支,并刪除該分支。

分支就是指向某一個提交記錄的“指針”引用,因此創(chuàng)建分支是非常快的,不管倉庫多大。當(dāng)我們運(yùn)行g(shù)it branch dev創(chuàng)建了一個名字為dev的分支,Git實(shí)際上是在.gitrefsheads下創(chuàng)建一個dev的引用文件(沒有擴(kuò)展名)。

7.2、分支指令

指令描述git branch列出所有本地分支,加參數(shù)-v顯示詳細(xì)列表,下同git branch -r列出所有遠(yuǎn)程分支git branch -a列出所有本地分支和遠(yuǎn)程分支,用不同顏色區(qū)分git branch [branch-name]新建一個分支,但依然停留在當(dāng)前分支git branch -d dev刪除dev分支,-D(大寫)強(qiáng)制刪除git checkout -b dev從當(dāng)前分支創(chuàng)建并切換到dev分支git checkout -b feature1 dev從本地dev分支代碼創(chuàng)建一個 feature1分支,

并切換到新分支git branch [branch] [commit]新建一個分支,指向指定commit idgit branch --track [branch] [remote-branch]新建一個分支,與指定的遠(yuǎn)程分支建立關(guān)聯(lián)git checkout -b hotfix remote hotfix從遠(yuǎn)端remote的hotfix分支創(chuàng)建本地hotfix分支git branch --set-upstream [branch] [remote-branch]在現(xiàn)有分支與指定的遠(yuǎn)程分支之間建立跟蹤關(guān)聯(lián):git branch --set-upstream hotfix remote/hotfixgit checkout [branch-name]切換到指定分支,并更新工作區(qū)git checkout .撤銷工作區(qū)的(未暫存)修改,把暫存區(qū)恢復(fù)到工作區(qū)。

git checkout HEAD .撤銷工作區(qū)、暫存區(qū)的修改,用HEAD指向的當(dāng)前分支最新版本替換git merge [branch]合并指定分支到當(dāng)前分支git merge --no-ff dev合并dev分支到當(dāng)前分支,參數(shù)--no-ff禁用快速合并模式git push origin --delete [branch-name]刪除遠(yuǎn)程分支git rebase master將當(dāng)前分支變基合并到master分支?switch:新的分支切換指令切換功能和checkout一樣,switch只單純的用于切換git switch master切換到已有的master分支git switch -c dev創(chuàng)建并切換到新的dev分支

關(guān)于 checkout 指令:checkout是Git的底層指令,比較常用,也比較危險,他會重寫工作區(qū)。支持的功能比較多,能撤銷修改,能切換分支,這也導(dǎo)致了這個指令比較復(fù)雜。在Git 2.23版本以后,增加了git switch、git reset指令。

git switch:專門用來實(shí)現(xiàn)分支切換。

git reset:專門用來實(shí)現(xiàn)本地修改的撤銷,更多可參考后續(xù)“reset”內(nèi)容。

7.3、分支的切換checkout

代碼倉庫可以有多個分支,master為默認(rèn)的主分支,但只有一個分支在工作狀態(tài)。所以要操作不同分支,需要切換到該分支,HEAD就是指向當(dāng)前正在活動的分支。

使用 git checkout dev切換分支時,干了兩件事:

①、HEAD指向dev:修改HEAD的“指針”引用,指向dev分支。

②、還原工作空間:把dev分支內(nèi)容還原到工作空間。

此時的活動分支就是dev了,后續(xù)的提交就會更新到dev分支了。

?切換時還沒提交的代碼怎么辦?

如果修改(包括未暫存、已暫存)和待切換的分支沒有沖突,則切換成果,且未提交修改會一起帶過去,所以要注意!

如果有沖突,則會報錯,提示先提交或隱藏,關(guān)于隱藏可查看后續(xù)章節(jié)內(nèi)容“stash”。

7.4、合并merge&沖突

把兩個分支的修改內(nèi)容合并到一起,常用的合并指令git merge [branch],將分支[branch]合并到當(dāng)前分支。根據(jù)要合并的內(nèi)容的不同,具體合并過程就會有多種情況。

快速合并(Fast forward)

如下圖,master分支么有任何提交,“git merge dev”合并分支dev到master,此時合并速度就非常快,直接移動master的“指針”引用到dev即可。這就是快速合并(Fast forward),不會產(chǎn)生新的提交。

合并dev到master,注意要先切換到master分支,然后執(zhí)行g(shù)it merge dev,把dev合并到當(dāng)前分支。

強(qiáng)制不用快速合并:git merge --no-ff -m "merge with no-ff" dev,參數(shù)--no-ff不啟用快速合并,會產(chǎn)生一個新的合并提交記錄。

普通合并

如果master有變更,存在分支交叉,則會把兩邊的變更合并成一個提交。

如果兩邊變更的文件不同,沒有什么沖突,就自動合并了。

如果有修改同一個文件,則會存在沖突,到底該采用哪邊的,程序無法判斷,就換產(chǎn)生沖突。沖突內(nèi)容需要人工修改后再重新提交,才能完成最終的合并。

上圖中,創(chuàng)建dev分支后,兩個分支都有修改提交,因此兩個分支就不在一條順序線上了,此時合并dev到master就得把他們的修改進(jìn)行合并操作了。

v5、v7共同祖先是v4,從這里開始分叉。

Git 會用兩個分支的末端v6 和 v8以及它們的共同祖先v4進(jìn)行三方合并計算。合并之后會生成一個新(和并)提交v9。

合并提交v9就有兩個祖先v6、v8。

處理沖突

在有沖突的文件中,

7.5、變基rebase

把兩個分支的修改內(nèi)容合并到一起的辦法有兩種:merge 和 rebase,作用都是一樣的,區(qū)別是rebase的提交歷史更簡潔,干掉了分叉,merge的提交歷史更完整。

在dev上執(zhí)行“git rebase master”變基,將dev分支上分叉的v7、v8生成補(bǔ)丁,然后在master分支上應(yīng)用補(bǔ)丁,產(chǎn)生新的v7'、v8'新的提交。

然后回到master分支,完成合并git merge dev,此時的合并就是快速合并了。

最終的提交記錄就沒有分叉了。

08、標(biāo)簽管理

標(biāo)簽(Tags)指的是某個分支某個特定時間點(diǎn)的狀態(tài),是對某一個提交記錄的的固定“指針”引用。一經(jīng)創(chuàng)建,不可移動,存儲在工作區(qū)根目錄下.gitrefstags。可以理解為某一次提交(編號)的別名,常用來標(biāo)記版本。所以發(fā)布時,一般都會打一個版本標(biāo)簽,作為該版本的快照,指向?qū)?yīng)提交commit。

當(dāng)項(xiàng)目達(dá)到一個關(guān)鍵節(jié)點(diǎn),希望永遠(yuǎn)記住那個特別的提交快照,你可以使用 git tag給它打上標(biāo)簽。比如我們今天終于完成了V1.1版本的開發(fā)、測試,并成功上線了,那就可給今天最后這個提交打一個標(biāo)簽“V1.1”,便于版本管理。

默認(rèn)標(biāo)簽是打在最新提交的commit上的,如果希望在指定的提交上打標(biāo)簽則帶上提交編號(commit id):git tag v0.9 f52c633

指令描述git tag查看標(biāo)簽列表git tag -l 'a*'查看名稱是“a”開頭的標(biāo)簽列表,帶查詢參數(shù)git show [tagname]查看標(biāo)簽信息git tag [tagname]創(chuàng)建一個標(biāo)簽,默認(rèn)標(biāo)簽是打在最新提交的commit上的git tag [tagname] [commit id]新建一個tag在指定commit上git tag -a v5.1 -m'v5.1版本'創(chuàng)建標(biāo)簽v5.1.1039,-a指定標(biāo)簽名,-m指定說明文字git tag -d [tagname]刪除本地標(biāo)簽git checkout v5.1.1039切換標(biāo)簽,同切換分支git push [remote] v5.1推送標(biāo)簽,標(biāo)簽不會默認(rèn)隨代碼推送推送到服務(wù)端git push [remote] --tags提交所有tag

如果要推送某個標(biāo)簽到遠(yuǎn)程,使用命令git push origin [tagname],或者,一次性推送全部到遠(yuǎn)程:git push origin --tags

注意:標(biāo)簽總是和某個commit掛鉤。如果這個commit既出現(xiàn)在master分支,又出現(xiàn)在dev分支,那么在這兩個分支上都可以看到這個標(biāo)簽。

09、后悔藥-怎么撤銷變更?

發(fā)現(xiàn)寫錯了要回退怎么辦?看看下面幾種后悔指令吧!

?還沒提交的怎么撤銷?checkout、reset

還未提交的修改(工作區(qū)、暫存區(qū))不想要了,用簽出指令(checkout)進(jìn)行撤銷清除。

或者用checkout的新版回滾指令reset。

?已提交但么有push的提交如何撤銷?—— reset、revert

?已push的提交如何撤銷?—— 同上,先本地撤銷,然后強(qiáng)制推送git push origin -f,??注意慎用! 記得先pull獲取更新。

9.1、后悔指令

指令描述git checkout .撤銷工作區(qū)的(未暫存)修改,把暫存區(qū)恢復(fù)到工作區(qū)。不影響暫存區(qū),如果沒暫存,則撤銷所有工作區(qū)修改git checkout [file]同上,

file指定文件git checkout HEAD .撤銷工作區(qū)、暫存區(qū)的修改,用HEAD指向的當(dāng)前分支最新版本替換工作區(qū)、暫存區(qū)git checkout HEAD [file]同上,file指定文件

git reset撤銷暫存區(qū)狀態(tài),同git reset HEAD,不影響工作區(qū)git reset HEAD [file]同上,指定文件file,HEAD可省略git reset [commit]回退到指定版本,清空暫存區(qū),不影響工作區(qū)。工作區(qū)需要手動git checkout簽出git reset --soft [commit]移動分支master、HEAD到指定的版本,不影響暫存區(qū)、工作區(qū),需手動git checkout簽出更新git reset --hard HEAD撤銷工作區(qū)、暫存區(qū)的修改,用當(dāng)前最新版git reset --hard HEAD~回退到上一個版本,并重置工作區(qū)、暫存區(qū)內(nèi)容。git reset --hard [commit]回退到指定版本,并重置工作區(qū)、暫存區(qū)內(nèi)容。

git revert[commit]撤銷一個提交,會用一個新的提交(原提交的逆向操作)來完成撤銷操作,如果已push則重新push即可

git checkout .、git checkout [file] 會清除工作區(qū)中未添加到暫存區(qū)的修改,用暫存區(qū)內(nèi)容替換工作區(qū)。

git checkout HEAD .、git checkout HEAD [file] 會清除工作區(qū)、暫存區(qū)的修改,用HEAD指向的當(dāng)前分支最新版本替換暫存區(qū)、工作區(qū)。

9.2、回退版本reset

reset是專門用來撤銷修改、回退版本的指令,支持的場景比較多,多種撤銷姿勢,所以參數(shù)組合也比較多。簡單理解就是移動master分支、HEAD的“指針”地址,理解這一點(diǎn)就基本掌握reset了。

如下圖:

回退版本git reset --hard v4 或 git reset --hard HEAD~2,master、HEAD會指向v4提交,v5、v6就被廢棄了。

也可以重新恢復(fù)到v6版本:git reset --hard v6,就是移動master、HEAD的“指針”地址。

reset有三種模式,對應(yīng)三種參數(shù):mixed(默認(rèn)模式)、soft、hard。三種參數(shù)的主要區(qū)別就是對工作區(qū)、暫存區(qū)的操作不同。

mixed為默認(rèn)模式,參數(shù)可以省略。

只有hard模式會重置工作區(qū)、暫存區(qū),一般用這個模式會多一點(diǎn)。

*模式名稱*描述HEAD的位置暫存區(qū)工作區(qū)soft回退到某一個版本,工作區(qū)不變,需手動git checkout修改不修改不修改mixed(默認(rèn))撤銷暫存區(qū)狀態(tài),不影響工作區(qū),需手動git checkout修改修改不修改hard重置未提交修改(工作區(qū)、暫存區(qū))修改修改修改

穿梭前,用git log可以查看提交歷史,以便確定要回退到哪個版本。要重返未來,用git reflog查看命令歷史,以便確定要回到未來的哪個版本。

9.3、撤銷提交revert

安全的撤銷某一個提交記錄,基本原理就是生產(chǎn)一個新的提交,用原提交的逆向操作來完成撤銷操作。注意,這不同于reset,reset是回退版本,revert只是用于撤銷某一次歷史提交,操作是比較安全的。

如上圖:

想撤銷v4的修改,執(zhí)行g(shù)it revert v4,會產(chǎn)生一個新的提交v-4,是v4的逆向操作。

同時更新maser、HEAD“指針”位置,以及工作區(qū)內(nèi)容。

如果已push則重新push即可。

9.4、checkout/reset/revert總結(jié)

標(biāo)題 指令checkoutresetrevert主要作用(撤銷)撤銷工作區(qū)、暫存區(qū)未提交修改回退版本,重置工作區(qū)、暫存區(qū)撤銷某一次提交撤銷工作區(qū)git checkout [file]git reset HEAD [file]

撤銷工作區(qū)、暫存區(qū)git checkout HEAD [file]git reset --hard HEAD [file]

回退版本

git reset --hard [commit]

安全性只針對未提交修改,安全如回退了已push提交,不安全安全

可看出reset完全可以替代checkout來執(zhí)行撤銷、回退操作,reset本來也是專門用來干這個事情的,可以拋棄checkout了(撤銷的時候)。

10、工作中的Git實(shí)踐

10.1、Git flow

Git flow(Git工作流程)是指軟件項(xiàng)目中的一種Git分支管理模型,經(jīng)過了大量的實(shí)踐和優(yōu)化,被認(rèn)為是現(xiàn)代敏捷軟件開發(fā)和DevOps(開發(fā)、技術(shù)運(yùn)營和質(zhì)量保障三者的交集)的最佳實(shí)踐。Git flow主要流程及關(guān)鍵分支:原圖地址-processon

?主分支:master,穩(wěn)定版本代碼分支,對外可以隨時編譯發(fā)布的分支,不允許直接Push代碼,只能請求合并(pull request),且只接受hotfix、release分支的代碼合并。

?熱修復(fù)分支:hotfix,針對線上緊急問題、bug修復(fù)的代碼分支,修復(fù)完后合并到主分支、開發(fā)分支。

① 切換到hotfix分支,從master更新代碼;

② 修復(fù)bug;

③ 合并代碼到dev分支,在本地Git中操作即可;

④ 合并代碼到master分支。

?發(fā)版分支:release,版本發(fā)布分支,用于迭代版本發(fā)布。迭代開發(fā)完成后,合并dev代碼到release,在release分支上編譯發(fā)布版本,以及修改bug(定時同步bug修改到dev分支)。測試完成后此版本可以作為發(fā)版使用,然后把穩(wěn)定的代碼push到master分支,并打上版本標(biāo)簽。

?開發(fā)分支:dev,開發(fā)版本分支,針對迭代任務(wù)開發(fā)的分支,日常開發(fā)原則上都在此分支上面,迭代完成后合并到release分支,開發(fā)、發(fā)版兩不誤。

?其他開發(fā)分支:dev-xxx,開發(fā)人員可以針對模塊自己創(chuàng)建本地分支,開發(fā)完成后合并到dev開發(fā)分支,然后刪除本地分支。

10.2、金屋藏嬌stash

當(dāng)你正在dev分支開發(fā)一個功能時,代碼寫了一半,突然有一個線上的bug急需要馬上修改。dev分支Bug沒寫完,不方便提交,就不能切換到主分支去修復(fù)線上bug。Git提供一個stash功能,可以把當(dāng)前工作區(qū)、暫存區(qū) 未提交的內(nèi)容“隱藏”起來,就像什么都沒發(fā)生一樣。

在上面示例中,有未提交修改,切換分支時報錯。錯誤提示信息很明確了,commit提交或stash隱藏:Please commit your changes or stash them before you switch branches.

如果切換分支時,未提交修改的內(nèi)容沒有沖突,是可以成功切換的,未提交修改會被帶過去。

指令描述git stash把未提交內(nèi)容隱藏起來,包括未暫存、已暫存。等以后恢復(fù)現(xiàn)場后繼續(xù)工作git stash list查看所有被隱藏的內(nèi)容列表git stash pop恢復(fù)被隱藏的內(nèi)容,同時刪除隱藏記錄git stash save "message"同git stash,可以備注說明messagegit stash Apply恢復(fù)被隱藏的文件,但是隱藏記錄不刪除git stash drop刪除隱藏記錄

當(dāng)然這里先提交到本地也是可以的,只是提交不是一個完整的功能代碼,而是殘缺的一部分,影響也不大。

揀選提交cherry-pick

當(dāng)有一個緊急bug,在dev上修復(fù)完,我們需要把dev上的這個bug修復(fù)所做的修改“復(fù)制”到master分支,但不想把整個dev合并過去。為了方便操作,Git專門提供了一個cherry-pick命令,讓我們能復(fù)制一個特定的提交到當(dāng)前分支,而不管這個提交在哪個分支。

如上圖,操作過程相當(dāng)于將該提交導(dǎo)出為補(bǔ)丁文件,然后在當(dāng)前HEAD上重放,形成無論內(nèi)容還是提交說明都一致的提交。

希望把dev分支上的v7提交的內(nèi)容合并到master,但不需要其他的內(nèi)容。

在master分支上執(zhí)行指令git cherry-pick v7,會產(chǎn)生一個新的v7'提交,內(nèi)容和v7相同。

同時更新master、HEAD,以及工作區(qū)。

作者:安木夕

收錄于合集 #所有原創(chuàng)

分享到:
標(biāo)簽:Git
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定