濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > git checkout 命令使用詳解

git checkout 命令使用詳解

熱門(mén)標(biāo)簽:海南人工外呼系統(tǒng)哪家好 高德地圖標(biāo)注公司位置需要錢(qián)嗎 慶陽(yáng)外呼系統(tǒng)定制開(kāi)發(fā) 襄陽(yáng)外呼增值業(yè)務(wù)線路解決方案 廊坊地圖標(biāo)注申請(qǐng)入口 怎么去掉地圖標(biāo)注文字 地圖標(biāo)注資源分享注冊(cè) 北京外呼系統(tǒng)咨詢(xún)電話 合肥阿里辦理400電話號(hào)

在日常的git操作中,git checkout——檢出,是我們的常用命令。最為常用的兩種情形是創(chuàng)建分支和切換分支。

在下面的命令中,使用了一些簡(jiǎn)寫(xiě),在這里說(shuō)明一下:

git st # git status
git ci # git commit
git br # git branch
git co # git checkout
git mg # git merge
git line # git log --oneline

當(dāng)然,你也可以直接在git中敲命令,將這些簡(jiǎn)寫(xiě)添加到git配置中

git config --global -e

然后,可以插入下面的配置:

[alias]
  st = status
  co = checkout
  br = branch
  mg = merge
  ci = commit 
  md = commit --amend
  dt = difftool
  mt = mergetool
  last = log -1 HEAD
  cf = config
  line = log --oneline
  latest = for-each-ref --sort=-committerdate --format='%(committerdate:short) %(refname:short) [%(committername)]'

  ls = log --pretty=format:\"%C(yellow)%h %C(blue)%ad %C(red)%d %C(reset)%s %C(green)[%cn]\" --decorate --date=short
  hist = log --pretty=format:\"%C(yellow)%h %C(red)%d %C(reset)%s %C(green)[%an] %C(blue)%ad\" --topo-order --graph --date=short
  type = cat-file -t
  dump = cat-file -p

這樣,你也就可以使用這些簡(jiǎn)寫(xiě)的命令咯。下面步入正題啊。

(一)基礎(chǔ)——千里之行,始于切糕(checkout)

先熟悉下常用操作,創(chuàng)建分支和切換分支,也可以稱(chēng)為檢出分支。

首先我們新建一個(gè)倉(cāng)庫(kù)gitTest,然后新建文件a,為什么要用a命名呢,這里是故意為之,后面為大家揭曉分支。呵呵。或許下面的介紹會(huì)有些枯燥乏味,因?yàn)槟呀?jīng)對(duì)這些命令爛熟于胸,而且運(yùn)用得相當(dāng)熟練,那么您可以直接跳過(guò)這一步。

在master分支上,做一次提交c1,然后現(xiàn)在新建一個(gè)分支a,并切換到a分支。

這個(gè)操作主要會(huì)用到兩個(gè)命令:

創(chuàng)建新分支:git branch branchName

切換到新分支:git checkout branchName

然后,上面兩個(gè)命令也可以合成為一個(gè)命令:

git checkout -b branchName

新建遠(yuǎn)程分支

git push origin master:nggjc_project_XXXXXXX

(二)真相——HEAD是checkout的靈魂

其實(shí),我們?cè)谇袚Q分支,和新建分支的時(shí)候,有沒(méi)有想過(guò),這些操作操作背后的工作原理是怎樣的呢?最大的功臣就是.git目錄下的HEAD引用,她宛如一個(gè)芭蕾舞者,從一個(gè)分支飄逸的跳到另一個(gè)分支,雖無(wú)聲無(wú)息,卻精準(zhǔn)無(wú)比。

在我們身處master分支的時(shí)候,您一定很好奇,當(dāng)前的HEAD的內(nèi)容是什么?不妨來(lái)看看吧。

我們看到c1的提交hash值和HEAD對(duì)應(yīng)分支master的當(dāng)前hash值是一樣的。也就是說(shuō),HEAD指向的是當(dāng)前分支名master,而master又對(duì)應(yīng)了當(dāng)前的最新的一次提交ID.

好,那么我們?cè)僮鲆淮翁峤?,看看master對(duì)應(yīng)的hash值有無(wú)變化。

