Git 基礎(chǔ)知識(shí)

安裝Git(Debian或Ubuntu Linux)

Debian或Ubuntu Linux外遇,通過一條

sudo apt-getinstall git

就可以直接完成Git的安裝渠羞,安裝完成后译打,還需要最后一步設(shè)置,在命令行輸入:

$git config --global user.name"YourName"$git config --global user.email"email@example.com"

創(chuàng)建版本庫

版本庫又名倉庫留美,英文名repository彰檬。

$mkdir learngit

$cd learngit

$pwd

/Users/michael/learngit

第二步,通過git init命令把這個(gè)目錄變成Git可以管理的倉庫

$gitinit

把一個(gè)文件放到Git倉庫只需要兩步谎砾。

第一步逢倍,用命令git add告訴Git,把文件添加到倉庫:

$git add readme.txt

第二步景图,用命令git commit告訴Git较雕,把文件提交到倉庫:

$ gitcommit-m"wrote a readme file"

[master (root-commit) cb926e7] wrote a readme file

1file changed,2insertions(+)

createmode100644readme.txt

小結(jié)

初始化一個(gè)Git倉庫,使用git init命令挚币。

添加文件到Git倉庫亮蒋,分兩步:

·第一步,使用命令git add 忘晤,注意宛蚓,可反復(fù)多次使用激捏,添加多個(gè)文件设塔;

·第二步,使用命令git commit,完成闰蛔。

隨時(shí)掌握工作區(qū)狀態(tài)git status命令

git diff查看被修改的內(nèi)容

版本回退

·HEAD指向的版本就是當(dāng)前版本痕钢,因此,Git允許我們在版本的歷史之間穿梭序六,使用命令git

reset --hard commit_id任连。

·穿梭前,用git

log可以查看提交歷史例诀,以便確定要回退到哪個(gè)版本随抠。

·要重返未來,用git

reflog查看命令歷史繁涂,以便確定要回到未來的哪個(gè)版本

·git reflog用來記錄你的每一次命令

·$gitreflog

·ea34578HEAD@{0}:reset:movingtoHEAD^

·3628164HEAD@{1}:commit:appendGPL

·ea34578HEAD@{2}:commit:adddistributed

·cb926e7HEAD@{3}:commit(initial):wroteareadmefile

工作區(qū)和暫存區(qū)

Git的版本庫里存了很多東西拱她,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支master扔罪,以及指向master的一個(gè)指針叫HEAD秉沼。

管理修改

第一次修改->git add->第二次修改->git commit

Git管理的是修改,當(dāng)你用git add命令后矿酵,在工作區(qū)的第一次修改被放入暫存區(qū)唬复,準(zhǔn)備提交,但是全肮,在工作區(qū)的第二次修改并沒有放入暫存區(qū)敞咧,所以,git commit只負(fù)責(zé)把暫存區(qū)的修改提交了辜腺,也就是第一次的修改被提交了妄均,第二次的修改不會(huì)被提交。

那怎么提交第二次修改呢哪自?你可以繼續(xù)git add再git commit丰包,也可以別著急提交第一次修改,先git add第二次修改壤巷,再git commit邑彪,就相當(dāng)于把兩次修改合并后一塊提交了:

第一次修改->git add->第二次修改->git add->git commit

提交后,用git diff HEAD -- readme.txt命令可以查看工作區(qū)和版本庫里面最新版本的區(qū)別

Git是如何跟蹤修改的胧华,每次修改寄症,如果不add到暫存區(qū),那就不會(huì)加入到commit中矩动。

撤銷修改

命令git checkout -- readme.txt意思就是有巧,把readme.txt文件在工作區(qū)的修改全部撤銷,這里有兩種情況:

一種是readme.txt自修改后還沒有被放到暫存區(qū)悲没,現(xiàn)在篮迎,撤銷修改就回到和版本庫一模一樣的狀態(tài);

一種是readme.txt已經(jīng)添加到暫存區(qū)后,又作了修改甜橱,現(xiàn)在逊笆,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)。

