安裝:
windows安裝git-- msysgit是windows版的git垢袱,下載單獨(dú)的.exe按照默認(rèn)選項(xiàng)安裝即可? 在開始菜單找git-->git bash幌甘,會跳出命令行窗口窖式,表示安裝成功蚁飒。輸入命令git config --global user.name“你的名字” gitconfig --global user.email“你的郵箱”進(jìn)行設(shè)置
創(chuàng)建版本庫(repository):
? ? mkdir 要創(chuàng)建的目錄名
? ? cd 要創(chuàng)建的目錄名
? ? pwd -->這個(gè)命令是顯示當(dāng)前目錄的
? ? git init -->把目錄變成git可管理的倉庫,此時(shí)看到路徑有.git萝喘,若沒有飒箭,可能默認(rèn)隱藏了,通過ls -ah命令可以看到
添加文件:
? ? git add文件名-->添加文件蜒灰,回車后窗口并沒有給什么反應(yīng)
? ? git commit -m“本次說明”-->把文件提交到倉庫弦蹂,-m后面輸入的是本次提交的說明
? ? 另外說明:為什么需要add和commit兩步呢?因?yàn)閏ommit可以一次提交多個(gè)文件
例如:gitadd file1.txt
? ? ? ? ? ?git add file2.txt file.txt
? ? ? ? ? ?git commit -m“add 3 file.”
時(shí)光機(jī)穿梭:
git status -->若更改文件內(nèi)容强窖,可以通過這個(gè)命令查看當(dāng)前狀態(tài)凸椿,是否被修改了,修改后是否提交
git diff文件名-->可以查看根據(jù)命令輸出看到哪里做了修改 修改后提交的步驟依然是add commit翅溺,在commit之前運(yùn)行status看一下當(dāng)前倉庫狀態(tài)
git status -->可以看到要提交的包括剛剛修改的文件脑漫,然后commit一下,繼續(xù)status
git status -->會告訴我們沒有需要提交的修改咙崎,工作目錄是干凈的(working directory clean)
git log -->查看提交的歷史記錄优幸,從最近到最遠(yuǎn)的方式顯示
git log --pretty=oneline -->看到的一長串是commit
id(版本號),是SHA1計(jì)算出來的用十六進(jìn)制表示的數(shù)字
時(shí)光機(jī):
git reset --hard HEAD^ -->回退到上一個(gè)版本
cat文件名-->查看當(dāng)前版本的內(nèi)容褪猛,看一下是不是我們要回退的這個(gè)版本网杆,此時(shí)log已經(jīng)看不到最新那個(gè)版本記錄
git reset --hard最新版本的前幾位commit id -->回到最新版本,如果找的多個(gè)版本號伊滋,cat一下看看內(nèi)容 不要忘記git commit
git reflog -->可以查看每一次命令的commit id
工作區(qū)(working directory)和暫存區(qū)(stage):
add是把工作區(qū)文件添加進(jìn)暫存區(qū)碳却,commit是從暫存區(qū)到分支上(版本庫包括暫存區(qū)和分支),必須先add到暫存區(qū)笑旺,才能commit到分支上
撤銷修改:
git checkout --文件名-->在工作區(qū)的修改全部撤銷昼浦,一是修改后還沒有add到暫存區(qū),就回到和版本庫一樣的狀態(tài)筒主,就是回到最近一次commit的狀態(tài)关噪;一是已經(jīng)add暫存區(qū)鸟蟹,又做了修改,是回到add暫存區(qū)的狀態(tài)使兔,就是最近一次add的狀態(tài)建钥。
git reset HEAD文件名-->把暫存區(qū)的修改撤銷(unstage),重新回到工作區(qū)火诸,checkout--文件名丟棄工作區(qū)的修改
gitreset命令既可以回退版本锦针,也可以把暫存區(qū)的修改回退到工作區(qū)荠察。當(dāng)用HEAD時(shí)置蜀,表示最新版本。
刪除文件:
rm文件名-->在工作區(qū)刪除一個(gè)已經(jīng)提交了的文件悉盆,現(xiàn)在是版本庫和工作區(qū)不一致盯荤,status可以看到哪些被刪了:
一是確定是要刪掉這個(gè)文件,
? ? git rm
?? ?git commit-->通過這兩個(gè)命令焕盟,文件就從版本庫中刪除了
一是刪錯(cuò)了的情況秋秤,由于此時(shí)版本庫里還有這個(gè)文件
? ? git checkout --文件名-->現(xiàn)在就是回到最近的版本庫狀態(tài)了
遠(yuǎn)程倉庫:(用github為例)
1,首先需要SSH KEY(在用戶主目錄下.ssh文件夾下有id_ras(私鑰)和id_ras.pub(公鑰))脚翘,沒有的話灼卢,打開Git Bash創(chuàng)建ssh-keygen -t rsa -C“你的郵箱”,然后一路回車
2来农,登錄github鞋真,打開account setting,ssh keys頁面沃于,點(diǎn)擊add ssh key涩咖,填上任意title,在key里粘貼id_ras.pub文件的內(nèi)容繁莹,然后點(diǎn)擊add key檩互。(需要ssh是因?yàn)間ithub需要識別推送的消息是否是你推送的)在github上創(chuàng)建倉庫,Create a new repo-->在repository name填寫倉庫名咨演,其他地方默認(rèn),create repository,添加成功在新的界面可以看到github給的信息:可以從這個(gè)倉庫克隆新的倉庫闸昨,也可以與已有的本地倉庫進(jìn)行關(guān)聯(lián),把本地倉庫的內(nèi)容push到github倉庫薄风。
我們在本地倉庫運(yùn)行如下命令:
git remote add origin git@github.com:github賬戶名/倉庫名.git
--> git對遠(yuǎn)程庫默認(rèn)的叫法--origin
下一步把本地內(nèi)容推送到遠(yuǎn)程:
git push -u origin master-->git push是把當(dāng)前分支master推送到遠(yuǎn)程零院。由于當(dāng)前遠(yuǎn)程是空的,第一次推送時(shí)加上了-u的參數(shù)村刨,git會把本地master和遠(yuǎn)程master關(guān)聯(lián)起來告抄,后續(xù)的推送和拉取就可以簡化命令。
git push origin master-->后續(xù)就可以通過這個(gè)命令從本地進(jìn)行提交
git push origin HEAD: 遠(yuǎn)程分支名 -->本地分支名和遠(yuǎn)程分支名不同的情況下用的命令(你必須在要push的本地分支上)
SSH警告:
第一次使用clone或者push命令連接github時(shí)會有警告嵌牺,
這是因?yàn)镾SH在第一次驗(yàn)證github服務(wù)器的key時(shí)打洼,需要確認(rèn)gtithub的key指紋信息是否為來自github服務(wù)器龄糊,輸入yes即可,然后github反饋給你一個(gè)把key添加到本機(jī)的信任列表里了的警告募疮,繼續(xù)yes(在輸入之前可以對照github的RAS key的指紋信息是否與SSH連接給出的一致)炫惩。
從遠(yuǎn)程克隆倉庫:在github創(chuàng)建一個(gè)新的倉庫,需要勾選Initialize this repository with a README阿浓,這樣github會自動創(chuàng)建一個(gè)README.md文件他嚷。
git clone git@github.com:github賬號名/工程名.git-->把倉庫克隆到本地
cd倉庫名-->把git庫的地址切換成自己的
ls -->查看本地存在的文件。(git支持多種協(xié)議芭毙,包括https(速度慢筋蓖,每次推送都必須輸入口令),ssh)
分支管理:
創(chuàng)建與合并分支--》HEAD指向master(當(dāng)前分支)退敦,master指向提交粘咖,
git checkout -b分支名-->創(chuàng)建一個(gè)新的分支,-b(branch)表示創(chuàng)建并切換侈百,相當(dāng)于兩條命令瓮下,
git branch -->會列出所有分支進(jìn)行查看,在當(dāng)前分支前加*钝域。
git checkout master-->回到master分支上
git merge要合并分支名-->用于合并指定分支到當(dāng)前分支
git branch -d分支名-->刪除分支
git branch -f指定分支名要移動到的分支--》把指定的分支名移動到要移動的分支去
git reset local^/ git reset HEAD~1--》都是撤回本地分支local到它的父部
git revert HEAD --》撤回遠(yuǎn)程分支最近提交的信息重新生成這個(gè)分支
git cherry-pick <commit1><commit2><...>--》如果你想將一些提交復(fù)制到你當(dāng)前HEAD位置下讽坏,這是很直接的推進(jìn)方式
git rebase -i HEAD~4 --》是指當(dāng)前分支位置并包含當(dāng)前位置往父部共4個(gè)位置進(jìn)行一個(gè)界面化交互的操作
git commit --amend --》提交修改,在當(dāng)前分支重新生成新的分支例证,棄用當(dāng)前的
git describr -->用來顯示里當(dāng)前分支最近的tag錨點(diǎn),可以被commit的位置路呜,沒有指定的話代表當(dāng)前位置輸出信息:離最近的tag_這個(gè)tag離有多少commit_g當(dāng)前id的前7位(v1_2_g3234rt5
git bisect一個(gè)找尋有bug的commit命令
git fetch從遠(yuǎn)端獲取本地倉庫未包含的提交數(shù)據(jù),即將本地對遠(yuǎn)端的映射做了同步更新
git pull == git fetch战虏;git merge在一起的效果
git pull --rebase是fetch和rebase的合用效果
git fakeTeamwork默認(rèn)行為是在遠(yuǎn)端master做一個(gè)提交
追蹤遠(yuǎn)端的兩種方法:
1拣宰,git checkout -b分支名origin/master --》創(chuàng)建一個(gè)跟蹤origin/master的新分支(不是master了)
2,git branch -u origin/master分支名
git push :git push origin master--》切到master分支烦感,抓取所有的提交推送到遠(yuǎn)端的master分支巡社,基本上用于同步兩倉庫(在分支上push后沒有參數(shù)命令是沒有效果的)
git push origin::git push origin foo^:master--》foo^指foo分支的父部,表示推送foo分支父部與遠(yuǎn)端master同步手趣,如果遠(yuǎn)端的master是branch分支晌该,實(shí)際是不存在的,git會在遠(yuǎn)端為你創(chuàng)建绿渣。
git fetch origin foo(分支名)--》在本地foo分支進(jìn)行遠(yuǎn)端同步
git fetch origin ::git fetch origin foo~1:bar --》表示本地bar分支同步到遠(yuǎn)端foo分支的父部朝群;和push相似,但是方向相反中符,push是推送姜胖,fetch是下載
另外有兩種不需要的情況,這是通過空參數(shù)實(shí)現(xiàn)的。
1属愤,git push origin :foo -->遠(yuǎn)端會刪除foo這個(gè)分支
2炬转,git fetch origin :foo --》本地會創(chuàng)建一個(gè)新的分支
^和~后不跟數(shù)字都是默認(rèn)父部鹦赎,跟數(shù)字,就從當(dāng)前開始到數(shù)字的那個(gè)父部
(gitbranch bugWork HEAD~^2~創(chuàng)建分支bugWork同時(shí)移動到指定位置)
解決沖突毁嗦,兩個(gè)分支同時(shí)更改了文件并都沒有更新提交后合并就會產(chǎn)生沖突告喊,這是我們打開文件會看到git標(biāo)記的沖突的地方闪檬,進(jìn)行修改后晨抡,把沖突標(biāo)記更改為已解決氛悬,然后在add提交合并。
git log --graph --pretty=oneline --abbrev-commit-->這個(gè)命令可以看到分支合并的情況
此時(shí)可以branch -d分支了耘柱。
分支管理:通常合并分支如捅,如果可能,git會用fast forward模式帆谍,但是這種模式下刪除分支伪朽,會丟掉分支信息轴咱。如果禁用fast forward模式汛蝙,git會在merge時(shí)生成新的commit,就可以從歷史看出分支信息
一個(gè)分支對文件進(jìn)行更改并提交朴肺,但是合并時(shí)我們用了這個(gè)命令
git merge --no-ff -m "描述"要合并來的分支名--> --no-ff表示禁用fast forward
此時(shí)對分支進(jìn)行刪除后
git log --graph --pretty=oneline --abbrev-commit
-->此時(shí)是可以看到分支的信息的
bug分支每個(gè)bug都可以通過一個(gè)新的臨時(shí)分支來修復(fù)窖剑,修復(fù)后合并分支,返回把臨時(shí)分支刪除戈稿。
git stash -->當(dāng)前分支的任務(wù)進(jìn)行到一半還不能提交西土,可以用此命令把當(dāng)前工作現(xiàn)場“儲藏”,等后續(xù)恢復(fù)現(xiàn)場后繼續(xù)工作鞍盗。此時(shí)可以在其他分支上創(chuàng)建臨時(shí)分支進(jìn)行bug修復(fù)需了。修復(fù)完成后,提交合并般甲,刪除臨時(shí)分支肋乍。
此時(shí)stash的那個(gè)分支,需要用到新的命令了
git stash list -->可以查看“儲藏”的分支敷存,現(xiàn)在需要恢復(fù)一下墓造,有兩種方法
1,git stash apply需要配合git stash drop來進(jìn)行刪除stash“儲藏”的信息內(nèi)容
2锚烦,git stash pop恢復(fù)的同時(shí)把stash內(nèi)容也刪除
如果多次stash時(shí)觅闽,恢復(fù)時(shí)先git stash list查看,用git stash apply stash@{第幾個(gè)(從0開始計(jì)數(shù))}feature分支開發(fā)一個(gè)新feature最好新建一個(gè)分支涮俄,如果要丟棄一個(gè)沒合并過的分支蛉拙,使用git branch -D分支
多人協(xié)作克隆時(shí)git自動把本地master和遠(yuǎn)程master對應(yīng)起來,遠(yuǎn)程倉庫默認(rèn)名稱origin
git remote -->查看遠(yuǎn)程倉庫信息
git remote -v -->顯示更詳細(xì)的信息
git push origin master -->推送master分支
多人協(xié)作的通常模式:
1彻亲,首先孕锄,可以試圖git push
origin分支名推送自己的修改
2室叉,推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新硫惕,需要先git pull更新合并本地代碼
3茧痕,如果合并有沖突,解決沖突并在本地提交
4恼除,沒有沖突或者已經(jīng)解決掉后踪旷,用git
push origin分支名推送就可以成功了
如果git pull提示“no tracking information”,說明本地分支與遠(yuǎn)程分支沒有創(chuàng)建鏈接豁辉,用命令git branch --set-upstream分支名origin/分支名創(chuàng)建鏈接(在本地創(chuàng)建和遠(yuǎn)程分支對應(yīng)的分支令野,git checkout -b分支名origin/分支名,名稱最好一致)徽级,如果有沖突要先處理沖突
標(biāo)簽管理:
標(biāo)簽和HEAD很像气破,但是不可以移動,是版本庫的一個(gè)快照餐抢,讓人更容易記住现使,更容易找的那個(gè)版本,標(biāo)簽只存在本地旷痕,不會自動推送到遠(yuǎn)程碳锈。
git tag標(biāo)簽信息-->打標(biāo)簽,默認(rèn)為HEAD欺抗,也可以指定一個(gè)commit id售碳。
git tag -->查看所有標(biāo)簽信息,標(biāo)簽信息不是按照時(shí)間順序绞呈,是按照字母順序的
git log --pretty=oneline --abbrev-commit -->找的歷史忘記需要打標(biāo)簽但是忘記打標(biāo)簽的commit id贸人。
git tag標(biāo)簽信息commit id -->對某個(gè)commit id打標(biāo)簽
git show標(biāo)簽信息-->查看這個(gè)標(biāo)簽對應(yīng)的版本信息,包括PGP簽名信息
git tag -a標(biāo)簽信息-m“標(biāo)簽說明”commit id --> -a指定標(biāo)簽名佃声,-m指定說明文字
git tag -s標(biāo)簽信息-m“標(biāo)簽說明”commit id -->可以通過-s用私鑰簽名一個(gè)標(biāo)簽
簽名采用PGP簽名艺智,所以要先安裝gpg(GnuPG),如果沒有或者沒有g(shù)pg密鑰對秉溉。會報(bào)錯(cuò)力惯,此時(shí)需要GnuPG文檔配置key。
git tag -d標(biāo)簽信息-->如果標(biāo)簽打錯(cuò)了召嘶,可以通過這個(gè)命令刪除
git push origin標(biāo)簽信息-->推送某個(gè)標(biāo)簽信息到遠(yuǎn)程
git push origin --tags -->一次性推送全部未推送到遠(yuǎn)程的本地標(biāo)簽
git push origin :refs/tags/標(biāo)簽信息-->刪除一個(gè)遠(yuǎn)程的標(biāo)簽父晶,先刪除本地標(biāo)簽后,繼續(xù)這個(gè)命令弄跌,可以登錄github查看是否已經(jīng)刪除
在github上如果你要修復(fù)別人的項(xiàng)目甲喝,點(diǎn)擊Fork,這是把這個(gè)項(xiàng)目克隆到你github的賬號下铛只,然后繼續(xù)克隆到本地倉庫電腦上埠胖,這時(shí)你就可以干活了糠溜,完畢后推送到自己的github,如果要推送到別人的項(xiàng)目直撤,你可以pull request非竿,至于接不接受就看別人的心情而定了。
另外谋竖,git config --global color.ui true -->使git適當(dāng)?shù)娘@示不同的顏色
忽略特殊文件:關(guān)于.gitignore文件红柱,github已經(jīng)準(zhǔn)備了各種配置文件,https://github.com/github/gitignore所有配置文件可以直接在線瀏覽蓖乘,當(dāng)然.gitignore文件是需要放到版本庫的锤悄,并且可以對.gitignore做版本管理
忽略的原則:
1,忽略操作系統(tǒng)自動生成的文件嘉抒,比如縮略圖
2零聚,忽略編譯生成的中間文件、可執(zhí)行文件等些侍,也就是說如果一個(gè)文件是通過另一個(gè)文件自動生成的隶症,那這個(gè)自動生成的文件就不用放進(jìn)版本庫,比如.class
3娩梨,忽略你自己的帶有敏感信息的配置文件沿腰,比如存放口令的配置文件
你要添加一個(gè)文件到git览徒,發(fā)現(xiàn)添加不了狈定,有一下兩個(gè)解決方法
git add -f文件名-->有可能是被.gitignore忽略了,可以用-f強(qiáng)制添加
git check-ignore -v文件名-->也有可能是.gitignore寫的有問題习蓬,需要找出寫錯(cuò)的這個(gè)規(guī)則纽什,可以用這個(gè)命令檢查
配置別名:這些命令單詞這么多真心不好記又容易寫錯(cuò),所以這時(shí)我們可以為這些命令換一個(gè)簡單的別名
git config --global alias.別名(st)命令(status)-->例如給status的別名是st躲叼,--golbal是全部參數(shù)芦缰,所以配置好就可以在這臺電腦的所以git倉庫下都有用,如果不加只對當(dāng)前倉庫有效
git config --global alias. unstage 'reset HEAD'-->撤銷修改的別名,git reset HEAD文件名--> git unstage文件名
git config --global alias. last 'log -1' -->顯示最后一次提交的信息的別名配置
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" -->這個(gè)配置出來的效果絢麗枫慷,是studio內(nèi)的version control內(nèi)的log的信息让蕾。
配置文件:首先配置文件是存放在.git/config文件中的。
cat .git/config -->出來的信息中[alias]的信息里是別名配置信息或听,要刪除別名探孝,直接把對應(yīng)的行刪掉即可
cat .gitconfig -->里面是[alias][user]的信息,配置別名可以直接修改這個(gè)文件誉裆,配置錯(cuò)了顿颅,可以刪掉文件重新通過命令配置
搭建git服務(wù)器:
需要一臺Linux的機(jī)器(推薦使用Ubuntu/Debian,這樣可以幾條apt命令就可以安裝完成)
假設(shè)你已經(jīng)有sudo權(quán)限的用戶賬號
1足丢,sudo apt-get install git --》安裝git
2粱腻,sudo adduser git --》創(chuàng)建git用戶庇配,用來運(yùn)行g(shù)it服務(wù)
3,創(chuàng)建證書登錄:收集所有要登錄的用戶公鑰(id_ras.pub文件)绍些,把所有公鑰導(dǎo)入到/home/git/.ssh/authorized_keys文件里捞慌,一行一個(gè)。
4柬批,sudo git init --baresample.git --》初始化git倉庫卿闹,假設(shè)是/srv/sample.git,在/srv目錄下輸入這行命令萝快,git會創(chuàng)建一個(gè)裸倉庫锻霎,裸倉庫是沒有工作區(qū)的,因?yàn)榉?wù)器上的git倉庫純粹是為了共享揪漩,所以不讓用戶登錄到服務(wù)器上去改工作區(qū)旋恼,并且服務(wù)器上的git倉庫通常是以.git結(jié)尾,sudo chown-R git:git sample.git --》把owner改為git
5奄容,禁用shell登錄:安全考慮冰更,第二步創(chuàng)建的git用戶不允許登錄shell,可以通過編輯/etc/passwd文件完成昂勒。git:x:1001:1001:,,,:/home/git:/bin/bash-->改為:git :x:1001:1001:,,,:/home/git:/usr/bin/git-shell蜀细,這樣git用戶可以正常通過ssh使用git,但是不能登錄shell戈盈,因?yàn)槲覀優(yōu)間it用戶指定的git-shell每次一登錄就自動退出
6奠衔,git clone git@server:/srv/sample.git --》通過命令克隆遠(yuǎn)程倉庫,在各自電腦上運(yùn)行當(dāng)團(tuán)隊(duì)人數(shù)很多時(shí)塘娶,公鑰就不能放在服務(wù)器的authorized_keys文件里這么玩了归斤,此時(shí)用Ditosis來管理公鑰。
像svn那樣控制權(quán)限刁岸,用Gitolite
國外友人制作的git
cheat sheet:https://pan.baidu.com/s/1kU5OCOB#list/path=%2F(Git Cheat Sheet)
git官方網(wǎng)站:http://git-scm.com
本次總結(jié)來源于廖雪峰博客脏里,網(wǎng)址:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
另外附贈一份練習(xí)git的小游戲:http://learngitbranching.js.org/