Git詳細(xì)介紹和使用

git /g?t/ 是一個(gè)開(kāi)源的分布式版本控制系統(tǒng)

最初是 Linus Torvalds 為了幫助管理 Linux 內(nèi)核開(kāi)發(fā)而開(kāi)發(fā)的一個(gè)開(kāi)放源碼的版本控制軟件

介紹

版本控制

版本控制是一種記錄一個(gè)或若干文件內(nèi)容變化赖舟,以便將來(lái)查閱特定版本修訂情況的系統(tǒng)。可以對(duì)任何類(lèi)型的文件進(jìn)行版本控制,便于不同的開(kāi)發(fā)者協(xié)同工作

集中式版本控制

集中化的版本控制系統(tǒng)是為了讓不同系統(tǒng)上的開(kāi)發(fā)者協(xié)同工作里烦。例如 SVN,它會(huì)有一個(gè)單一的集中管理的服務(wù)器锥债,保存所有文件的修訂版本岸售,而協(xié)同工作的人通過(guò)客戶端連接到這臺(tái)服務(wù)器,拉取最新的文件或者是提交更新

在這個(gè)系統(tǒng)中翰灾,每個(gè)人可以看到項(xiàng)目中其他人的工作缕粹,管理員也能很好的掌握和分配每個(gè)開(kāi)發(fā)者的權(quán)限。但由于版本庫(kù)是集中在服務(wù)器上的纸淮,如果出現(xiàn)了中央服務(wù)器的單點(diǎn)故障平斩,在這個(gè)時(shí)間內(nèi),誰(shuí)都無(wú)法提交更新咽块,而且整個(gè)項(xiàng)目的歷史記錄被保存在單一位置绘面,就有丟失所有歷史更新記錄的風(fēng)險(xiǎn)

分布式版本控制

分布式的版本控制解決了集中化版本控制的一些問(wèn)題,客戶端并不只提取最新版本的文件快照侈沪,而是把代碼倉(cāng)庫(kù)完整地鏡像下來(lái)揭璃。這么一來(lái),任何一處協(xié)同工作用的服務(wù)器發(fā)生故障亭罪,事后都可以用任何一個(gè)鏡像出來(lái)的本地倉(cāng)庫(kù)恢復(fù)瘦馍。因?yàn)槊恳淮蔚目寺〔僮鳎瑢?shí)際上都是一次對(duì)代碼倉(cāng)庫(kù)的完整備份

更進(jìn)一步应役,許多這類(lèi)系統(tǒng)都可以指定和若干不同的遠(yuǎn)端代碼倉(cāng)庫(kù)進(jìn)行交互情组。籍此,你就可以在同一個(gè)項(xiàng)目中箩祥,分別和不同工作小組的人相互協(xié)作院崇。你可以根據(jù)需要設(shè)定不同的協(xié)作流程,比如層次模型式的工作流袍祖,而這在以前的集中式系統(tǒng)中是無(wú)法實(shí)現(xiàn)的

Git 介紹

直接記錄快照底瓣,而非差異比較

Git 保存的不是文件的變化或者差異,而是一系列不同時(shí)刻的文件快照

Git 把數(shù)據(jù)看作是對(duì)小型文件系統(tǒng)的一組快照盲泛。 每次提交更新濒持,或在 Git 中保存項(xiàng)目狀態(tài)時(shí),它會(huì)對(duì)當(dāng)時(shí)的全部文件制作一個(gè)快照并保存這個(gè)快照的索引寺滚。 為了高效柑营,如果文件沒(méi)有修改,Git 不再重新存儲(chǔ)該文件村视,而是只保留一個(gè)鏈接指向之前存儲(chǔ)的文件官套。Git 對(duì)待數(shù)據(jù)更像是一個(gè)快照流

近乎所有操作都是本地執(zhí)行