從上圖,我們可以不難看出,HEAD對(duì)應(yīng)的ref沒(méi)有變化,還是master,但是master對(duì)應(yīng)的commit ID卻變成了c2對(duì)應(yīng)的commit ID,即更新為最后一次提交的ID咯。

現(xiàn)在,提交一次的原理,我們已然了解,那么切換分支的時(shí)候呢??

現(xiàn)在我們身處master分支,然后我們切換到a分支,看看會(huì)發(fā)生什么樣的情況吧。

從上圖分析,在master分支上的時(shí)候,HEAD指向的是master,對(duì)應(yīng)的是c2的commit ID。而切換到a分支的時(shí)候,HEAD也相應(yīng)的指向了a,同時(shí)a對(duì)應(yīng)的是a分支上的最新commit ID。因此,我們可以得出結(jié)論,在切換分支的時(shí)候,HEAD也會(huì)相應(yīng)的指向?qū)?yīng)的分支引用。

但是,使用checkout命令的時(shí)候,并不是每次都會(huì)改變HEAD指針的指向哦。在什么情況下HEAD一直堅(jiān)定不移的擁護(hù)者他的女神呢?可謂衣帶漸寬終不悔,長(zhǎng)使英雄淚滿(mǎn)襟?。∽屛覀兘又驴?。

(三)進(jìn)階——HEAD懂不懂,看你怎么用

checkout命令用法如下:

1. git checkout [-q] [commit>] [--] paths> ...

2. git checkout [branch>]

3. git checkout [-m] [ [-b | -- orphan ] new_branch>]  [start_point] 

用法2比用法1的區(qū)別在于,用法1包含了路徑。為了避免路徑和引用(或提交ID)同名而發(fā)生沖突,可以在paths>前用兩個(gè)連續(xù)的連字符作為分隔。用法1的commit>是可選項(xiàng),如果省略,則相當(dāng)于從暫存區(qū)進(jìn)行檢出。

來(lái)看個(gè)例子:

情景1,省略掉commit>

現(xiàn)在我們處于master分支下,然后我們修改了文件a,輸入“c3”文本到a中,這時(shí)候,暫存區(qū)中的內(nèi)容是沒(méi)有"c3"的,通過(guò)git diff可以比較?,F(xiàn)在我們從當(dāng)前分支暫存區(qū)中檢出文件a。那么我們可以直接使用git checkout a。

 這時(shí)候,提示檢出失敗,git以為我們想檢出倉(cāng)庫(kù)a。還記得為什么在第一步中,我們?cè)陆ǖ奈募嗎?這里終于派上用場(chǎng)了,由于倉(cāng)庫(kù)中還存在分支a,同時(shí)當(dāng)前分支中又存在文件a,于是git傻傻分不清楚了。這時(shí)候怎么辦?有兩個(gè)辦法,第一,我們?cè)诿种У臅r(shí)候要注意語(yǔ)義性,分支名要具有一定的意義,不能使用簡(jiǎn)單的a,b,c來(lái)命名,這樣很容易導(dǎo)致分支名和文件名重復(fù);第二,參照用法1,使用兩個(gè)連字符來(lái)分隔。在目前的情形中,我們使用第二種方法吧。

這時(shí)候,發(fā)現(xiàn)工作區(qū)的內(nèi)容被暫存區(qū)的內(nèi)容覆蓋,"c3"文本也沒(méi)有了,當(dāng)然HEAD指針也沒(méi)有什么變化,一切又恢復(fù)了平靜。

再看一個(gè)例子:

情景2,不省略commit>

在不省略commit>的時(shí)候,commit>既可以是某一個(gè)具體的commit hash值,也可以是某個(gè)分支名稱(chēng),tag名稱(chēng)。不論分支也好,tag也好,它們本質(zhì)上對(duì)應(yīng)的都是一個(gè)commit hash值。

在檢出a分支下的a文件的時(shí)候,最好把兩個(gè)連字符加上,不然git也會(huì)無(wú)法區(qū)分。整個(gè)過(guò)程中,HEAD頭指針沒(méi)有發(fā)生改動(dòng)。

