git常用指令

git的使用原則是可復(fù)用诉瓦,不重復(fù),需放進(jìn)git遠(yuǎn)程倉(cāng)庫(kù)的文件:源代碼待逞、第三方文件甥角。

不需放進(jìn)git遠(yuǎn)程倉(cāng)庫(kù)的文件:自動(dòng)生成的文件(如obj,exe等)识樱,因?yàn)樽詣?dòng)生成的文件在修改源代碼后會(huì)改變其內(nèi)容,如果push前目標(biāo)分支有更新震束,你需要先pull再rebase怜庸,那么因?yàn)樽詣?dòng)生成的文件會(huì)造成你需要手動(dòng)合并修改,這是徒勞的垢村,極易造成混亂割疾,為了避免這種狀況,自動(dòng)生成的文件不能被放進(jìn)遠(yuǎn)程倉(cāng)庫(kù)嘉栓。

git的工作方法(workflow)

1.并行分叉式——集中式工作流

2.并行分支式——功能分支工作流

3.串行排隊(duì)式——Gerrit

4.pull request——Githup(對(duì)遠(yuǎn)程倉(cāng)庫(kù)的合并修改都由倉(cāng)庫(kù)owner和管理員控制)

基本配置

git config --global user.name "thomson"

git config --global user.email "thomson@gmail.com"

@tips 基礎(chǔ)配置宏榕,自報(bào)家門(mén)user.nameuser.email , 用--global說(shuō)明電腦上所有的git倉(cāng)庫(kù)都將用它標(biāo)記

git config --global color.ui true //配置git顯示不同顏色拓诸,更醒目

git config --global alias.st status //命令縮寫(xiě),st代表status麻昼,可以用git st代替git status

git config --global alias.co checkout //命令縮寫(xiě)

git config --global alias.cm commit //命令縮寫(xiě)

git config --global alias.br branch //命令縮寫(xiě)

git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" //配置得五顏六色

@tips 如果想刪除這些快捷命令奠支,可以在.git/config里把 [alias] 下的對(duì)應(yīng)內(nèi)容刪掉

初始化倉(cāng)庫(kù)

mkdir <dirname> //在當(dāng)前路徑下創(chuàng)建一個(gè)新目錄

cd <dirname> //cd進(jìn)新建的目錄

pwd //顯示當(dāng)前的工作路徑

git init //把當(dāng)前目錄變成git可以管理的倉(cāng)庫(kù),相當(dāng)于在當(dāng)前目錄下新建一個(gè)空的git倉(cāng)庫(kù)抚芦,在當(dāng)前目錄下會(huì)新建一個(gè).git目錄倍谜,默認(rèn)隱藏(可以使用ls -ah查看),這是跟蹤管理版本庫(kù)的叉抡,不可手動(dòng)修改

添加尔崔、提交、查看文件修改記錄

git add <filename1> <filename2> <filename3> //正常添加后不會(huì)有提示(沒(méi)消息就是好消息褥民,哈哈)

git commit -m "describe commit info" //提交本地修改季春,字符串是提交說(shuō)明

git status //實(shí)時(shí)查看倉(cāng)庫(kù)當(dāng)前的狀態(tài)

git diff <filename> //查看文件的修改記錄

查看提交記錄和回退版本

git log //查看當(dāng)前分支的提交記錄

git log --pretty=oneline //每次提交記錄用一行顯示,在記錄很多時(shí)不會(huì)全部顯示消返,在:輸入數(shù)字N即可顯示當(dāng)前位置順序后的N條提交信息

git reset --hard HEAD^ //把當(dāng)前分支文件版本回退到前一版本鹤盒,HEAD代表前一版本,HEAD100代表第前100個(gè)版本侦副,這里HEAD指的是當(dāng)前分支

git reset --hard version_id //version_id代表提交版本號(hào)侦锯,可以回退到具體某個(gè)版本 @tips reset參數(shù)有--hard --soft --mixed,hard會(huì)刪除包括緩存的所有修改秦驯,soft會(huì)保存所有修改(用到再查)