在 Git 中的絕大多數(shù)操作都只需要訪問(wèn)本地文件和資源,因?yàn)槟阍诒镜卮疟P(pán)上就有項(xiàng)目的完整歷史,所以大部分操作看起來(lái)瞬間完成奶赔,

Git 保證完整性

Git 中所有數(shù)據(jù)在存儲(chǔ)前都計(jì)算校驗(yàn)和惋嚎,然后以校驗(yàn)和來(lái)引用

Git 一般只添加數(shù)據(jù)

執(zhí)行的 Git 操作,幾乎只往 Git 數(shù)據(jù)庫(kù)中增加數(shù)據(jù)

Git安裝

Linux 上安裝

Linux 上使用 yum 安裝站刑,yum install git

$ sudo yum install git

Windows 上安裝

官網(wǎng)上下載安裝包安裝即可

https://git-scm.com/downloads

配置用戶信息

安裝完后需要設(shè)置用戶名稱(chēng)和郵件地址另伍,這樣做很重要,因?yàn)槊恳粋€(gè) Git 的提交都會(huì)使用這些信息绞旅,并且它會(huì)寫(xiě)入到你的每一次提交中摆尝,不可更改

$ git config --global user.name "zou"
$ git config --global user.email zouxq412@foxmail.com

配置完后可以使用 git config --list 查看配置信息

使用了 --global 選項(xiàng),表示全局配置因悲,那么該命令只需要運(yùn)行一次堕汞,因?yàn)橹鬅o(wú)論你在該系統(tǒng)上做任何事情, Git 都會(huì)使用那些信息晃琳。 當(dāng)你想針對(duì)特定項(xiàng)目使用不同的用戶名稱(chēng)與郵件地址時(shí)讯检,可以在那個(gè)項(xiàng)目目錄下運(yùn)行沒(méi)有 --global 選項(xiàng)的命令來(lái)配置

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

在了解 Git 的基本操作之前卫旱,我們先來(lái)了解 Git 工作區(qū)人灼、暫存區(qū)和版本庫(kù)的概念

在 Git 中的文件有三種狀態(tài):已提交(committed): 表示數(shù)據(jù)已經(jīng)安全的保存在本地?cái)?shù)據(jù)庫(kù)中;已修改(modified): 表示修改了文件誊涯,但還沒(méi)保存到數(shù)據(jù)庫(kù)中挡毅;已暫存(staged): 表示對(duì)一個(gè)已修改文件的當(dāng)前版本做了標(biāo)記,使之包含在下次提交的快照中

由此也引入了 Git 項(xiàng)目的三個(gè)工作區(qū)域的概念:

  • 工作區(qū): 就是項(xiàng)目文件所在的目錄
  • 暫存區(qū): stage 或 index暴构。一般存放在 .git/index 文件中跪呈,所以我們把暫存區(qū)有時(shí)也叫作索引
  • 版本庫(kù): 工作區(qū)下隱藏目錄 .git,這里記錄著倉(cāng)庫(kù)的版本信息和歷史記錄

下面這個(gè)圖展示了工作區(qū)取逾、版本庫(kù)中的暫存區(qū)和版本庫(kù)之間的關(guān)系:

下面我們通過(guò)創(chuàng)建倉(cāng)庫(kù)和基本操作來(lái)了解這三個(gè)工作區(qū)域的關(guān)系

Git 倉(cāng)庫(kù)創(chuàng)建及基本操作

創(chuàng)建 Git 倉(cāng)庫(kù)

倉(cāng)庫(kù)也叫版本庫(kù)(repository)耗绿,可以簡(jiǎn)單理解成一個(gè)目錄,這個(gè)目錄里面的所有文件都可以被 Git 管理起來(lái)砾隅,每個(gè)文件的修改误阻、刪除,Git都能跟蹤晴埂,以便任何時(shí)刻都可以追蹤歷史究反,或者在將來(lái)某個(gè)時(shí)刻可以還原

創(chuàng)建并初始化倉(cāng)庫(kù)

