日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

git checkout 命令详解

發(fā)布時間:2024/4/18 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 git checkout 命令详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉自:http://www.cnblogs.com/hutaoer/archive/2013/05/07/git_checkout.html?utm_source=tuicool&utm_medium=referral

?

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

在下面的命令中,使用了一些簡寫,在這里說明一下:

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

當然,你也可以直接在git中敲命令,將這些簡寫添加到git配置中

git config --global -e

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

[alias]st = statusco = checkoutbr = branchmg = mergeci = commit md = commit --amenddt = difftoolmt = mergetoollast = log -1 HEADcf = configline = log --onelinelatest = 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=shorthist = log --pretty=format:\"%C(yellow)%h %C(red)%d %C(reset)%s %C(green)[%an] %C(blue)%ad\" --topo-order --graph --date=shorttype = cat-file -tdump = cat-file -p

這樣,你也就可以使用這些簡寫的命令咯。下面步入正題啊。

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

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

首先我們新建一個倉庫gitTest,然后新建文件a,為什么要用a命名呢,這里是故意為之,后面為大家揭曉分支。呵呵?;蛟S下面的介紹會有些枯燥乏味,因為您已經(jīng)對這些命令爛熟于胸,而且運用得相當熟練,那么您可以直接跳過這一步。

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

這個操作主要會用到兩個命令:

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

切換到新分支:git checkout branchName

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

git checkout -b branchName

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

其實,我們在切換分支,和新建分支的時候,有沒有想過,這些操作操作背后的工作原理是怎樣的呢?最大的功臣就是.git目錄下的HEAD引用,她宛如一個芭蕾舞者,從一個分支飄逸的跳到另一個分支,雖無聲無息,卻精準無比。

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

我們看到c1的提交hash值和HEAD對應分支master的當前hash值是一樣的。也就是說,HEAD指向的是當前分支名master,而master又對應了當前的最新的一次提交ID.

好,那么我們再做一次提交,看看master對應的hash值有無變化。

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

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

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

從上圖分析,在master分支上的時候,HEAD指向的是master,對應的是c2的commit ID。而切換到a分支的時候,HEAD也相應的指向了a,同時a對應的是a分支上的最新commit ID。因此,我們可以得出結論,在切換分支的時候,HEAD也會相應的指向對應的分支引用。

但是,使用checkout命令的時候,并不是每次都會改變HEAD指針的指向哦。在什么情況下HEAD一直堅定不移的擁護者他的女神呢?可謂衣帶漸寬終不悔,長使英雄淚滿襟啊!讓我們接著往下看。

(三)進階——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>前用兩個連續(xù)的連字符作為分隔。用法1的<commit>是可選項,如果省略,則相當于從暫存區(qū)進行檢出。

來看個例子:

情景1,省略掉<commit>

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

?這時候,提示檢出失敗,git以為我們想檢出倉庫a。還記得為什么在第一步中,我們曾新建的文件a嗎?這里終于派上用場了,由于倉庫中還存在分支a,同時當前分支中又存在文件a,于是git傻傻分不清楚了。這時候怎么辦?有兩個辦法,第一,我們在命名分支的時候要注意語義性,分支名要具有一定的意義,不能使用簡單的a,b,c來命名,這樣很容易導致分支名和文件名重復;第二,參照用法1,使用兩個連字符來分隔。在目前的情形中,我們使用第二種方法吧。

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

再看一個例子:

情景2,不省略<commit>

在不省略<commit>的時候,<commit>既可以是某一個具體的commit hash值,也可以是某個分支名稱,tag名稱。不論分支也好,tag也好,它們本質(zhì)上對應的都是一個commit hash值。

在檢出a分支下的a文件的時候,最好把兩個連字符加上,不然git也會無法區(qū)分。整個過程中,HEAD頭指針沒有發(fā)生改動。

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

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

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

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

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

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

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

1.?git branch <branch> <start point>

