git init
圖例中首先創(chuàng)建了一個空的文件夾gitDemo丹诀,進(jìn)入該文件夾走孽,運行g(shù)it init命令惧辈,提示創(chuàng)建了一個空的git倉庫。這時候我們查看gitDemo磕瓷,發(fā)現(xiàn)多了一個.git目錄盒齿,它是用來跟蹤管理版本庫的。由于.git這個目錄默認(rèn)是隱藏的困食,所以需要用ls -ah命令才能查看边翁。
git add & git commit
在介紹這兩個命令之前我們先來了解一下工作區(qū)(Working Directory)和版本庫(Repository),
其中Working Directory就指當(dāng)前在電腦上看到的所有目錄硕盹,如例子中的gitDemo目錄符匾;
對于Repository,首先
Working Directory有一個隱藏目錄.git瘩例,這個不算工作區(qū)啊胶,而是Git的版本庫。Git的版本庫里存了很多東西垛贤,其中最重要的就是稱為stage(或者叫index)的暫存區(qū)焰坪,還有Git為我們自動創(chuàng)建的第一個分支master,以及指向master的一個指針叫HEAD南吮×詹剩——from https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013745374151782eb658c5a5ca454eaa451661275886c6000
了解了Working Directory以及Repository,我們就能更明白git add 和 git commit 都是針對什么進(jìn)行操作。
簡單總結(jié)就是:
git add把文件修改添加到暫存區(qū)露乏;
git commit把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支碧浊。
但起初我還是很疑惑的,為什么在git commit之前要增加一個git add操作瘟仿,這樣不是很繁瑣嗎箱锐??劳较?
最后在網(wǎng)上查閱資料時看到這樣一個生動的總結(jié)驹止,讓我瞬間明白了其中的道理:
git add就好比逛淘寶的時候?qū)⒁徺I的商品添加到購物車,而git commit相當(dāng)于將購物車?yán)锏纳唐芬徊⒔Y(jié)賬观蜗,試想如果每往購物車加入一件商品就要結(jié)一次賬臊恋,豈不是更麻煩。
git add <file> 表示將指定文件的修改添加到暫存區(qū) e.g.: git add test.txt
git add . 表示將涉及到的所有修改都添加到暫存區(qū)
git commit -m '這里是相關(guān)說明' 表示將暫存區(qū)中所有內(nèi)容提交到當(dāng)前分支墓捻,其中-m 后面跟著的是這次提交內(nèi)容的相關(guān)注釋抖仅,不建議省略。
git diff
用來查看文件具體都有了些什么修改
git status
這是git命令中很重要的一個命令砖第,它讓我們時刻掌握倉庫當(dāng)前的狀態(tài)撤卢,同時會給出一些接下來我們可能會進(jìn)行的操作的相關(guān)提示。
在上面的例子中梧兼,我重新編輯了之前創(chuàng)建的test.txt文件放吩,做了一些文件內(nèi)容的修改,之后使用git status命令羽杰,得出上圖渡紫。上圖訴我們?nèi)缦滦畔ⅲ?/p>
git checkout -- <file>
對文件的修改還沒有添加到暫存區(qū),以便之后的提交忽洛;
可以使用git add <file>將修改添加到暫存區(qū)腻惠,更新暫存區(qū)內(nèi)容,以便之后提交
可以使用git checkout -- <file> 來撤銷工作區(qū)中發(fā)生的修改
因此欲虚,如果修改還沒被添加到暫存區(qū),那么可以通過git checkout -- <file>來將工作區(qū)的內(nèi)容恢復(fù)到上一次git add 之前悔雹。
git reset HEAD
如果修改已經(jīng)被添加到暫存區(qū)复哆,那么可以根據(jù)提示通過git reset HEAD <file>,這里的HEAD值的是當(dāng)前分支腌零。
此操作只是將上一次的git add 操作撤銷梯找,添加到暫存區(qū)的修改移出暫存區(qū),要進(jìn)一步刪除當(dāng)前工作區(qū)的修改益涧,根據(jù)提示繼續(xù)執(zhí)行g(shù)it checkout -- <file>操作锈锤,回到上上次git add后的狀態(tài)。
可以看到我修改了test.txt文件,并且執(zhí)行了git add操作久免,這時候查看git status浅辙,提示說——修改以及添加到暫存區(qū),等待提交阎姥。同時可以使用git reset HEAD <file>將修改移出暫存记舆。
執(zhí)行g(shù)it reset --hard <file>將之前移入暫存的修改移出,可以看到git reset --hard <file>執(zhí)行前后呼巴,相關(guān)文件test.txt內(nèi)容并沒有什么改變泽腮,但此時運行g(shù)it status提示說——有存在未添加到暫存的修改,如果確認(rèn)要移入暫存則執(zhí)行g(shù)it add衣赶,若要撤銷工作區(qū)修改诊赊,則執(zhí)行g(shù)it checkout -- <file>。
可以看到執(zhí)行g(shù)it checkout -- <file>之后府瞄,test.txt恢復(fù)到了上上次git add后的狀態(tài)豪筝。
git reset --hard HEAD^/id
如果再糟糕一點,修改不僅已經(jīng)被添加到暫存區(qū)還被提交到了分支上摘能,那么怎樣回退到上一個版本续崖?
不知道大家有沒有注意到,每當(dāng)我們執(zhí)行一次git commit時团搞,同時會創(chuàng)建一個版本id严望,有了這個id我們就能通過id和相關(guān)指令回到指定版本棚点。
上圖中滔韵,我們先修改了test.txt文件逃沿,之后執(zhí)行了git add 以及 git commit 操作咽斧,可以看到git commit時創(chuàng)建了一個7位數(shù)的版本id/commit id械巡,實際的id并不是7位數(shù)俱萍,這里只是展示出來前7位库菲。之后執(zhí)行g(shù)it reset --hard HEAD^回退到了前一個版本琐鲁,可以看到命令執(zhí)行前后test.txt文件內(nèi)容的改變挽拂。
其中HEAD^表示當(dāng)前版本的上一個版本惭每,依此類推,HEAD^^表示上一個版本的上一版本亏栈,但如果我們想回退到很久以前的版本台腥,一直HEAD^也很麻煩,所以git也提供了根據(jù)版本id來回退到指定版本的指令绒北。
那如何知道要回退的版本的id呢黎侈?純靠自己記是不現(xiàn)實的。
git log / git log --pretty=online
可以幫助我們闷游,git log可以查看提交歷史,其中g(shù)it log --pretty=online得到的是簡潔版的提交歷史峻汉。
通過git log我嗎可以清楚的看到提交歷史贴汪,包括提交時的注釋、時間休吠、提交人之類的信息扳埂,同時包括很重要的提交id,有了提交id我們就可以任意回退到指定版本了~
回退成功蛛碌。
git reflog
因為如果回退到以前的版本后聂喇,再執(zhí)行g(shù)it log,那么沒回退前的那個版本就不會再出現(xiàn)在提交歷史中了蔚携。那如果這個時候我們又想去到?jīng)]回退前的版本怎么辦希太,需要的依然是id,那id去哪兒找呢酝蜒?
執(zhí)行g(shù)it reflog可以查到命令歷史誊辉,就可以去命令歷史里找回退前的id。
在命令歷史中我們可以找到回退前的版本號為commit:add again所對應(yīng)的id——abd342c亡脑,因此就很好去到回退前的版本了堕澄。
git rm
這個命令表示刪除文件
根據(jù)提示你也可以撤銷刪除,此時相關(guān)文件會恢復(fù)到最新版本霉咨,但是會丟失最后一次提交后修改的內(nèi)容蛙紫。
一直在操作本地倉庫,是時候過渡到遠(yuǎn)程倉庫了
對于遠(yuǎn)程倉庫有兩種情況:
git remote add origin git@server-name:path/repo-name.git
git push -u origin master
1. 你已經(jīng)在本地創(chuàng)建了一個Git倉庫途戒,又想在GitHub創(chuàng)建一個Git倉庫坑傅,并且讓這兩個倉庫進(jìn)行遠(yuǎn)程同步。
此時你需要打開github創(chuàng)建一個遠(yuǎn)程倉庫喷斋,倉庫名和本地倉庫名一致唁毒。本例中的倉庫名為gitDemo。
GitHub告訴我們星爪,可以從這個倉庫克隆出新的倉庫浆西,也可以把一個已有的本地倉庫與之關(guān)聯(lián),然后顽腾,把本地倉庫的內(nèi)容推送到GitHub倉庫近零。
根據(jù)github提示,我們進(jìn)行了下面兩個操作:
關(guān)聯(lián)遠(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 clone
2. 此時我們沒有本地倉庫,打算從一開始創(chuàng)建遠(yuǎn)程倉庫陈瘦,再從遠(yuǎn)程倉庫克隆
也是在github創(chuàng)建一個遠(yuǎn)程倉庫幌甘,之后拿到克隆的鏈接,執(zhí)行相關(guān)命令
git branch
查看分支
git branch <name>
創(chuàng)建分支
git checkout <name>
切換分支
git checkout -b <name>
創(chuàng)建并切換分支
git merge <name>
將指定分支合并到當(dāng)前分支
git branch -d <name>
刪除指定分支
git branch -D <name>
強(qiáng)制刪除指定分支,即使還沒有merge
git stash
git stash pop
當(dāng)手頭工作沒有完成時锅风,先把工作現(xiàn)場git stash一下酥诽,然后去修復(fù)bug,修復(fù)后皱埠,再git stash pop肮帐,回到工作現(xiàn)場。
git tag <name>
新建tag
默認(rèn)為HEAD版本打tag
git tag <name> id
為指定版本打tag
git tag -a <name> -m "" id
創(chuàng)建帶有說明的標(biāo)簽边器,用-a指定標(biāo)簽名训枢,-m指定說明文字
git show <name>
可以看到說明文字
git tag
參看所有tag
git tag -d <name>
刪除指定tag,此時tag還沒被推送到遠(yuǎn)程倉庫
git push origin <name>
將指定tag推送到遠(yuǎn)程倉庫
git tag -d <name>
git push origin:refs/tags/<name>
如果標(biāo)簽已經(jīng)推送到遠(yuǎn)程忘巧,要刪除遠(yuǎn)程標(biāo)簽得先從本地刪除恒界,再刪除遠(yuǎn)程分支
git配置別名
每個倉庫的Git配置文件都放在.git/config文件中,別名就在[alias]后面砚嘴,要刪除別名十酣,直接把對應(yīng)的行刪掉即可。
后面的命令沒有一步一步的用demo演示际长,以后可以慢慢加上耸采,主要是覺得這些比較容易一使用就會了,所以建議大家隨便弄一個文件來實際操作一下這些命令工育。遇到問題積極解決虾宇,在過程中感觸比較深的一點就是出問題的時候看看提示,根據(jù)提示一步步都能把問題解決翅娶。注意用git status來實時掌控修改文留,同時git status會有很多接下來可能會發(fā)生的操作的提示。