git init 是用來(lái)初始化一個(gè) Git 倉(cāng)庫(kù)的

git init

該命令會(huì)在當(dāng)前目錄下創(chuàng)建一個(gè) .git 的目錄,這個(gè)子目錄含有你初始化的 Git 倉(cāng)庫(kù)中所有的必須文件儒洛。這個(gè)時(shí)候只是對(duì)倉(cāng)庫(kù)做了初始化的操作精耐,假如該目錄下原本就有文件,需要對(duì)這些文件進(jìn)行版本控制琅锻,可以通過(guò) git add <file> 跟蹤這些文件并提交 git commit -m <message>

git add .
git commit -m 'initial project version'

上面是把目錄下的所有文件提交到了倉(cāng)庫(kù)中

克隆現(xiàn)有的倉(cāng)庫(kù)

如果想獲取現(xiàn)有 Git 倉(cāng)庫(kù)的拷貝卦停,需要用 git clone <repo>git clone <repo> <directory>

repo 是倉(cāng)庫(kù)地址向胡,directory 是本地倉(cāng)庫(kù)的名稱(chēng),即目錄名稱(chēng)

如下面我要克隆 github 上的一個(gè)倉(cāng)庫(kù)惊完,并制定本地倉(cāng)庫(kù)的名稱(chēng)為 mylibname

git clone https://github.com/xxxx/xxxx mylibname

基本操作

工作目錄下的每一個(gè)文件有這兩種狀態(tài):

  • 已跟蹤 已經(jīng)納入了版本控制的文件僵芹,在上一次快照中有它們的記錄,它們的狀態(tài)可能處于 未修改小槐,已修改已放入暫存區(qū)拇派。
  • 未跟蹤 即還沒(méi)有加入到版本控制的文件

新增的未跟蹤文件(untracked),和編輯過(guò)被 Git 記為已修改的文件(modified)凿跳。 通過(guò) git add 放入暫存區(qū)(staged)攀痊,然后 git commit 提交所有暫存了的修改,提交后的文件即為未修改文件(unmodified)拄显,如此反復(fù)

git文件的狀態(tài)變化周期

操作命令:

  • git status 查看文件狀態(tài)
  • git add 添加文件到暫存區(qū),包括未跟蹤和修改的文件
  • git diff 查看修改內(nèi)容
  • git commit 提交更新案站,添加暫存區(qū)的內(nèi)容到本地倉(cāng)庫(kù)
  • git reset HEAD 取消暫存
  • git rm 移除文件
  • git mv 移動(dòng)文件

這里我新建一個(gè) demo 目錄作為倉(cāng)庫(kù)躬审,并初始化這個(gè)倉(cāng)庫(kù)

接下來(lái)我們使用上面新建的倉(cāng)庫(kù) demo,并對(duì)里面的文件做一些操作

先創(chuàng)建一個(gè)新的文件 touch readme.txt

查看當(dāng)前文件狀態(tài)

要查看倉(cāng)庫(kù)目錄下哪些文件處于狀態(tài)狀態(tài)蟆盐,使用 git status 命令

  • Untracked files 未被跟蹤的文件
  • Changes not staged for commit 修改的文件
  • Changes to be committed 暫存狀態(tài)文件

可以看到新建的文件 readme.txt 的文件狀態(tài)為 untracked承边,并提示我們要通過(guò) git add <file> 命令去跟蹤我們需要提交的文件

如果使用 git status -s 命令或 git status --short 命令,將得到一種更為緊湊的格式輸出

跟蹤新文件/ 暫存已修改的文件

使用命令 git add <file> 開(kāi)始跟蹤一個(gè)文件或暫存修改的文件石挂,會(huì)把文件添加到暫存區(qū)

git add readme.txt

再次使用 git status 命令查看博助,會(huì)看到 readme.txt 文件已經(jīng)被跟蹤,并處于暫存狀態(tài)痹愚。Changes to be committed 下的文件就是處于暫存狀態(tài)