總之岂傲,就是讓這個(gè)文件回到最近一次git commit或git add時(shí)的狀態(tài)难裆。

場景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容,想直接丟棄工作區(qū)的修改時(shí)镊掖,用命令git checkout -- file乃戈。(--很重要,沒有--亩进,就變成了“切換到另一個(gè)分支”的命令)

場景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容偏化,還添加到了暫存區(qū)時(shí),想丟棄修改镐侯,分兩步侦讨,第一步用命令git reset HEAD file,就回到了場景1苟翻,第二步按場景1操作韵卤。

場景3:已經(jīng)提交了不合適的修改到版本庫時(shí),想要撤銷本次提交崇猫,參考版本回退一節(jié)沈条,不過前提是沒有推送到遠(yuǎn)程庫。

git checkout其實(shí)是用版本庫里的版本替換工作區(qū)的版本诅炉,無論工作區(qū)是修改還是刪除蜡歹,都可以“一鍵還原”。

刪除文件

命令git rm用于刪除一個(gè)文件涕烧。如果一個(gè)文件已經(jīng)被提交到版本庫月而,那么你永遠(yuǎn)不用擔(dān)心誤刪,但是要小心议纯,你只能恢復(fù)文件到最新版本父款,你會(huì)丟失最近一次提交后你修改的內(nèi)容。

遠(yuǎn)程倉庫

GitHub

第1步:創(chuàng)建SSH Key瞻凤。在用戶主目錄下憨攒,看看有沒有.ssh目錄,如果有阀参,再看看這個(gè)目錄下有沒有id_rsa和id_rsa.pub這兩個(gè)文件肝集,如果已經(jīng)有了,可直接跳到下一步蛛壳。如果沒有杏瞻,打開Shell(Windows下打開Git Bash)所刀,創(chuàng)建SSH Key:

$ssh-keygen -t rsa -C"youremail@example.com"

你需要把郵件地址換成你自己的郵件地址,然后一路回車伐憾,使用默認(rèn)值即可,由于這個(gè)Key也不是用于軍事目的赫模,所以也無需設(shè)置密碼树肃。

如果一切順利的話,可以在用戶主目錄里找到.ssh目錄瀑罗,里面有id_rsa和id_rsa.pub兩個(gè)文件胸嘴,這兩個(gè)就是SSH Key的秘鑰對(duì)

第2步:登陸GitHub,打開“Account settings”斩祭,“SSH Keys”頁面:

然后劣像,點(diǎn)“Add

SSH Key”,填上任意Title摧玫,在Key文本框里粘貼id_rsa.pub文件的內(nèi)容:

添加遠(yuǎn)程庫

要關(guān)聯(lián)一個(gè)遠(yuǎn)程庫耳奕,使用命令git remote add origin

git@server-name:path/repo-name.git;

關(guān)聯(lián)后诬像,使用命令git push -u origin master第一次推送master分支的所有內(nèi)容屋群;

此后,每次本地提交后坏挠,只要有必要芍躏,就可以使用命令git push origin master推送最新修改;

分布式版本系統(tǒng)的最大好處之一是在本地工作完全不需要考慮遠(yuǎn)程庫的存在降狠,也就是有沒有聯(lián)網(wǎng)都可以正常工作对竣,而SVN在沒有聯(lián)網(wǎng)的時(shí)候是拒絕干活的!當(dāng)有網(wǎng)絡(luò)的時(shí)候榜配,再把本地提交推送一下就完成了同步否纬!

從遠(yuǎn)程庫克隆

要克隆一個(gè)倉庫,首先必須知道倉庫的地址蛋褥,然后使用git clone命令克隆烦味。

Git支持多種協(xié)議,包括https壁拉,但通過ssh支持的原生git協(xié)議速度最快

$git clone git@github.com:michaelliao/gitskills.git

Cloninginto'gitskills'...

remote:Countingobjects:3, done.

remote:Total3(delta0), reused0(delta0)

Receivingobjects:100% (3/3), done.