git reflog //記錄你操作的每一次命令尺碰,在回退到舊版本后想重新回到新版本時(shí)可以用來(lái)找到新版本的version_id

git reverse //如果已經(jīng)push,想遠(yuǎn)程倉(cāng)庫(kù)回退回之前的版本译隘,用此命令

工作區(qū)(文件存放目錄)亲桥、暫存區(qū)(stage)、版本庫(kù)(repository)

工作區(qū)有一個(gè)隱藏目錄.git固耘,這個(gè)不算工作區(qū)题篷,而是git的版本庫(kù),版本庫(kù)里存了很多東西厅目,其中最重要的就是稱(chēng)為stage(或者叫index)的暫存區(qū)番枚,還有g(shù)it自動(dòng)創(chuàng)建的第一個(gè)分支master,以及指向master的一個(gè)指針叫HEAD损敷。

@tips 暫存區(qū)就像購(gòu)物車(chē)葫笼,沒(méi)到付款的時(shí)候你都不確定購(gòu)物車(chē)?yán)锏臇|西全部都是要的,每拿一件商品就付一次款拗馒,那才麻煩大了(非常形象的比喻路星,233333)

@tips git add是把修改后的文件添加到暫存區(qū),git commit是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支诱桂,如果最新修改沒(méi)有被add進(jìn)暫存區(qū)洋丐,提交時(shí)不會(huì)提交最新修改呈昔,而是被add進(jìn)暫存區(qū)的修改

add操作
commit操作

git diff -- <filename> //在工作區(qū)修改文件后沒(méi)有執(zhí)行g(shù)it add命令,直接執(zhí)行g(shù)it commit的話(huà)git不會(huì)把當(dāng)前工作區(qū)的最新修改提交到版本庫(kù)友绝,使用此命令可以查看當(dāng)前工作區(qū)的文件和版本庫(kù)中同一文件的異同

撤銷(xiāo)修改

git checkout -- <filename> //把文件在工作區(qū)的修改全部撤銷(xiāo)堤尾,這里分兩種情況:”一種是此文件自修改后還沒(méi)有被add,現(xiàn)在撤銷(xiāo)修改就回到和版本庫(kù)一模一樣的狀態(tài)九榔;一種是文件已經(jīng)被add哀峻,add后又做了修改,撤銷(xiāo)修改就回到添加到暫存區(qū)后的狀態(tài)哲泊∈s埃“此操作就是讓文件回到最近一次git commit或git add時(shí)的狀態(tài)。

git reser HEAD <filename> //當(dāng)修改過(guò)的文件被add進(jìn)暫存區(qū)切威,但是想回退時(shí)育特,可以用命令,與git checkout -- filename一起用就可以徹底消除修改

刪除文件

rm <filename> //在文件系統(tǒng)中刪除文件

git rm <filename> //在git版本庫(kù)中刪除文件

git checkout -- <filename> //如果在文件系統(tǒng)文件找不回來(lái)先朦,使用此命令從版本庫(kù)中提取文件最新版本到工作區(qū)缰冤,但是會(huì)丟失最近一次提交后修改的內(nèi)容

遠(yuǎn)程倉(cāng)庫(kù)、推送版本

@tips 因?yàn)楸镜豨it倉(cāng)庫(kù)和githup遠(yuǎn)程倉(cāng)庫(kù)之間的傳輸時(shí)通過(guò)ssh加密的喳魏,所以需要生成本地ssh key上傳到githup棉浸,githup允許添加多個(gè)key,在所用電腦生成ssh key上傳即可刺彩,這樣在所用電腦均可推送

ssh-keygen -t rsa -C "email@example.com" //一般不設(shè)置密碼迷郑,如果為了保密也可以設(shè)置密碼,生成完畢可以在主目錄里找到.ssh目錄创倔,里面有id_rsa和id_rsa.pub嗡害,前者是私鑰,后者是公鑰畦攘,私鑰需保密霸妹,公鑰可以公開(kāi)