git add 命令使用文件或目錄的路徑作為參數(shù)富岳;如果參數(shù)是目錄的路徑,該命令將遞歸地跟蹤該目錄下的所有文件

該命令還用來(lái)暫存已修改的文件拯腮,就是 Changes not staged for commit下的文件

查看已暫存和未暫存的修改

這個(gè)時(shí)候假如我們對(duì)暫存的文件進(jìn)行了修改

echo 'My Project' > readme.txt

使用 git status 命令查看窖式,我們可以看到多出了一個(gè)未被暫存,被修改狀態(tài)的文件动壤,而使用 git status 命令并不能看到具體修改的地方萝喘,這時(shí)可以用 git diff 來(lái)查看未暫存的文件更新的部分

輸入 git diff 來(lái)查看未暫存的文件更新的部分

該命令比較的是工作目錄中當(dāng)前文件和暫存區(qū)域快照之間的差異, 也就是修改之后還沒(méi)有暫存起來(lái)的變化內(nèi)容琼懊。若要查看已暫存的將要添加到下次提交里的內(nèi)容阁簸,可以用 git diff --cached 命令

  • git diff 尚未暫存的改動(dòng)
  • git diff --cached 查看已暫存的改動(dòng)

提交更新

當(dāng)暫存區(qū)的文件已經(jīng)準(zhǔn)備妥當(dāng)可以提交了,可以通過(guò)命令 git commit 來(lái)提交哼丈,或者直接加入說(shuō)明 git commit -m <message>

git commit

這種方式會(huì)啟動(dòng)文本編輯器以便輸入本次提交的說(shuō)明(這里的編輯器是 vim)

使用 git commit -m <message>

請(qǐng)記住启妹,提交時(shí)記錄的是放在暫存區(qū)域的快照。 任何還未暫存的仍然保持已修改狀態(tài)削祈,可以在下次提交時(shí)納入版本管理翅溺。 每一次運(yùn)行提交操作脑漫,都是對(duì)你項(xiàng)目作一次快照,以后可以回到這個(gè)狀態(tài)咙崎,或者進(jìn)行比較

跳過(guò)使用暫存區(qū)域

Git 提供了一個(gè)跳過(guò)使用暫存區(qū)域的方式优幸, 只要在提交的時(shí)候,給 git commit 加上 -a 選項(xiàng)褪猛,Git 就會(huì)自動(dòng)把所有已經(jīng)跟蹤過(guò)的文件暫存起來(lái)一并提交网杆,從而跳過(guò) git add 步驟

取消暫存

git reset HEAD <file>... 用來(lái)取消已暫存的內(nèi)容

我們修改下 readme.txt ,并 git add 到暫存區(qū)

echo 'modify content' > readme.txt
git add readme.txt

通過(guò) git status 可以看到 readme.txt 已經(jīng)添加到暫存區(qū)了

假如這時(shí)不想把它提交更新并加入到下一次的快照當(dāng)中伊滋,就可以通過(guò)git reset HEAD <file> 去取消已暫存的內(nèi)容

git reset HEAD readme.txt

撤消對(duì)文件的修改

如果你想撤銷(xiāo)對(duì)文件的修改碳却,也就是還原到未修改前的狀態(tài),可以使用 git checkout -- [file] 命令笑旺。該命令會(huì)取消你對(duì)該文件做的修改內(nèi)容昼浦。

移除文件

假如我們現(xiàn)在去刪除 readme.txt 這個(gè)文件,再通過(guò) git status 查看狀態(tài)

它是會(huì)記錄我們的刪除操作筒主,標(biāo)記為未暫存的文件

然后再運(yùn)行 git rm <file> 記錄此次移除文件的操作

下次提交更新 git commit 之后关噪,該文件就不再納入版本控制管理中了

如果刪除之前修改過(guò)并且已經(jīng)放到暫存區(qū)域的話,則必須要用強(qiáng)制刪除選項(xiàng) -f乌妙,即git rm -f <file>