$cd gitskills

$ls

README.md

創(chuàng)建與合并分支

Git鼓勵(lì)大量使用分支:

查看分支:git branch

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

切換分支:git checkout

創(chuàng)建+切換分支:git checkout -b

合并某分支到當(dāng)前分支:git merge

刪除分支:git branch -d

解決沖突

當(dāng)Git無法自動(dòng)合并分支時(shí)谬俄,就必須首先解決沖突。解決沖突后弃理,再提交溃论,合并完成。

用git log --graph命令可以看到分支合并圖痘昌。

分支管理策略

首先钥勋,master分支應(yīng)該是非常穩(wěn)定的炬转,也就是僅用來發(fā)布新版本,平時(shí)不能在上面干活算灸;

git flow工作流


feature(多個(gè)扼劈、玫紅)。主要是自己玩了菲驴,差不多的時(shí)候要合并回develop去荐吵。從不與master交互。

develop(1個(gè)赊瞬、黃色)先煎。主要是和feature以及release交互。

release(同一時(shí)間1個(gè)巧涧、綠色)薯蝎。總是基于develop谤绳,最后又合并回develop占锯。當(dāng)然對(duì)應(yīng)的tag跑到master這邊去了。生命周期很短缩筛,只是為了發(fā)布

hotfix(同一時(shí)間1個(gè)烟央、紅色)⊥嵩啵總是基于master疑俭,并最后合并到master和develop。生命周期較短婿失,用了修復(fù)bug或小粒度修改發(fā)布钞艇。

master(1個(gè)藍(lán)色)。沒有什么東西豪硅,僅是一些關(guān)聯(lián)的tag哩照,因從不在master上開發(fā)

小結(jié)

Git分支十分強(qiáng)大,在團(tuán)隊(duì)開發(fā)中應(yīng)該充分應(yīng)用懒浮。

合并分支時(shí)飘弧,加上--no-ff參數(shù)就可以用普通模式合并,合并后的歷史有分支砚著,能看出來曾經(jīng)做過合并次伶,而fast forward合并就看不出來曾經(jīng)做過合并。

多人協(xié)作的工作模式

多人協(xié)作的工作模式通常是這樣:

1.首先稽穆,可以試圖用git push origin branch-name推送自己的修改冠王;

2.如果推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新舌镶,需要先用git pull試圖合并柱彻;

3.如果合并有沖突豪娜,則解決沖突,并在本地提交哟楷;

4.沒有沖突或者解決掉沖突后瘤载,再用git push origin branch-name推送就能成功!

如果git pull提示“no tracking information”卖擅,則說明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒有創(chuàng)建鸣奔,用命令git branch --set-upstream branch-name

origin/branch-name。

這就是多人協(xié)作的工作模式磨镶,一旦熟悉了溃蔫,就非常簡單健提。

小結(jié)

·查看遠(yuǎn)程庫信息琳猫,使用git remote -v;

·本地新建的分支如果不推送到遠(yuǎn)程私痹,對(duì)其他人就是不可見的脐嫂;

·從本地推送分支,使用git push origin branch-name紊遵,如果推送失敗账千,先用git pull抓取遠(yuǎn)程的新提交;

·在本地創(chuàng)建和遠(yuǎn)程分支對(duì)應(yīng)的分支暗膜,使用git checkout -b branch-name origin/branch-name匀奏,本地和遠(yuǎn)程分支的名稱最好一致;

·建立本地分支和遠(yuǎn)程分支的關(guān)聯(lián)学搜,使用git branch --set-upstream branch-name

origin/branch-name娃善;

·從遠(yuǎn)程抓取分支,使用git pull瑞佩,如果有沖突聚磺,要先處理沖突。

標(biāo)簽管理

·命令git

tag 用于新建一個(gè)標(biāo)簽炬丸,默認(rèn)為HEAD瘫寝,也可以指定一個(gè)commit id;

·git tag -a

-m "blablabla..."可以指定標(biāo)簽信息稠炬;

·git tag -s