總結(jié):第1種用法(包含paths>的用法)不會(huì)改變HEAD頭指針,主要使用于指定版本的文件覆蓋工作區(qū)中對(duì)應(yīng)的文件。如果省略commit>,則會(huì)用暫存區(qū)的文件覆蓋工作區(qū)中的文件,否則用指定提交中的文件覆蓋暫存區(qū)和工作區(qū)中的對(duì)應(yīng)文件。

接下來(lái),我們看看用法2,在第一部分中,我們知道切換分支,會(huì)改變HEAD的指向,那么如果我們是檢出某個(gè)commit會(huì)怎樣呢?同檢出分支一樣,會(huì)用該commit下的內(nèi)容覆蓋當(dāng)前分支工作區(qū)和暫存區(qū)的內(nèi)容,請(qǐng)看例子。

目前我們處于master分支上,且已經(jīng)有了兩次提交,分別是c1和c2,然后我們修改a,給a文件添加內(nèi)容"c3",并add到暫存區(qū),隨即使用checkout到c1的commit 上。注意,剛開(kāi)始checkout的時(shí)候,git不會(huì)允許你直接切換,因?yàn)槟阈薷牧藭捍鎱^(qū)的內(nèi)容, 它會(huì)提醒你提交后再切換,這時(shí)候,你可以使用-f 強(qiáng)行切換。再查看狀態(tài)的時(shí)候,git提示我們已經(jīng)不在任何分支上,HEAD指針也是指向具體的c1的commit值,進(jìn)入了“分離頭指針”狀態(tài)。這個(gè)狀態(tài)下,要回到master上面,只需要git checkout master即可,也可以在這個(gè)狀態(tài)上新建分支。

如果,checkou后面不跟任何參數(shù),則就是對(duì)工作區(qū)進(jìn)行檢查,請(qǐng)看例子。

我們身處master分支上,并且沒(méi)有任何改動(dòng),這時(shí)候git checkout沒(méi)有任何輸出。然后,我們給a文件添加內(nèi)容“c3”,然后再git checkout一下,git就會(huì)提示a文件有修改,是不是很簡(jiǎn)單?

總結(jié):對(duì)于第2種用法,不是檢出某個(gè)具體文件的的時(shí)候,即不指定paths>的時(shí)候,單純的檢出某個(gè)commit或分支,是會(huì)改變HEAD頭指針的。而且只有當(dāng)HEAD切換到某個(gè)分支的時(shí)候才可以對(duì)提交進(jìn)行跟蹤,否則就會(huì)進(jìn)入“分離頭指針”的狀態(tài)。如果省略用法2后面的branch>,則默認(rèn)對(duì)工作區(qū)進(jìn)行狀態(tài)檢查。

(四)熟悉的checkout,陌生的用法,媽媽再也不用擔(dān)心我的checkout啦!

1. git branch branch> start point>

以某個(gè)commit創(chuàng)建新分支。 在通常情況下,我們都會(huì)在當(dāng)前分支的基礎(chǔ)上,創(chuàng)建新分支。比如git branch new_branch

也許你不知道,我們還可以基于當(dāng)前分支的某一次commit來(lái)創(chuàng)建分支。請(qǐng)看!

從上圖可見(jiàn),我們想基于master分支的c1 提交ID創(chuàng)建新分支new_branch,創(chuàng)建成功后,切換到new_branch,查看log,只有c1,耶~~成功啦!

當(dāng)然,也可以使用git checkout -b new_branch> start point>這個(gè)常用的命令。

2.  git checkout --datch branch>

切換到分支的游離狀態(tài),默認(rèn)以該分支下的最后一次提交ID,請(qǐng)看下面的例子。

當(dāng)前分支為a,然后使用git checkout --detach master,那么HEAD就會(huì)切換到master的最后一次commit值的狀態(tài)下!

3. git checkout -B branch>

這個(gè)命令,可以強(qiáng)制創(chuàng)建新的分支,為什么加-B呢?如果當(dāng)前倉(cāng)庫(kù)中,已經(jīng)存在一個(gè)跟你新建分支同名的分支,那么使用普通的git checkout -b branch>這個(gè)命令,是會(huì)報(bào)錯(cuò)的,且同名分支無(wú)法創(chuàng)建。如果使用-B參數(shù),那么就可以強(qiáng)制創(chuàng)建新的分支,并會(huì)覆蓋掉原來(lái)的分支。請(qǐng)看具體操作。