如果把文件從暫存區(qū)域移除使兔,但仍然希望保留在當(dāng)前工作目錄中,換句話說(shuō)藤韵,僅是從跟蹤清單中刪除虐沥,使用 --cached 選項(xiàng)即可

移動(dòng)文件

git mv 命令用于移動(dòng)或重命名一個(gè)文件、目錄泽艘、軟連接欲险。

我們先撤銷(xiāo)對(duì) readme.txt 文件的刪除

 git reset HEAD readme.txt
 git checkout -- readme.txt

然后使用 git mv 對(duì)其重命名

git mv readme.txt README.md

Git 主要功能

遠(yuǎn)程倉(cāng)庫(kù)(github)

上面我們有關(guān)的命名操作都是本地執(zhí)行,如果需要分享代碼或與其他開(kāi)發(fā)人員協(xié)同工作悉盆,就需要連接遠(yuǎn)程倉(cāng)庫(kù)了盯荤。這個(gè)遠(yuǎn)程倉(cāng)庫(kù)是指托管在因特網(wǎng)或其他網(wǎng)絡(luò)中的你的項(xiàng)目的版本庫(kù)

這里我們使用 github 作為遠(yuǎn)程倉(cāng)庫(kù)

添加遠(yuǎn)程倉(cāng)庫(kù)

運(yùn)行 git remote add <shortname> <url> 添加一個(gè)新的遠(yuǎn)程 Git 倉(cāng)庫(kù)

這里是以 github 做為遠(yuǎn)程倉(cāng)庫(kù)為例,本地 Git 倉(cāng)庫(kù)和 GitHub 倉(cāng)庫(kù)之間的傳輸是通過(guò)SSH加密的焕盟,我們需要先配置驗(yàn)證信息

使用以下命令生成 SSH Key

ssh-keygen -t rsa -C "zouxq412@foxmail.com"

這里的郵箱為你 github 賬號(hào)綁定的郵箱秋秤,生成 SSH Key 后我們?nèi)サ剿4娴穆窂?~/.ssh 下打開(kāi) id_rsa.pub 復(fù)制里面的公鑰

然后我們?nèi)サ?github 的設(shè)置中心找到 SSH and GPG keys,點(diǎn)擊 New SSH key 設(shè)置 SSH 公鑰

將復(fù)制的 SSH 公鑰添加并保存

為了驗(yàn)證是否成功脚翘,使用命令 ssh -T git@github.com

接下來(lái)我們?cè)?github上去新建一個(gè)倉(cāng)庫(kù)

創(chuàng)建成功后灼卢,顯示以下信息

上面會(huì)有一些提示,允許我們創(chuàng)建一個(gè)新的本地倉(cāng)庫(kù)或把已存在的倉(cāng)庫(kù)推到 github倉(cāng)庫(kù)上来农,這里我們直接把直接的 demo 上傳到這個(gè) github 倉(cāng)庫(kù)中

git remote add origin https://github.com/Morgan412/demo.git
git push -u origin master

第一次會(huì)讓我們輸入 github 的賬號(hào)密碼

git push 會(huì)把本地倉(cāng)庫(kù)的內(nèi)容推送到遠(yuǎn)程倉(cāng)庫(kù)中鞋真,這時(shí)可以刷新下 github 的倉(cāng)庫(kù)頁(yè)面,會(huì)發(fā)現(xiàn)已經(jīng)有上傳的內(nèi)容了

推送到遠(yuǎn)程倉(cāng)庫(kù)的命令為: git push [remote-name] [branchname]

查看當(dāng)前的遠(yuǎn)程倉(cāng)庫(kù)