-m "blablabla..."可以用PGP簽名標(biāo)簽焕阿;

·命令git

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

操作標(biāo)簽

·命令git

push origin 可以推送一個(gè)本地標(biāo)簽首启;

·命令git

push origin --tags可以推送全部未推送過的本地標(biāo)簽捣鲸;

·命令git

tag -d 可以刪除一個(gè)本地標(biāo)簽;

·命令git

push origin :refs/tags/可以刪除一個(gè)遠(yuǎn)程標(biāo)簽

自定義Git

比如闽坡,讓Git顯示顏色栽惶,會(huì)讓命令輸出看起來更醒目:

$git config --global color.uitrue

忽略特殊文件

·忽略某些文件時(shí)愁溜,需要編寫.gitignore;

·.gitignore文件本身要放到版本庫里外厂,并且可以對(duì).gitignore做版本管理冕象!

需要找出來到底哪個(gè)規(guī)則寫錯(cuò)了,可以用git check-ignore命令檢查:

配置別名

$git config --globalalias.st status

$git config --globalalias.co checkout

$git config --globalalias.ci commit

$git config --globalalias.br branch

撤銷修改一節(jié)中汁蝶,我們知道渐扮,命令git reset HEAD file可以把暫存區(qū)的修改撤銷掉(unstage),重新放回工作區(qū)掖棉。既然是一個(gè)unstage操作墓律,就可以配置一個(gè)unstage別名:

$git config --globalalias.unstage'reset HEAD'

當(dāng)你敲入命令:

$git unstage test.py

實(shí)際上Git執(zhí)行的是:

$ git resetHEAD test.py

配置一個(gè)git last,讓其顯示最后一次提交信息:

$git config --globalalias.last'log -1'

這樣幔亥,用git last就能顯示最近一次的提交:

甚至還有人喪心病狂地把lg配置成了:

git config --globalalias.lg"log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"


配置文件

配置Git的時(shí)候耻讽,加上--global是針對(duì)當(dāng)前用戶起作用的,如果不加帕棉,那只針對(duì)當(dāng)前的倉庫起作用针肥。

配置文件放哪了?每個(gè)倉庫的Git配置文件都放在.git/config文件中:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末香伴,一起剝皮案震驚了整個(gè)濱河市慰枕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌即纲,老刑警劉巖具帮,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異低斋,居然都是意外死亡蜂厅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門拔稳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來葛峻,“玉大人,你說我怎么就攤上這事巴比∈踅保” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵轻绞,是天一觀的道長采记。 經(jīng)常有香客問我,道長政勃,這世上最難降的妖魔是什么唧龄? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮奸远,結(jié)果婚禮上既棺,老公的妹妹穿的比我還像新娘讽挟。我一直安慰自己,他們只是感情好丸冕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布耽梅。 她就那樣靜靜地躺著,像睡著了一般胖烛。 火紅的嫁衣襯著肌膚如雪眼姐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天佩番,我揣著相機(jī)與錄音众旗,去河邊找鬼。 笑死趟畏,一個(gè)胖子當(dāng)著我的面吹牛贡歧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拱镐,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼艘款,長吁一口氣:“原來是場噩夢啊……” “哼持际!你這毒婦竟也來了沃琅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤蜘欲,失蹤者是張志新(化名)和其女友劉穎益眉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姥份,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡郭脂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了澈歉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片展鸡。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖埃难,靈堂內(nèi)的尸體忽然破棺而出莹弊,到底是詐尸還是另有隱情,我是刑警寧澤涡尘,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布忍弛,位于F島的核電站,受9級(jí)特大地震影響考抄,放射性物質(zhì)發(fā)生泄漏细疚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一川梅、第九天 我趴在偏房一處隱蔽的房頂上張望疯兼。 院中可真熱鬧然遏,春花似錦、人聲如沸吧彪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽来氧。三九已至诫给,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間啦扬,已是汗流浹背中狂。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扑毡,地道東北人胃榕。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像瞄摊,于是被迫代替她去往敵國和親勋又。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

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