基礎(chǔ)命令
用戶設(shè)置
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
初始化倉庫
git init
把文件添加到倉庫
git add filename
把文件提交到倉庫
git commit -m "comment message"
添加文件到Git倉庫
分兩步:
第一步昭伸,使用命令git add,注意绊序,可反復(fù)多次使用煎谍,添加多個(gè)文件攘蔽;
第二步,使用命令git commit呐粘,完成。
運(yùn)行g(shù)it status命令看看結(jié)果
git status
但如果要看看具體修改了什么內(nèi)容
git diff filename
要隨時(shí)掌握工作區(qū)的狀態(tài)转捕,使用git status命令作岖。
如果git status告訴你有文件被修改過,用git diff可以查看修改內(nèi)容
版本控制系統(tǒng)肯定有某個(gè)命令可以告訴我們歷史記錄五芝,在Git中痘儡,我們用git log命令查看
git log
git log --pretty=oneline
首先,Git必須知道當(dāng)前版本是哪個(gè)版本枢步,在Git中沉删,用HEAD表示當(dāng)前版本渐尿,也就是最新的提交,上一個(gè)版本就是HEAD^ ,上上一個(gè)版本就是HEAD^^矾瑰, 當(dāng)然往上100個(gè)版本寫100個(gè)^比較容易數(shù)不過來砖茸,所以寫成HEAD~100.
git reset --hard HEAD^
git reset --hard 3628164
Git提供了一個(gè)命令git reflog用來查看歷史
git reflog
HEAD指向的版本就是當(dāng)前版本,因此殴穴,Git允許我們在版本的歷史之間穿梭凉夯,使用命令git reset --hard commit id。
穿梭前采幌,用git log可以查看提交歷史劲够,以便確定要回退到哪個(gè)版本。
要重返未來休傍,用git reflog查看命令歷史征绎,以便確定要回到未來的哪個(gè)版本。
工作區(qū)(Working Directory):就是你在電腦里能看到的目錄磨取,比如我的learngit文件夾就是一個(gè)工作區(qū)人柿。
版本庫(Repository):工作區(qū)有一個(gè)隱藏目錄“.git”,這個(gè)不算工作區(qū)寝衫,而是Git的版本庫顷扩。
Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū)慰毅,還有Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支master隘截,以及指向master的一個(gè)指針叫HEAD。
前面講了我們把文件往Git版本庫里添加的時(shí)候汹胃,是分兩步執(zhí)行的:
第一步是用“git add”把文件添加進(jìn)去婶芭,實(shí)際上就是把文件修改添加到暫存區(qū);
第二步是用“git commit”提交更改着饥,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支犀农。
git checkout -- file 可以丟棄工作區(qū)的修改
git checkout -- filename
git checkout -- file命令中的“--”很重要,沒有“--”宰掉,就變成了“創(chuàng)建一個(gè)新分支”的命令.
用命令git reset HEAD file可以把暫存區(qū)的修改撤銷掉(unstage)呵哨,重新放回工作區(qū)
git reset HEAD filename
git reset命令既可以回退版本,也可以把暫存區(qū)的修改回退到工作區(qū)轨奄。當(dāng)我們用HEAD時(shí)孟害,表示最新的版本。
場景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容挪拟,想直接丟棄工作區(qū)的修改時(shí)挨务,用命令git checkout -- file。
場景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容,還添加到了暫存區(qū)時(shí)谎柄,想丟棄修改丁侄,分兩步,第一步用命令git reset HEAD file朝巫,就回到了場景1鸿摇,第二步按場景1操作。
確實(shí)要從版本庫中刪除該文件捍歪,那就用命令git rm刪掉户辱,并且commit
git rm test.txt
git commit -m remove test.txt
另一種情況是刪錯(cuò)了,因?yàn)榘姹編炖镞€有呢糙臼,所以可以很輕松地把誤刪的文件恢復(fù)到最新版本
git checkout -- test.txt
git checkout其實(shí)是用版本庫里的版本替換工作區(qū)的版本庐镐,無論工作區(qū)是修改還是刪除,都可以“一鍵還原”变逃。
命令git rm用于刪除一個(gè)文件必逆。如果一個(gè)文件已經(jīng)被提交到版本庫,那么你永遠(yuǎn)不用擔(dān)心誤刪揽乱,但是要小心名眉,你只能恢復(fù)文件到最新版本,你會(huì)丟失最近一次提交后你修改的內(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)后,使用命令第一次推送master分支的所有內(nèi)容
git push -u origin master
此后撒犀,每次本地提交后福压,只要有必要,就可以使用命令git push origin master推送最新修改或舞;
用命令git clone克隆一個(gè)本地庫
Git本身的源代碼你既可以用 git://協(xié)議來訪問
git clone git://git.kernel.org/pub/scm/git/git.git
也可以通過http 協(xié)議來訪問:
git clone http://www.kernel.org/pub/scm/git/git.git
git 分支
查看分支:git branch
創(chuàng)建分支:git branch name
切換分支:git checkout name
創(chuàng)建+切換分支:git checkout -b name
合并某分支到當(dāng)前分支:git merge name
刪除分支:git branch -d name
在 當(dāng)前分支下荆姆,要把dev分支的內(nèi)容合并
git merge dev
當(dāng)Git無法自動(dòng)合并分支時(shí),就必須首先解決沖突映凳。解決沖突后胆筒,再提交,合并完成诈豌。
用git log --graph命令可以看到分支合并圖仆救。
在實(shí)際開發(fā)中,我們應(yīng)該按照幾個(gè)基本原則進(jìn)行分支管理:
首先矫渔,master分支應(yīng)該是非常穩(wěn)定的派桩,也就是僅用來發(fā)布新版本,平時(shí)不能在上面干活蚌斩;
那在哪干活呢?干活都在dev分支上,也就是說送膳,dev分支是不穩(wěn)定的员魏,到某個(gè)時(shí)候,比如1.0版本發(fā)布時(shí)叠聋,再把dev分支合并到master上撕阎,在master分支發(fā)布1.0版本;
你和你的小伙伴們每個(gè)人都在dev分支上干活碌补,每個(gè)人都有自己的分支虏束,時(shí)不時(shí)地往dev分支上合并就可以了。
Git還提供了一個(gè)stash功能厦章,可以把當(dāng)前工作現(xiàn)場“儲(chǔ)藏”起來镇匀,等以后恢復(fù)現(xiàn)場后繼續(xù)工作:
git stash
現(xiàn)在,用git status查看工作區(qū)袜啃,就是干凈的(除非有沒有被Git管理的文件)汗侵,因此可以放心地創(chuàng)建分支來修復(fù)bug。
首先確定要在哪個(gè)分支上修復(fù)bug群发,假定需要在master分支上修復(fù)晰韵,就從master創(chuàng)建臨時(shí)分支:
轉(zhuǎn)換到master分支
git checkout master
創(chuàng)建并轉(zhuǎn)換到的名字為 issue-101 的分支
git checkout -b issue -101
查看存儲(chǔ)的工作 用git stash list
git stash list
工作現(xiàn)場還在,Git把stash內(nèi)容存在某個(gè)地方了熟妓,但是需要恢復(fù)一下雪猪,有兩個(gè)辦法:
一是用git stash apply恢復(fù),但是恢復(fù)后起愈,stash內(nèi)容并不刪除只恨,你需要用git stash drop來刪除;
另一種方式是用git stash pop告材,恢復(fù)的同時(shí)把stash內(nèi)容也刪了:
修復(fù)bug時(shí)坤次,我們會(huì)通過創(chuàng)建新的bug分支進(jìn)行修復(fù),然后合并斥赋,最后刪除缰猴;
當(dāng)手頭工作沒有完成時(shí),先把工作現(xiàn)場git stash一下疤剑,然后去修復(fù)bug滑绒,修復(fù)后,再git stash pop隘膘,回到工作現(xiàn)場.
如果要丟棄一個(gè)沒有被合并過的分支疑故,可以通過git branch -D name強(qiáng)行刪除。
;
當(dāng)你從遠(yuǎn)程倉庫克隆時(shí)弯菊,實(shí)際上Git自動(dòng)把本地的master分支和遠(yuǎn)程的master分支對應(yīng)起來了纵势,并且,遠(yuǎn)程倉庫的默認(rèn)名稱是origin。
要查看遠(yuǎn)程庫的信息钦铁,用git remote或者用git remote -v顯示更詳細(xì)的信息:
推送分支
推送分支软舌,就是把該分支上的所有本地提交推送到遠(yuǎn)程庫。推送時(shí)牛曹,要指定本地分支佛点,這樣,Git就會(huì)把該分支推送到遠(yuǎn)程庫對應(yīng)的遠(yuǎn)程分支上.
git push origin master
如果要推送其他分支黎比,比如dev超营,就改成
git push origin dev
但是,并不是一定要把本地分支往遠(yuǎn)程推送阅虫,那么演闭,哪些分支需要推送,哪些不需要呢书妻?
master分支是主分支船响,因此要時(shí)刻與遠(yuǎn)程同步;
dev分支是開發(fā)分支躲履,團(tuán)隊(duì)所有成員都需要在上面工作见间,所以也需要與遠(yuǎn)程同步;
bug分支只用于在本地修復(fù)bug工猜,就沒必要推到遠(yuǎn)程了米诉,除非老板要看看你每周到底修復(fù)了幾個(gè)bug;
feature分支是否推到遠(yuǎn)程篷帅,取決于你是否和你的小伙伴合作在上面開發(fā)史侣。
總之,就是在Git中魏身,分支完全可以在本地自己藏著玩惊橱,是否推送,視你的心情而定箭昵!
抓取分支
多人協(xié)作時(shí)税朴,大家都會(huì)往master和dev分支上推送各自的修改。
現(xiàn)在家制,模擬一個(gè)你的小伙伴正林,可以在另一臺電腦(注意要把SSH Key添加到GitHub)或者同一臺電腦的另一個(gè)目錄下克隆:
git clone git://git.kernel.org/pub/scm/git/git.git
指定本地dev分支與遠(yuǎn)程origin/dev分支的鏈接
git branch --set -upstream dev origin/dev
git pull
因此颤殴,多人協(xié)作的工作模式通常是這樣:
首先觅廓,可以試圖用git push origin branch-name推送自己的修改;
如果推送失敗涵但,則因?yàn)檫h(yuǎn)程分支比你的本地更新杈绸,需要先用git pull試圖合并帖蔓;
如果合并有沖突,則解決沖突蝇棉,并在本地提交讨阻;
沒有沖突或者解決掉沖突后,再用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é)作的工作模式,一旦熟悉了棘催,就非常簡單劲弦。
查看遠(yuǎn)程庫信息,使用git remote -v醇坝;
本地新建的分支如果不推送到遠(yuǎn)程邑跪,對其他人就是不可見的;
從本地推送分支呼猪,使用git push origin branch-name画畅,如果推送失敗,先用git pull抓取遠(yuǎn)程的新提交宋距;
在本地創(chuàng)建和遠(yuǎn)程分支對應(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雳灵,如果有沖突,要先處理沖突闸盔。
tag 標(biāo)簽
命令git tag name就可以打一個(gè)新標(biāo)簽悯辙,可以用命令git tag查看所有標(biāo)簽
新建標(biāo)簽
git tag v1.0
給commit id 為25656e2的歷史版本打標(biāo)簽
git tag v1.0 25656e2
查看標(biāo)簽
git show tagname
用git show tagname查看標(biāo)簽信息
git show v1.0
命令git tag name用于新建一個(gè)標(biāo)簽,默認(rèn)為HEAD蕾殴,也可以指定一個(gè)commit id笑撞;
-a tagname -m "blablabla..."可以指定標(biāo)簽信息;
-s tagname -m "blablabla..."可以用PGP簽名標(biāo)簽钓觉;
命令git tag可以查看所有標(biāo)簽茴肥;
推送某個(gè)標(biāo)簽到遠(yuǎn)程,使用命令git push origin tagname荡灾,或者瓤狐,一次性推送全部尚未推送到遠(yuǎn)程的本地標(biāo)簽
git push origin v1.0
git push origin --tags
刪除標(biāo)簽
分兩步瞬铸,
- 刪除本地;
- 刪除遠(yuǎn)程础锐。
刪除本地
git tag -d v0.9
刪除遠(yuǎn)程
git push origin :refs/tags/v0.9
命令git push origin tagname可以推送一個(gè)本地標(biāo)簽嗓节;
命令git push origin --tags可以推送全部未推送過的本地標(biāo)簽;
命令git tag -d tagname可以刪除一個(gè)本地標(biāo)簽皆警;
命令git push origin :refs/tags/tagname可以刪除一個(gè)遠(yuǎn)程標(biāo)簽拦宣。
ignore 文件
不需要從頭寫.gitignore文件,GitHub已經(jīng)為我們準(zhǔn)備了各種配置文件信姓,只需要組合一下就可以使用了鸵隧。所有配置文件可以直接在線瀏覽:https://github.com/github/gitignore
忽略文件的原則是:
- 忽略操作系統(tǒng)自動(dòng)生成的文件,比如縮略圖等意推;
- 忽略編譯生成的中間文件豆瘫、可執(zhí)行文件等,也就是如果一個(gè)文件是通過另一個(gè)文件自動(dòng)生成的菊值,那自動(dòng)生成的文件就沒必要放進(jìn)版本庫外驱,比如Java編譯產(chǎn)生的.class文件;
- 忽略你自己的帶有敏感信息的配置文件腻窒,比如存放口令的配置文件昵宇。
配置別名
如果敲git st就表示git status
git config --global alias.st status
git config global alias.co checkout
git config global alias.ci commit
git config global alias.br branch
git config --global alias.unstage 'reset HEAD'