查看你已經(jīng)配置的遠(yuǎn)程倉(cāng)庫(kù)服務(wù)器沃于,可以運(yùn)行 git remote 命令涩咖, 它會(huì)列出你指定的每一個(gè)遠(yuǎn)程服務(wù)器的簡(jiǎn)寫(xiě)海诲,也可以指定選項(xiàng) -v,會(huì)顯示需要讀寫(xiě)遠(yuǎn)程倉(cāng)庫(kù)使用的 Git 保存的簡(jiǎn)寫(xiě)與其對(duì)應(yīng)的 URL

如果想要查看某一個(gè)遠(yuǎn)程倉(cāng)庫(kù)的更多信息檩互,可以使用 git remote show [remote-name] 命令

從遠(yuǎn)程倉(cāng)庫(kù)中抓取與拉取

從遠(yuǎn)程倉(cāng)庫(kù)獲取數(shù)據(jù)的命令

git fetch [remote-name]

這個(gè)命令會(huì)訪問(wèn)遠(yuǎn)程倉(cāng)庫(kù)特幔,從中拉取所有你還沒(méi)有的數(shù)據(jù),git fetch origin 會(huì)抓取克抡⒆颉(或上一次抓闰撬埂)后新推送的所有工作。 必須注意 git fetch 命令會(huì)將數(shù)據(jù)拉取到你的本地倉(cāng)庫(kù)饵较,當(dāng)它并不會(huì)自動(dòng)合并或修改你當(dāng)前的工作拍嵌,這個(gè)時(shí)候我們可以運(yùn)行 git merge [alias]/[branch] 來(lái)合并分支

現(xiàn)在我們?cè)?github 的遠(yuǎn)程倉(cāng)庫(kù)中修改 README.md 文件,然后運(yùn)行 git fetch origin

可以看到信息提示遠(yuǎn)程倉(cāng)庫(kù)的 master 有更新循诉,這時(shí)再運(yùn)行 git merge origin/master

README.md 文件被合并更新

如果你有一個(gè)分支設(shè)置為跟蹤一個(gè)遠(yuǎn)程分支横辆,可以使用 git pull <remote> <branch> 命令來(lái)自動(dòng)的抓取然后合并遠(yuǎn)程分支到當(dāng)前分支。默認(rèn)情況下茄猫,git clone 命令會(huì)自動(dòng)設(shè)置本地 master 分支跟蹤克隆的遠(yuǎn)程倉(cāng)庫(kù)的 master 分支龄糊。 運(yùn)行 git pull 通常會(huì)從最初克隆的服務(wù)器上抓取數(shù)據(jù)并自動(dòng)嘗試合并到當(dāng)前所在的分支。

遠(yuǎn)程倉(cāng)庫(kù)的移除與重命名

git remote rename 去修改一個(gè)遠(yuǎn)程倉(cāng)庫(kù)的簡(jiǎn)寫(xiě)名
git remote rm [name] 可以去移除一個(gè)遠(yuǎn)程倉(cāng)庫(kù)

標(biāo)簽管理

Git 可以給歷史中的某一個(gè)提交打上標(biāo)簽募疮,可以使用這個(gè)功能來(lái)標(biāo)記發(fā)布結(jié)點(diǎn)(如v1.0),標(biāo)簽也是版本庫(kù)的一個(gè)快照

命令:

  • git tag 查看所有的標(biāo)簽
  • git tag <name> 創(chuàng)建標(biāo)簽
  • git tag -v <name> -m <message> 創(chuàng)建附注標(biāo)簽
  • git push origin [tagname] 推送標(biāo)簽到遠(yuǎn)程倉(cāng)庫(kù)
  • git tag -d <tagname> 刪除本地倉(cāng)庫(kù)標(biāo)簽
  • git push <remote> :refs/tags/<tagname> 更新遠(yuǎn)程倉(cāng)庫(kù)標(biāo)簽

創(chuàng)建標(biāo)簽

創(chuàng)建標(biāo)簽命令 git tag <name>

git tag -v <name> -m <message> 可以創(chuàng)建一個(gè)附注標(biāo)簽

首先我們要切換到需要打標(biāo)簽的分支上僻弹,然后使用創(chuàng)建標(biāo)簽命令 git tag <name>