當(dāng)前分支為master,且倉(cāng)庫(kù)中已經(jīng)存在分支a,我們先用git checkout -b a來(lái)創(chuàng)建a分支,必然會(huì)失敗的,并提示我們倉(cāng)庫(kù)中已經(jīng)有了一個(gè)a分支咯,仿佛在說(shuō)“hi,哥們,你已經(jīng)有了一個(gè)老婆了,一夫一妻制你的不懂?你以為這里是印度???”。隨后,我們使用git checkout -B a,耶~~,it works!

4. git checkout --orphan branch>

是的,假如你的某個(gè)分支上,積累了無(wú)數(shù)次的提交,你也懶得去打理,打印出的log也讓你無(wú)力吐槽,那么這個(gè)命令將是你的神器,它會(huì)基于當(dāng)前所在分支新建一個(gè)赤裸裸的分支,沒(méi)有任何的提交歷史,但是當(dāng)前分支的內(nèi)容一一俱全。新建的分支,嚴(yán)格意義上說(shuō),還不是一個(gè)分支,因?yàn)镠EAD指向的引用中沒(méi)有commit值,只有在進(jìn)行一次提交后,它才算得上真正的分支。還等什么呢?趕緊試試!

好了,現(xiàn)在我們終于找到組織了!

5. git checkout --merge branch>

這個(gè)命令適用于在切換分支的時(shí)候,將當(dāng)前分支修改的內(nèi)容一起打包帶走,同步到切換的分支下。

有兩個(gè)需要注意的問(wèn)題。

第一,如果當(dāng)前分支和切換分支間的內(nèi)容不同的話,容易造成沖突。

第二,切換到新分支后,當(dāng)前分支修改過(guò)的內(nèi)容就丟失了。

所以這個(gè)命令,慎用!

6. git checkout -p branch>

這個(gè)命令可以用來(lái)打補(bǔ)丁。這個(gè)命令主要用來(lái)比較兩個(gè)分支間的差異內(nèi)容,并提供交互式的界面來(lái)選擇進(jìn)一步的操作。這個(gè)命令不僅可以比較兩個(gè)分支間的差異,還可以比較單個(gè)文件的差異哦!

結(jié)束語(yǔ):至此,關(guān)于git checkout命令暫告一段落,對(duì)于checkout命令,你也有所熟悉了吧。當(dāng)然,git checkout還有一些其它用法,本文并沒(méi)有講到,你可以在git bash或終端中使用git checkout --help去進(jìn)一步了解!

刪除本地分支

git branch -d 分支名

刪除遠(yuǎn)程分支

git push origin -delete 分支名

到此這篇關(guān)于git checkout 命令使用詳解的文章就介紹到這了,更多相關(guān)git checkout內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • android studio git 刪除已在遠(yuǎn)程倉(cāng)庫(kù)的文件或文件夾方式
  • nodejs對(duì)項(xiàng)目下所有空文件夾創(chuàng)建gitkeep的方法
  • 從Git上checkout指定的文件夾至本地的代碼

標(biāo)簽:綿陽(yáng) 株洲 平頂山 鶴崗 臺(tái)州 哈密 鎮(zhèn)江 商丘

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《git checkout 命令使用詳解》,本文關(guān)鍵詞  git,checkout,命令,使用,詳解,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《git checkout 命令使用詳解》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于git checkout 命令使用詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    陵水| 梁平县| 南京市| 廉江市| 吉隆县| 鄂伦春自治旗| 威宁| 息烽县| 南乐县| 陇西县| 镶黄旗| 石柱| 大关县| 盱眙县| 福建省| 双辽市| 长顺县| 神池县| 醴陵市| 巩留县| 和林格尔县| 百色市| 林甸县| 金秀| 安陆市| 色达县| 伊川县| 出国| 林甸县| 桂林市| 庆城县| 古田县| 海阳市| 池州市| 讷河市| 突泉县| 社旗县| 靖边县| 神木县| 海门市| 且末县|