查看版本:git --version
創(chuàng)建版本庫:git init
查看git 腳本目錄:git --exec-path
把遠(yuǎn)程分支拉到本地:git fetch origin dev(dev為遠(yuǎn)程倉庫的分支名)
全局配置:
? ? ? ? ? ? ? ? ? git config --global user.name "xxx"??
? ? ? ? ? ? ? ? ? git config --unset --global user.name "xxx"? ?刪除設(shè)置
? ????????????????git config --global user.email "xxx@qq.com"
? ? ? ? ? ? ? ? ? git config --global alias.st status? 只在本用戶中使用
? ? ? ? ? ? ? ? ? git config --system alias.st status???被所有用戶使用
window下配置文件位置:C:\Users\Administrator\.gitconfig??
linux下配置文件位置:/etc/gitconfig
查看版本庫提交日志:
git log --pretty=fuller(全展示)|oneline(只顯示提交信息)|raw(顯示提交對象的parent屬性)? --stat 查看每次提交的文件變更統(tǒng)計
本地備份:
git clone demo demo1
合并解決沖突:
1、git?checkout?dev????????????????//切換到被合并的分支
2漾抬、git?pull?????????????????//拉取要合并分支的最新代碼
3缠沈、git?checkout?dev_activity???????//切換到要合并的分支
4边琉、git?pull?????????????????//拉取最新代碼
5、git?checkout?-b?dev_activity_temp?//創(chuàng)建臨時分支用于合并,防止合并后沖突一時間解決不了而污染分支代碼
6、git?merge?dev???????????????????????????????//合并dev代碼到?dev_activity_temp
7、用tortoiseGit?或者其他可視化工具解決沖突
8贮泞、git?commit?-m?"合并?dev?解決沖突"??//提交解決沖突到臨時分支
9、git?checkout?dev_activity??//切換到?dev_activity??分支
10幔烛、git?merge?dev_activity_temp?//合并已經(jīng)合并dev的臨時分支
11啃擦、git?push?????????????????//將合并代碼推送到遠(yuǎn)端
12、git?branch?-D?dev_activity_temp??//刪除臨時分支
查看g工作區(qū)狀態(tài):
git status -s(顯示精簡信息)
ADD之前饿悬,說明工作區(qū)當(dāng)前文件與暫存區(qū)的有改動
ADD之后令蛉,說明暫存區(qū)當(dāng)前文件與版本庫的有改動
ADD后追加內(nèi)容,工作區(qū)暫存區(qū)版本庫三者都有改動
重要概念:
ADD推至?xí)捍鎱^(qū)(stage)
HEAD(當(dāng)前工作分支)
當(dāng)執(zhí)行g(shù)it reset HEAD時乡恕,緩存區(qū)的目錄樹會被重寫言询,但工作區(qū)不受影響,可用于取消add
當(dāng)執(zhí)行g(shù)it rm --cached <file>時會直接刪除暫存區(qū)文件傲宜,工作區(qū)不受影響
當(dāng)執(zhí)行g(shù)it checkout 或git checkout -- <file>時运杭,暫存區(qū)的文件會替換工作區(qū)的文件,這個操作很危險函卒,因為會清除工作區(qū)的所有改動
當(dāng)執(zhí)行g(shù)it checkout HEAD或git checkout HEAD <file>時辆憔,會用HEAD指向的master分支的全部或部分替換工作區(qū)和暫存區(qū)的文件,這個操作也很危險报嵌!
查看改動:
git diff :比較工作區(qū)與暫存區(qū)的差異
git diff HEAD:比較工作區(qū)與HEAD(當(dāng)前工作分支)的差異
git diff --staged|--cached:比較暫存區(qū)與版本庫文件的差異
查砍版本庫中當(dāng)前提交:git ls-tree -l HEAD? ?其中-l顯示文件的大小
文件屬性(rw-r--r--),文件類型虱咧,對象ID,文件大小锚国,文件名
查看暫存區(qū)目錄內(nèi)容:git ls-files -s
文件屬性(rw-r--r--),對象ID腕巡,暫存區(qū)編號,文件名
如果想針對暫存區(qū)使用git ls-tree命令血筑,可以使用:git write-tree|xargs git ls-tree -l -r -t
查看Git對象ID命令:git cat-file? ?-t(類型)-p(內(nèi)容)
顯示引用的對應(yīng)提交ID:git rev-parse (結(jié)合git cat-file可以進(jìn)行版本追蹤)
git log --oneline精簡版追蹤日志绘沉,1.6.3版本及以后才有
git log --graph --stat 查看分支與合并信息
重置:
master分支在版本庫的引用目錄(.git/refs)中體現(xiàn)為一個引用文件.git/refs/heads/master,其內(nèi)容就是分支中最新提交的提交ID豺总。引用refs/heads/master就像一個游標(biāo)车伞,當(dāng)有新提交發(fā)生時指向新的提交。git reset可以使游標(biāo)指向任意一個存在的ID喻喳。
git reset --hard HEAD^? ?(HEAD^代表HEAD的父提交另玖,既游標(biāo)移動到上一個提交),使用重置命令可以回退到任意版本,但重置讓歷史改變了谦去,意味著無法找到丟失的提交慷丽!慎用!
用reflog挽救錯誤的重置:.git/logs目錄記錄下的日志文件記錄了分支的變更鳄哭,帶有工作區(qū)的版本庫有有以下配置git config core.logAllRefUpdates? --》 true盈魁。可以查看.git\logs\refs\heads\master文件窃诉,該文件記錄了master分支指向的變遷。命令模式:git reflog show master赤套。
重置master為5次改變前的值:git reset --hard master@{5}飘痛,提交歷史也會回來。
reset用法:
? ? 用法一:git reset [-q] [<commit>] [--] [paths] ...? -q為安靜模式容握,沒有提示信息
? ? 用法二:git reset [--soft | --mixed | --hard |--merge| --keep ] [-q] [<commit>]
其中<commit>都是可選項宣脉,可以使用引用或提交ID,如果省略了<commit>就相當(dāng)于使用了HEAD的指向作為提交的ID剔氏。
用法一不會重置引用塑猖,也不會改變工作區(qū),而是指定提交狀態(tài)<commit>下的<paths>替換掉緩存區(qū)中的文件谈跛,例如命令git reset HEAD <paths> 相當(dāng)于取消之前add到暫存區(qū)時改變的暫存區(qū)羊苟。
用法二會重置引用。根據(jù)不同的選項感憾,可以對暫存區(qū)和工作區(qū)進(jìn)行重置:
使用--hard 如git reset --hard <commit>會執(zhí)行三個動作:
1蜡励,替換引用的指向,引用指向新的提交ID
2阻桅,替換暫存區(qū)凉倚。替換后,暫存區(qū)的內(nèi)容與引用指向的目錄樹一致嫂沉。
3稽寒,替換工作區(qū)。替換后趟章,工作區(qū)的內(nèi)容和暫存區(qū)杏糙,HEAD指向的目錄樹內(nèi)容相同。
使用--soft會執(zhí)行1操作尤揣,既只改變了引用的指向搔啊,不改變暫存區(qū)和工作區(qū)
使用--mixed或不使用參數(shù)(默認(rèn)為--mixed)會執(zhí)行1,2操作,既改變引用指向和暫存區(qū)北戏,不改變工作區(qū)负芋。
命令:git reset,僅用HEAD指向的目錄樹重置暫存區(qū),工作區(qū)不會受影響,相當(dāng)于取消add
命令:git reset -- filename旧蛾。僅將指定文件的改動撤出暫存區(qū)
命令:git reset --soft HEAD^莽龟。工作區(qū)和暫存區(qū)不變,但是引用向前回退一次锨天。相當(dāng)于取消上一次的commit毯盈。
命令:git reset? HEAD^。工作區(qū)不改變病袄,暫存區(qū)和引用會回退一次搂赋。
命令:git reset --mixed HEAD^。同上益缠。
命令:git reset --hard HEAD^脑奠。徹底撤銷最近的一次提交。而且工作區(qū)和暫存區(qū)都會回退到上一次提交狀態(tài)幅慌。自上一次提交全部消失宋欺。
檢出:
HEAD的重置既檢出。HEAD可以理解為頭指針胰伍,是當(dāng)前工作區(qū)的基礎(chǔ)版本齿诞,這時執(zhí)行g(shù)it branch -v會看到當(dāng)前處于master分支。當(dāng)執(zhí)行提交時骂租,HEAD指向的提交將作為新提交的父提交祷杈。
git提示的大致意思
什么是分離頭指針:分離頭指針指的是HEAD頭指針指向了一個具體的提交ID,而不是一個引用(分支)渗饮。這個時候指向master變成了指向一個提交的ID吠式。
查看一下HEAD和master對應(yīng)的提交ID,會發(fā)現(xiàn)他們的指向不一樣:
master指向并沒有改變抽米,而HEAD指向變了
如果現(xiàn)在添加新文件特占,會有以下提示:
這是因為HEAD處于分離頭指針模式
執(zhí)行提交,在提交輸出中會出現(xiàn)detached HEAD標(biāo)識云茸。
detached HEAD提示
新提建立在之前的提交之上
? ? 切換到master分支上是目,git checkout master。HEAD重新指向了分支标捺,沒有了斷頭模式(分離頭指針模式)
工作區(qū)的文件消失懊纳,提交日志也消失
使用git show 查看之前的提交ID可以看到這個提交仍然存在于版本庫,但這個提交不會永久存在亡容,當(dāng)reflog中含有該提交的日志過期后嗤疯,該提交會被徹底清除。
分離頭指針模式下的提交只能使用提交ID訪問闺兢,如果master需要提交的內(nèi)容茂缚,可以用git merge進(jìn)行合并操作。
流程:1 確認(rèn)當(dāng)前分支(git branch -v)2.執(zhí)行合并操作,將目標(biāo)提交ID合并到當(dāng)前分支脚囊。3.可查看日志龟糕,會看到合并的分支圖(git log --graph --pretty=oneline)4.查看最新提交的內(nèi)容(git cat-file -p HEAD)可以看到這個提交有兩個父提交。
合并流程
檢出操作是最常用的命令之一悔耘,同時也是個危險的命令讲岁,因為這條命令會重寫工作區(qū)。
用法如下:
用法一:git checkout [-q] [<commit>] -- <paths>
用法二:git checkout [<breach>]
用法三:git checkout [-m] [-b|--orphan? <new_branch>]? [<start_point>]
用法一的<commit>是可選項衬以,如果省略則從暫存區(qū)檢出缓艳。與重置命令大不相同:重置的默認(rèn)值是HEAD,而檢出的默認(rèn)值是暫存區(qū)看峻。因此郎任,重置一般用于重置暫存區(qū)(除非使用--hard否則不重置工作區(qū)),而檢出命令主要是覆蓋工作區(qū)(如果<commit>不省略备籽,也會替換暫存區(qū)的相應(yīng)文件)
用法一(包含<paths>的用法)不會改變HEAD頭指針,主要是用于指定版本的文件覆蓋工作區(qū)的對應(yīng)文件分井。如果省略<commit>則會用暫存區(qū)的文件覆蓋工作區(qū)的文件车猬,否則用指定提交中的文件覆蓋暫存區(qū)和工作區(qū)的文件。
用法二(不使用<paths>的用法)會改變HEAD頭指針尺锚,之所以后面參數(shù)寫作<branch>是因為只有HEAD切換到一個分支才可以對提交進(jìn)行跟蹤珠闰。否則仍然會進(jìn)入分離頭指針狀態(tài)。在分離頭指針狀態(tài)下的提交不能被引用關(guān)聯(lián)到瘫辩,從而可能丟失伏嗜。所以用法二的最主要作用就是切換到分支。如果省略<branch>則相當(dāng)于對工作區(qū)進(jìn)行狀態(tài)檢查伐厌。
用法三主要是用于創(chuàng)建和切換到新的分支(<new_branch>)承绸,新的分支從(<start_point>)指定的提交開始創(chuàng)建,新分支和我們熟悉的master分支沒有什么實質(zhì)的不同挣轨,都是在refs/heads命名空間下的引用军熏。
命令:git checkout branch。檢出branch分支卷扮,更新HEAD以指向branch分支荡澎,以及用branch指向的書更新暫存區(qū)和工作區(qū)。
命令:git checkout晤锹。匯總顯示工作區(qū)摩幔、暫存區(qū)與HEAD的差異。
命令:git checkout HEAD鞭铆。同上或衡。
命令:git checkout -- filename。用暫存區(qū)的filename文件來覆蓋工作區(qū)中的filename文件。相當(dāng)于取消自上次執(zhí)行g(shù)it add filename以來的本地修改薇宠。這個命令很危險偷办,因為對本地的修改會悄無聲息的覆蓋,毫不留情澄港。
命令:git checkout branch -- filename椒涯。維持HEAD的指向不變,用branch所指向的提交中的filename替換暫存區(qū)和工作區(qū)中的相應(yīng)文件回梧,注意是直接覆蓋废岂!
命令:git checkout --?.或?qū)懽鱣it checkout?.?。注意最后參數(shù)為一個點狱意,這條命令最危險湖苞!會取消所有本地的修改(相對于暫存區(qū))。用暫存區(qū)的所有文件直接覆蓋本地文件详囤,不給用戶任何確認(rèn)機會财骨!
暫存區(qū)進(jìn)度保存與恢復(fù)
保存進(jìn)度命令:git stash
查看保存的進(jìn)度:git stash list 可以多次保存工作進(jìn)度,并在恢復(fù)時進(jìn)行選擇藏姐。
恢復(fù)進(jìn)度:git stash pop?
刪除多余目錄命令:git clean -nd(顯示會刪除哪些目錄)git clean -fd(真正強制刪除)
命令:git stash pop [--index] [<stash>] 如果不使用任何參數(shù)隆箩,會恢復(fù)最新保存的工作進(jìn)度,并將恢復(fù)的進(jìn)度從存儲的工作進(jìn)度列表中清除羔杨。選項--index除了恢復(fù)工作區(qū)的文件之外捌臊,還嘗試恢復(fù)暫存區(qū)。<stash> git stash list中的進(jìn)度列表 如 0 1 2
命令:git stash apply [--index] [<stash>]除了不刪除恢復(fù)的進(jìn)度之外兜材,其余和git pop一樣
命令:git stash drop [<stash>]刪除一個存儲的進(jìn)度理澎,默認(rèn)刪除最新的進(jìn)度
命令:git stash clear 。刪除所有存儲的進(jìn)度
命令:git stash branch [branchname] <stash>
查看保存進(jìn)度的引用信息:git reflog show refs/stash
刪除與移動曙寡、恢復(fù)
刪除命令:git rm 執(zhí)行后會直接保存到暫存區(qū)糠爬,本地刪除則不會自動保存到暫存區(qū)
恢復(fù)上一次刪除的文件:git cat-file -p HEAD~1:filename > filename?
可使用show命令?git show HEAD~1:filename > filename代替,效果相同
最簡單可使用:git checkout HEAD~1 -- filename
HEAD~1相當(dāng)于HEAD^举庶。執(zhí)行g(shù)it add -A會將工作區(qū)所有改動以及新增文件添加到暫存區(qū)秩铆。
移動命令:git mv file1 file2
版本表示法
顯示分支: git rev-parse --symbolic --branches
顯示里程碑: git rev-parse --symbolic --tags
顯示定義的所有引用:git rev-parse --symbolic --glob=refs/*
將對應(yīng)的git對象表達(dá)式表示為對應(yīng)的SHA1值。
顯示里程碑:git describe --tags
版本范圍表示法
顯示該版本的所有歷史提交:git rev-list --online灯变,實際上一個提交ID就可以代表一個版本列表
取兩個版本的并集?git rev-list --online a b?
取反殴玛,既排除這個版本及其歷史版本??git rev-list --online a^
點點表示法 表示上面如git rev-list --online a..b 相當(dāng)于^a b
三點表示法含義是兩個版本共同能訪問到的排除出去。
某提交的歷史提交添祸,將自身除外?git rev-list --online a^@
提交本身不包括其歷史提交git rev-list --oneline a^!
查看分支指向的提交ID git rev-parse brachname1 brachname2
瀏覽日志:git log
可接表示版本范圍的參數(shù)
分支圖表示:
git config --global alias.glog "log --graph"?
git glog --oneline
顯示每次提交的具體改動:git log -p -1
顯示每次提交的變更概要:git log --stat --oneline?
只顯示改動了哪些文件
定制顯示:--pretty?
--pretty=raw 顯示commit的原始數(shù)據(jù)滚粟,可以顯示提交對應(yīng)的樹ID
--pretty=fuller -1會先作者和提交者
--pretty=oneline -1 會顯示精簡輸出
如果想查看和分析某一個提交,也可以使用git show 或git cat-file?
差異比較:git diff
比較里程碑B和里程碑A刃泌。git diff A B
比較工作區(qū)和里程碑A凡壤。git diff? A
比較暫存區(qū)和里程碑A署尤。git diff --cached A
比較工作區(qū)和暫存區(qū)。git diff?
比較暫存區(qū)和HEAD亚侠。git diff --cached
比較工作區(qū)和HEAD曹体。git diff HEAD
文件不同版本的比較。git diff <commit1> <commit2>? -- <paths>
非git目錄/文件的比較硝烂。git diff <path1> <path2>
文件回溯:git blame 會顯示文件箕别,在每一行顯示此行最早在什么版本引入的,由誰引入的
二分查找:git bisect? start?
標(biāo)記當(dāng)前版本:git bisect?bad |good?
當(dāng)找到壞提交后:標(biāo)記git bisect?bad
修復(fù)好后:git bisect reset
git修補提交信息:git commit --amend -m "修補提交"滞谢。
命令git rebase是對提交進(jìn)行變基操作串稀。可實現(xiàn)將指定范圍內(nèi)的提交“嫁接”到另一個提交上狮杨。
歸一化命令:git rebase --onto <newbase> <since> <till>
變基操作過程:1.首先會執(zhí)行g(shù)it checkout 切換到<till> 母截,如果<till>指向的不是一個分支(如master),則變基操作是在detacached HEAD(分離頭指針)狀態(tài)下進(jìn)行的橄教。當(dāng)變基結(jié)束后清寇,要對master分支執(zhí)行重置以實現(xiàn)變基結(jié)果在分支中提交。2,.將<since>..<till>所標(biāo)識的提交范圍寫到一個臨時的文件中护蝶,<since>..<til>是指包括<till>的所有提交排除<since>及<since>的歷史提交后形成的版本范圍华烟。3.將當(dāng)前分支強制重置(git reset --hard)到<newbase>。4.從保存在臨時文件中的提交列表按提交順序重新提交到重置之后的分支上滓走。5.如遇到提交已經(jīng)在分支中包含,則跳過該提交帽馋。? ? 6.如果在提交過程中遇到?jīng)_突搅方,則變基過程暫停,用戶解決沖突后绽族,執(zhí)行g(shù)it rebase --continue繼續(xù)變基操作姨涡,或執(zhí)行g(shù)it rebase --skip跳過此提交“陕或執(zhí)行g(shù)it rebase --abort終止變基操作并切換到變基前的分支上涛漂。
場景1:有A,B,C,D,E的歷史提交,現(xiàn)在要去掉C检诗。
方法1:1匈仗、git rebase --onto B D^ E 。這時會進(jìn)入分離頭指針狀態(tài),逢慌,需要將master分支指向變基后的提交上
? ? ? ? ? ? ?2悠轩、git checkout master 。切換回master分支
? ? ? ? ? ? ?3攻泼、git reset --hard HEAD@{1}火架。使用了reflog語法HEAD@{1}相當(dāng)于切換回master分支前的HEAD指向鉴象。
? ? ? ? ? ? ?4、完成變基操作何鸡。
? ? ? ? ? ? ?5纺弊、git reset --hard E重新布景
方法2:1、git checkout D骡男。將HEAD指向D淆游,這時會進(jìn)如detached狀態(tài)。
? ? ? ? ? ? ?2洞翩、git reset --soft HEAD^^稽犁。回退兩次提交操作骚亿,B已亥、C回到暫存區(qū)。
? ? ? ? ? ? ?3来屠、git commit -C C虑椎。重新提交B、C所改動的內(nèi)容俱笛,-C說明重用C的提交說明
? ? ? ? ? ? ?4捆姜、git tag newbase。用里程碑是記憶提交ID最好的方法迎膜。
? ? ? ? ? ? ?5泥技、git rebase --onto newbase E^ master。執(zhí)行變基操作磕仅,這個操作會直接修改master分支珊豹,無需對master進(jìn)行重置操作。
? ? ? ? ? ? ?6榕订、git tag -d newbase店茶。刪除不需要的里程碑。
? ? ? ? ? ? ?7劫恒、完成變基操作贩幻。
git克隆:
用法1:將<repository>指向的版本庫創(chuàng)建一個克隆到<directory>目錄两嘴,目錄<directory>相當(dāng)于克隆版本庫的工作區(qū)丛楚,文件都會檢出,版本庫位于工作區(qū)下的.git目錄中
用法2:克隆出的版本庫不包含工作區(qū)憔辫,只有版本庫的內(nèi)容鸯檬,這樣的版本庫稱為裸版本庫,一般約定以.git為后綴螺垢。
用法3:與用法2的區(qū)別在于版本庫對上游版本庫進(jìn)行了注冊喧务,這樣可以用git fetch命令與上游版本庫進(jìn)行持續(xù)同步赖歌。
git分支:
用法1:用于顯示本地分支列表,當(dāng)前分支會以*號顯示功茴。
用法2:基于當(dāng)前HEAD指針指向的提交創(chuàng)建新分支庐冯。
用法3:基于提交<start-point>創(chuàng)建新分支。
用法4:用與刪除分支坎穿,刪除時要檢查所刪除的分支是否已經(jīng)合并到其他分支中展父,否則拒絕刪除。
用法5:強制刪除分支玲昧。
用法6:重命名分支栖茉,如果已經(jīng)存在該分支名則拒絕執(zhí)行。
用法7:強制重命名分支孵延。
創(chuàng)建分支后立刻切換分支:git checkout -b <branchname> [<start_point>]吕漂。
分支合并到master: git merge branchname,實際上合并后master分支和開發(fā)分支指向同一個提交,這是因為合并前master分支的提交就是開發(fā)分支的父提交尘应,所以相當(dāng)與本次將分支master重置到開發(fā)分支惶凝。默認(rèn)情況下,Git執(zhí)行"快進(jìn)式合并"(fast-farward merge)犬钢,會直接將Master分支指向Develop分支苍鲜。
fast-farward merge
使用--no-ff參數(shù)后,會執(zhí)行正常合并玷犹,在Master分支上生成一個新節(jié)點
查看本地分支哪些提交領(lǐng)先遠(yuǎn)程版本庫:git cherry
創(chuàng)建發(fā)布分支:
場景:發(fā)布版本出現(xiàn)bug混滔,master分支存在修改,就必須以基于發(fā)布版本的代碼創(chuàng)建分支歹颓。因此在發(fā)布版本時需要給發(fā)布版本打上里程碑坯屿,當(dāng)線上出現(xiàn)bug時使用命令:git checkout -b? fix_v1.0? v1.0 ,修復(fù)后推送至遠(yuǎn)程共享庫git push origin,其他開發(fā)者使用命令git fetch拉取該分支晴股,拉取完后切換到該分支git checkout -b fix_v1.0 origin/fix_v1.0愿伴,該遠(yuǎn)程分支不能直接檢出肺魁,而是需要基于該遠(yuǎn)程分支創(chuàng)建本地分支然后基于該本地分支進(jìn)行開發(fā)电湘,當(dāng)開發(fā)完成后需要將代碼推送至本地倉庫,此時推送會遇到非快進(jìn)式推送的問題鹅经。此時需要一個拉回操作寂呛,將遠(yuǎn)程服務(wù)器的改動獲取到本地并和本地提交進(jìn)行合并,合并之后就可以推送至遠(yuǎn)程倉庫了瘾晃。
合并到主線:
當(dāng)開發(fā)者在fix_v1.0中將相應(yīng)的bug修改完后贷痪,就需要將代碼合并到主線。
流程:切換至master分支蹦误,從遠(yuǎn)程代碼庫同步master分支劫拢,查看分支fix_v1.0的日志肉津,確認(rèn)要揀選的提交ID,git log -3 --graph --oneline fix_v1.0舱沧。
揀選到主線git cherry-pick fix_v1.0^妹沙。
沖突解決:當(dāng)挑選分支上的一個提交到master分支時,可能出現(xiàn)多個提交在重疊位置更新代碼熟吏,通過以下命令可以看到底是哪些提交引起的沖突
git log master...fix_v1.0距糖。并使用圖形話界面解決沖突。解決沖突后執(zhí)行推送命令將本地master分支同步到遠(yuǎn)程版本庫牵寺。
刪除本地分支:git branch -d branchname
刪除遠(yuǎn)程分支:git push origin :branchname
遠(yuǎn)程版本庫
? ? 多版本交互:
? ? 流程:1悍引、克隆2個版本庫裸版本git clone --bare .git user.git。 2帽氓、?查看遠(yuǎn)程版本庫有哪些版本:git ls-remote --heads file:///d:/user.git
3趣斤、克隆user.git版本庫git clone file:///d:/user1.git。4杏节、進(jìn)入user本地版本庫cd d:/user唬渗。5、執(zhí)行g(shù)it branch會看到只有一個master分支奋渔。
6镊逝、執(zhí)行g(shù)it show-ref可以查看所有的本地引用。
? ? 查看遠(yuǎn)程倉庫分支:git branch -r?
? 注冊新遠(yuǎn)程版本庫:git remote add new-remote file:///d:/user2.git
? 顯示已經(jīng)注冊的遠(yuǎn)程版本庫:git remote -v
? 從新的遠(yuǎn)程版本庫中獲取分支:git fetch new-remote
? 重命名遠(yuǎn)程分支名:git remote rename newname oldname
? 當(dāng)注冊了多個遠(yuǎn)程版本庫并希望獲得所有版本庫的更新時嫉鲸,使用命令:git remote update?
? 刪除遠(yuǎn)程版本庫:git remote rm new-remote
git pull和git fetch 的區(qū)別:
.一撑蒜、遠(yuǎn)端跟蹤分支不同
1、Git fetch:Git fetch能夠直接更改遠(yuǎn)端跟蹤分支玄渗。
2座菠、git pull:git pull無法直接對遠(yuǎn)程跟蹤分支操作,我們必須先切回本地分支然后創(chuàng)建一個新的commit提交藤树。
二浴滴、拉取不同
1、Git fetch:Git fetch會將數(shù)據(jù)拉取到度本地倉庫 - 它并不會自動合專并或修改當(dāng)前的工作岁钓。
2升略、git pull:git pull是從遠(yuǎn)程獲取最新版本并merge到本地,會自動合并或修改當(dāng)前的工作屡限。
三品嚣、commitID不同
1、Git fetch:使用Git?fetch更新代碼钧大,屬本地的庫中master的commitID不變翰撑,還是等于1。
2啊央、git pull:使用git pull更新代碼眶诈,本地的庫中master的commitID發(fā)生改變涨醋,變成了2肯污。
Git協(xié)同模型
容易帶入不成熟代碼烙荷,造成數(shù)據(jù)丟失
1.創(chuàng)建本地分支git checkout -b my/dev 2.創(chuàng)建遠(yuǎn)程獨享分支git push origin my/dev 3.開發(fā)完成后將本地分支合并到主線上,推送到共享版本庫
Git子模組協(xié)同模型:
創(chuàng)建子模組:git submoddule add submodule.git? localpath
添加完成后在super版本庫根目錄上多了一個.gitmodules文件
查看子模組狀態(tài)git submodule status巩踏,前面的減號含義是該子模組尚未檢出
如果需要克隆子模組形式引用的外部庫球拦,需要先執(zhí)行g(shù)it submodule init靠闭,然后執(zhí)行g(shù)it submodule update完成子模組版本庫的克隆。
子模組的修改和更新:在父項目中修改子模組內(nèi)容后坎炼,需進(jìn)入到子模組愧膀,此時子模組會進(jìn)入分離頭指針狀態(tài),此時執(zhí)行提交后谣光,git checkout master切換到master分支檩淋,執(zhí)行g(shù)it merge操作,然后執(zhí)行g(shù)it push推送至遠(yuǎn)程子模組萄金。然后cd 到父項目蟀悦,將子模組添加并提交,執(zhí)行g(shù)it push完成子模組更新氧敢。
fast-farward merge