?

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

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

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

當然,也可以使用git checkout -b <new_branch> <start point>這個常用的命令。

?

2. ?git checkout --datch <branch>

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

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

?

3.?git checkout -B <branch>

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

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

4.?git checkout --orphan <branch>

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

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

5.?git checkout --merge <branch>

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

有兩個需要注意的問題。

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

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

所以這個命令,慎用!

6.?git checkout -p <branch>

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

結束語:至此,關于git checkout命令暫告一段落,對于checkout命令,你也有所熟悉了吧。當然,git checkout還有一些其它用法,本文并沒有講到,你可以在git bash或終端中使用git checkout --help去進一步了解

總結

以上是生活随笔為你收集整理的git checkout 命令详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产九九久久 | 欧美深夜在线 | 欧美少妇性生活 | 末发成年娇小性xxxxx | 欧美性色黄| 欧美交换 | 国产中文一区 | 国产精品久久久久9999爆乳 | 欧美色图激情小说 | 性色一区二区 | 粉嫩aⅴ一区二区三区四区五区 | 欧美激情视频一区二区三区不卡 | 精品一区二区三区四区五区六区 | 精品九九视频 | 久久瑟瑟 | 高清日韩一区二区 | 星空大象在线观看免费播放 | 久热超碰 | 免费的污网站 | 日本顶级大片 | 日本欧美国产在线 | 久草资源网 | 99精品视频在线观看免费 | 中文字幕免费在线看线人 | 精品一区二区视频 | 国产高h视频 | 国产免费自拍 | 一女三黑人理论片在线 | 极品粉嫩国产18尤物 | jiz亚洲| 97在线精品视频 | 国产高清在线不卡 | 日韩成人在线免费观看 | 成人亚洲精品777777ww | 久久精品无码中文字幕 | 日韩色道 | 日韩专区一区 | 无码国产精品高潮久久99 | 性做久久久久久 | 日日骚视频 | 午夜婷婷网 | h片免费网站 | 日本乱轮视频 | 少妇高潮av久久久久久 | r级无码视频在线观看 | 3d动漫精品啪啪一区二区下载 | 精品成人国产 | 国产第一av | 欧美精品久久久久久久自慰 | 日本一级黄 | 日本一区二区三区免费视频 | 午夜免费剧场 | 国产一区二区内射 | 操操操爽爽爽 | 中文字幕无码乱码人妻日韩精品 | 成人免费无遮挡无码黄漫视频 | 色综合免费视频 | 超污巨黄的小短文 | 色8久久 | 精品爆乳一区二区三区 | а√天堂中文在线资源8 | 亚洲a∨无码无在线观看 | 国产5区 | 亚洲美女屁股眼交 | 人妻少妇精品视频一区二区三区 | 成人少妇影院yyyy | 欧美亚洲天堂网 | 国产真人无码作爱视频免费 | 亚洲激情久久久 | 精品国产一区二区三区日日嗨 | 亚洲精品国产片 | av一级网站| 日本精品视频一区二区 | 爱情岛论坛永久入址测速 | 日韩中文字幕网 | 97超碰色 | 97天天干 | 国产一区二区欧美日韩 | 欧美freesex黑人又粗又大 | 嫩草视频免费观看 | 色婷婷久| 日韩一卡二卡三卡四卡 | 少妇又紧又深又湿又爽视频 | 天天摸天天干天天操 | 少妇搡bbbb搡bbb搡打电话 | 在线视频二区 | 91涩涩涩 | 午夜黄色福利视频 | 五月开心播播网 | 欧美成人午夜视频 | 日韩av在线中文字幕 | 一级不卡毛片 | 夜夜爽天天爽 | 国产av人人夜夜澡人人爽麻豆 | 在线一级 | 8050午夜一级毛片久久亚洲欧 | 末路1997全集免费观看完整版 | 18av视频| 国产精品无码av在线有声小说 |