git remote add origin git@github.com:thomson/testRepo.git //關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù)

git branch --set-upstream dev_v2.2 origin/dev_v2.2 //本地分支關(guān)聯(lián)遠(yuǎn)程分支

git push -u origin master //-u是第一次push時(shí)加上的,Git不但會(huì)把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支知押,還會(huì)把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來(lái)叹螟,在以后的推送或者拉取時(shí)就可以簡(jiǎn)化命令,在以后就可以使用git push origin master推送最新修改了朗徊。在githup新建倉(cāng)庫(kù)后第一次push用此命令會(huì)報(bào)錯(cuò)首妖,如下:

push報(bào)錯(cuò)

因?yàn)樵趃ithup倉(cāng)庫(kù)有文件在本地沒(méi)有,所以要先rebase爷恳,執(zhí)行g(shù)it pull --rebase origin master,把遠(yuǎn)程倉(cāng)庫(kù)文件拉去到本地象踊,然后再push 即可

git rebase //當(dāng)你push時(shí)目標(biāo)分支有更新温亲,你需要先pull下目標(biāo)分支的更新棚壁,然后切換到開(kāi)發(fā)分支,執(zhí)行rebase命令合并更新栈虚,合并更新可能會(huì)提示沖突袖外,這時(shí)需要手動(dòng)合并,如果沒(méi)有提示沖突則會(huì)快速合并魂务,合并完成之后便可push曼验。@tips rebase命令實(shí)際上執(zhí)行的過(guò)程是把你在本地做的修改放在最新更新的后面,就像你是在最新更新過(guò)的文件做修改一樣粘姜,這一過(guò)程就可能會(huì)產(chǎn)生沖突需要手動(dòng)解決鬓照。(另一種說(shuō)法就是,在rebase時(shí)孤紧,git先把你在本地做的修改全保存在一個(gè)地方豺裆,然后刪除你的修改記錄,把最新的更新拉過(guò)來(lái)當(dāng)本地倉(cāng)庫(kù)号显,然后再把剛保存的文件合并到工作區(qū)的文件上臭猜,你再commit,push時(shí)就可能會(huì)產(chǎn)生沖突)

git push -f //強(qiáng)制推送押蚤,用你本地的文件替代git倉(cāng)庫(kù)中的內(nèi)容蔑歌,慎用,操作之后倉(cāng)庫(kù)中的數(shù)據(jù)會(huì)不見(jiàn)

git push origin <local branch name>:<origin branch name> //push的完成命令

git pull //從遠(yuǎn)程拉去文件揽碘,相當(dāng)于先git fetch再git merge

  1. git fetch origin develop
  2. git checkout develop
  3. git merge origin/develop

git pull origin <origin branch name> //拉取遠(yuǎn)程分支代碼與本地當(dāng)前分支merge

git clone git@github.com:thomson/Test2.git //從遠(yuǎn)程倉(cāng)庫(kù)克隆一個(gè)到本地倉(cāng)庫(kù)次屠,克隆可以通過(guò)https協(xié)議,但是每次都要輸入口令钾菊,比較麻煩帅矗,git默認(rèn)是用ssh

@tips track的作用:把本地某個(gè)分支與遠(yuǎn)程某個(gè)倉(cāng)庫(kù)分支對(duì)應(yīng)起來(lái)

@tips 往githup上push項(xiàng)目時(shí)提示無(wú)權(quán)限,可能是因?yàn)閟sh沒(méi)設(shè)置好煞烫,http://segmentfault.com/q/1010000003061640

分支管理

@tips 分支就如科幻電影里的平行宇宙浑此,創(chuàng)建自己的本地分支然后修改文件commit,完畢之后再一次性push到遠(yuǎn)程倉(cāng)庫(kù)的分支滞详。

push歷史