git tag v1.0.0

git tag 可以查看所有的標(biāo)簽

后期打標(biāo)簽

默認(rèn)情況下阿浓,標(biāo)簽是打在最新提交 commit 上的,假如我想對(duì)過(guò)去的某個(gè)歷史快照節(jié)點(diǎn)打標(biāo)簽?zāi)靥U溃科鋵?shí)也是可以的

git log --pretty=oneline --abbrev-commit 查看歷史 commit id芭毙,然后打上對(duì)應(yīng)標(biāo)簽即可

$ git log --pretty=oneline --abbrev-commit
459f6fc (HEAD -> master, origin/master) Update README.md
e241626 修改內(nèi)容
a9dec5d first commit

如我要給 “修改內(nèi)容” 這次 commit 打上標(biāo)簽

git tag v1.0.1 e241626

標(biāo)簽操作

共享標(biāo)簽

默認(rèn)情況下,git push 命令并不會(huì)傳送標(biāo)簽到遠(yuǎn)程倉(cāng)庫(kù)服務(wù)器上卸耘。 在創(chuàng)建完標(biāo)簽后你必須顯式地推送標(biāo)簽到共享服務(wù)器上退敦。 這個(gè)過(guò)程就像共享遠(yuǎn)程分支一樣,你可以運(yùn)行 git push origin [tagname]

如果想要一次性推送很多標(biāo)簽蚣抗,也可以使用帶有 --tags 選項(xiàng)的 git push 命令侈百。 這將會(huì)把所有不在遠(yuǎn)程倉(cāng)庫(kù)服務(wù)器上的標(biāo)簽全部傳送到那里

刪除標(biāo)簽

使用命令 git tag -d <tagname> 可以刪除掉本地倉(cāng)庫(kù)上的標(biāo)簽

上面的命令并不會(huì)從任何遠(yuǎn)程倉(cāng)庫(kù)中移除這個(gè)標(biāo)簽,如果要移除遠(yuǎn)程倉(cāng)庫(kù)的標(biāo)簽必須使用 git push <remote> :refs/tags/<tagname> 來(lái)更新你的遠(yuǎn)程倉(cāng)庫(kù)

分支管理

分支就像是科幻電影里面的平行宇宙翰铡,當(dāng)你正在電腦前努力學(xué)習(xí)Git的時(shí)候钝域,另一個(gè)你正在另一個(gè)平行宇宙里努力學(xué)習(xí)SVN

如果兩個(gè)平行宇宙互不干擾,那對(duì)現(xiàn)在的你也沒(méi)啥影響锭魔。不過(guò)例证,在某個(gè)時(shí)間點(diǎn),兩個(gè)平行宇宙合并了迷捧,結(jié)果织咧,你既學(xué)會(huì)了Git又學(xué)會(huì)了SVN胀葱!

在實(shí)際工作中,當(dāng)你需要完成某個(gè)需要笙蒙,而這個(gè)需求你可能需要2天才能完成抵屿,這時(shí)你可以新建一個(gè)分支,在分支上的任何改動(dòng)都是不影響其他分支的手趣,當(dāng)你完成了需求之后晌该,再合并分支

命令:

  • git branch 列出分支,當(dāng)前分支前面會(huì)標(biāo)一個(gè)*號(hào)
  • git branch <branchname> 創(chuàng)建分支
  • git checkout <branchname> 切換分支
  • git checkout -b <branchname> 創(chuàng)建并切換分支
  • git merge 合并分支
  • git branch -d <branchname> 刪除分支

分支的創(chuàng)建和合并

創(chuàng)建分支

git branch <branchname>
git checkout <branchname>

想要新建一個(gè)分支并同時(shí)切換到那個(gè)分支上绿渣,你可以運(yùn)行一個(gè)帶有 -b 參數(shù)的 git checkout 命令朝群,等同于上面兩個(gè)命令