而后對(duì)工作區(qū)的修改和提交就是針對(duì)dev分支了凛俱,比如新提交一次后,dev指針往前移動(dòng)一步料饥,而master指針不變蒲犬,當(dāng)我們?cè)赿ev分支完成了工作,就可以把dev合并到master上岸啡,

git branch //查看分支原叮,加上-a可以查看全部分支

git branch <name> //創(chuàng)建分支

git checkout <name> //切換分支

git checkout -b <name> //創(chuàng)建新分支dev并切換到dev分支,相當(dāng)于git branch dev和git checkout dev兩條命令的合成

git merge <name> //在當(dāng)前分支上合并dev分支,合并之后沒(méi)push不會(huì)修改遠(yuǎn)程倉(cāng)庫(kù)的數(shù)據(jù)奋隶,如果沒(méi)有修改沖突擂送,可以進(jìn)行快速合并,如果有則需手動(dòng)修改再提交

git branch -d <name> //刪除本地dev分支

git branch -r -d origin/<origin branch name> //刪除本地的遠(yuǎn)程分支

git branch push :<origin branch name> //刪除遠(yuǎn)程分支

@tips 實(shí)際團(tuán)隊(duì)開(kāi)發(fā)分支管理圖

團(tuán)隊(duì)開(kāi)發(fā)復(fù)雜分支

解決沖突

@tips 當(dāng)在一個(gè)分支B1上修改了文件A并且提交唯欣,切換到分支B2時(shí)又修改了文件A也提交嘹吨,那么此時(shí)切換到分支B1再合并分支B2時(shí)會(huì)出現(xiàn)沖突,無(wú)法快速合并境氢,需要手動(dòng)修改文件A的內(nèi)容蟀拷,然后再add和commit

git log --graph --pretty=oneline --abbrev-commit //可以以字符圖形顯示查看文件合并的過(guò)程

git merge --no-ff -m "describtion" dev //禁用快速合并并在合并后生成一個(gè)新的commit,-m和"cescribtion"是生成新commit用的萍聊,這個(gè)需要手動(dòng)修改文件

忽略特殊文件

@tips 把你不想被VCS管理的文件的文件名或某后綴名的文件或某文件夾下的文件路徑加入到.ignore文件中问芬,把.ignore文件提交到VCS,這樣git就可以忽略這些文件了脐区,略如.ignore文件如下:

Windows:

Thumbs.db

ehthumbs.db

Desktop.ini

Python:

*.py[cod]

*.so

*.egg

*.egg-info

dist

build

My configurations:

db.ini

deploy_key_rsa

//.gitignore不起作用

@tips 有時(shí)候push代碼時(shí)愈诚,對(duì)某些文件做了修改但是不想把這些文件提交上去,在.gitignore也定義了規(guī)則忽略牛隅,但是push還是把文件提交上去了炕柔,這是因?yàn)間it系統(tǒng)已經(jīng)追蹤到了文件的修改,此時(shí)要想忽略文件的修改就需要修改緩存媒佣,把相應(yīng)的文件取消追蹤匕累,如此.gitignore文件中的相應(yīng)規(guī)則就可以生效了。

git update-index --assume-unchanged <file.name>

本地分支關(guān)聯(lián)遠(yuǎn)程分支

git branch --set-upstream-to dev_v2.0 origin/dev_v2.0

合并分支完畢之后消除merge狀態(tài)只需提交本地修改即可默伍。

window下git提交和檢出時(shí)換行符[LF]被自動(dòng)轉(zhuǎn)換成[CRLF]造成的問(wèn)題

@tips 當(dāng)文件內(nèi)容變動(dòng)會(huì)造成使用問(wèn)題時(shí)(比如根據(jù)文件內(nèi)容生成MD5)欢嘿,就需要手動(dòng)設(shè)置,但這治標(biāo)不治本也糊。如果是多人同時(shí)參與項(xiàng)目開(kāi)發(fā)炼蹦,那么每個(gè)人都需要這樣配置,比較省事情的做法是提取文件內(nèi)容時(shí)狸剃,對(duì)文件內(nèi)的[CRLF]->[LF]進(jìn)行手動(dòng)轉(zhuǎn)換掐隐,常見(jiàn)的有