git checkout -b newb

git branch 列出分支,當(dāng)前分支前面會(huì)標(biāo)一個(gè)*號(hào)

合并分支

一旦某分支有了獨(dú)立內(nèi)容中符,你終究會(huì)希望將它合并回到你的主分支

使用 git merge 命令將任何分支合并到當(dāng)前分支中去

假如我們現(xiàn)在對(duì)新的分支內(nèi)容有了修改姜胖,現(xiàn)在要合并到主分支中

合并沖突

當(dāng)Git無(wú)法自動(dòng)合并分支時(shí),就必須首先解決沖突淀散。解決沖突后右莱,再提交,合并完成

解決沖突就是把 Git 合并失敗的文件手動(dòng)編輯為我們希望的內(nèi)容档插,再提交

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末慢蜓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子郭膛,更是在濱河造成了極大的恐慌晨抡,老刑警劉巖组题,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件久橙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡同欠,警方通過(guò)查閱死者的電腦和手機(jī)棍现,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)调煎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人己肮,你說(shuō)我怎么就攤上這事士袄。” “怎么了谎僻?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵窖剑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我戈稿,道長(zhǎng)西土,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任鞍盗,我火速辦了婚禮需了,結(jié)果婚禮上跳昼,老公的妹妹穿的比我還像新娘。我一直安慰自己肋乍,他們只是感情好鹅颊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著墓造,像睡著了一般堪伍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上觅闽,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天帝雇,我揣著相機(jī)與錄音,去河邊找鬼蛉拙。 笑死尸闸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的孕锄。 我是一名探鬼主播吮廉,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼畸肆!你這毒婦竟也來(lái)了宦芦?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤轴脐,失蹤者是張志新(化名)和其女友劉穎踪旷,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體豁辉,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年舀患,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了徽级。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡聊浅,死狀恐怖餐抢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情低匙,我是刑警寧澤旷痕,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站顽冶,受9級(jí)特大地震影響欺抗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜强重,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一绞呈、第九天 我趴在偏房一處隱蔽的房頂上張望贸人。 院中可真熱鬧,春花似錦佃声、人聲如沸艺智。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)十拣。三九已至,卻和暖如春志鹃,著一層夾襖步出監(jiān)牢的瞬間夭问,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工弄跌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甲喝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓铛只,卻偏偏與公主長(zhǎng)得像埠胖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子淳玩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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

  • Git 是目前最流行的分布式版本控制系統(tǒng)之一直撤。 版本控制指的是,記錄每次版本變更的內(nèi)容和時(shí)間等細(xì)節(jié)蜕着,保留各版本之間...
    神齊閱讀 1,421評(píng)論 0 7
  • 前言 Git是什么 官方話:Git是一個(gè)免費(fèi)的開(kāi)源分布式版本控制系統(tǒng)谋竖,旨在快速高效地處理從小型到大型項(xiàng)目的所有事務(wù)...
    梅先森森森森森森閱讀 2,018評(píng)論 1 3
  • 該篇文章為學(xué)習(xí)廖雪峰git教程的總結(jié),具體可移步廖雪峰老師git教程網(wǎng)站 Git介紹 Git是分布式版本控制系統(tǒng)承匣。...
    Pig_deng飼養(yǎng)員閱讀 968評(píng)論 0 1
  • 還是老規(guī)矩蓖乘,這篇看完后,還是學(xué)不會(huì)git版本控制的韧骗,你來(lái)砍我 是兄弟就來(lái)砍我吧<问恪!袍暴! Git是分布式版本控制系統(tǒng)些侍,...
    Zteen閱讀 3,166評(píng)論 0 6
  • 一、基本概念: 注:對(duì)于git的分布式概念及其優(yōu)點(diǎn)政模,不重復(fù)說(shuō)明岗宣,自己百度或谷歌。本文中涉及到指令前面有$的淋样,在cm...
    大廠offer閱讀 1,425評(píng)論 0 3