Pattern CRLF = Pattern.compile("(\r\n)");

Matcher m = CRLF.matcher(middleLicense); 

if(m.find()){ 

    middleLicense = m.replaceAll("\n"); 

}

AutoCRLF

git config --global core.autocrlf true //提交時(shí)轉(zhuǎn)換為L(zhǎng)F,檢出時(shí)轉(zhuǎn)換為CRLF

git config --global core.autocrlf input //提交時(shí)轉(zhuǎn)換為L(zhǎng)F钞馁,檢出時(shí)不轉(zhuǎn)換

git config --global core.autocrlf false //提交檢出均不轉(zhuǎn)換

SafeCRLF

git config --global core.safecrlf true //拒絕提交包含混合換行符的文件

git config --global core.safecrlf false //允許提交包含混合換行符的文件

git config --global core.safecrlf warn //提交包含混合換行符的文件時(shí)給出警告

附上git官網(wǎng) http://git-scm.com/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虑省,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子僧凰,更是在濱河造成了極大的恐慌探颈,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件训措,死亡現(xiàn)場(chǎng)離奇詭異伪节,居然都是意外死亡光羞,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)架馋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)狞山,“玉大人全闷,你說(shuō)我怎么就攤上這事叉寂。” “怎么了总珠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵屏鳍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我局服,道長(zhǎng)钓瞭,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任淫奔,我火速辦了婚禮山涡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唆迁。我一直安慰自己鸭丛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布唐责。 她就那樣靜靜地躺著鳞溉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鼠哥。 梳的紋絲不亂的頭發(fā)上熟菲,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音朴恳,去河邊找鬼抄罕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛于颖,可吹牛的內(nèi)容都是我干的呆贿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼恍飘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼榨崩!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起章母,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤母蛛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后乳怎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體彩郊,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡前弯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秫逝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恕出。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖违帆,靈堂內(nèi)的尸體忽然破棺而出浙巫,到底是詐尸還是另有隱情,我是刑警寧澤刷后,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布的畴,位于F島的核電站,受9級(jí)特大地震影響尝胆,放射性物質(zhì)發(fā)生泄漏丧裁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一含衔、第九天 我趴在偏房一處隱蔽的房頂上張望煎娇。 院中可真熱鬧,春花似錦贪染、人聲如沸缓呛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)强经。三九已至,卻和暖如春寺渗,著一層夾襖步出監(jiān)牢的瞬間匿情,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工信殊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炬称,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓涡拘,卻偏偏與公主長(zhǎng)得像玲躯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鳄乏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • Git常用語(yǔ)法 [TOC] Git簡(jiǎn)介 描述 ? Git(讀音為/g?t/跷车。)是一個(gè)開(kāi)源的分布式版本控制系統(tǒng),...
    君惜丶閱讀 3,529評(píng)論 0 13
  • 1橱野,查看所有遠(yuǎn)程分支:%git branch -r 2, 拉取遠(yuǎn)程分支并創(chuàng)建本地分支git checkout -...
    will666閱讀 2,069評(píng)論 0 18
  • Git 命令行學(xué)習(xí)筆記 Git 基礎(chǔ) 基本原理 客戶(hù)端并不是只提取最新版本的文件快照朽缴,而是把代碼倉(cāng)庫(kù)完整的鏡像下來(lái)...
    sunnyghx閱讀 3,921評(píng)論 0 11
  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,661評(píng)論 9 163
  • 1.JSONP 解決方法 服務(wù)端返回代碼 原理很簡(jiǎn)單,服務(wù)端需要拼接如上的字符串 2.CORS背后的思想水援,就是使用...
    lmem閱讀 502評(píng)論 0 1