因?yàn)樵陂_發(fā)過(guò)程中使用的是sourceTree這種git圖形化界面管理工具,導(dǎo)致git命令每隔一段時(shí)間就會(huì)有點(diǎn)生疏尚骄。那么就有了這片寫作的動(dòng)機(jī),試圖通過(guò)這樣一篇文章的總結(jié),讓我們從git的第一次安裝度秘,到熟練操作git的命令,都能在此得到體現(xiàn)饵撑。
一:安裝git之后的配置
當(dāng)我們下載安裝好git之后剑梳,第一步就是為git設(shè)置好用戶名和郵箱,這個(gè)用戶名和郵箱會(huì)在提交的日志中顯示滑潘,如果項(xiàng)目公開了垢乙,那么在github中也可以查看到。設(shè)置成功之后的信息保存在~/.gitconfig這個(gè)文件中语卤。
git config --global user.name "xiaguangcheng"
git config --global user.email "xiaguangcheng@163.com"
git config --global color.ui auto
上面的最后一行命令將命令行的輸出顯示為自動(dòng)顏色追逮,這樣方便我們閱讀。設(shè)置完之后粹舵,我們就可以查看設(shè)置效果:
sublime ~/.gitconfig
由于我對(duì)sublime設(shè)置了別名钮孵,因此可以直接打開sublime編輯器查看。效果如下:
[user]
name = xiaguangcheng
email = xiaguangcheng@163.com
[color]
ui = auto
二:git本地倉(cāng)庫(kù)與git遠(yuǎn)程倉(cāng)庫(kù)(github)之間的鏈接
github是用git來(lái)管理的倉(cāng)庫(kù)眼滤,本地與遠(yuǎn)程的連接是通過(guò)SSH公鑰和私鑰來(lái)完成的巴席。那么如何獲取本地電腦的公鑰和私鑰呢?
ssh-keygen -t rsa -C "xiaguangcheng@163.com"
然后一路回車诅需,如果沒(méi)有錯(cuò)誤提示漾唉,就表示生成成功了荧库。生成的文件保存在~/.ssh這個(gè)隱藏文件夾下,我們打開這個(gè)文件夾會(huì)有以下三個(gè)文件:
id_rsa
id_rsa.pub
known_hosts
而我們需要的公鑰就保存在id_rsa.pub中赵刑。我們可以在github的setting中的 SSH Keys中分衫,任意建立一個(gè)title當(dāng)作公鑰的名稱,然后復(fù)制這個(gè)id_rsa.pub文件中的內(nèi)容般此,到這輸入框中蚪战。
然后我們就可以通過(guò)在本地電腦中測(cè)試是否能夠與github連接了
ssh -T git@github.com
三:在github中創(chuàng)建新倉(cāng)庫(kù)
在github中create一個(gè)新的倉(cāng)庫(kù)的時(shí)候,會(huì)有一個(gè)initialize this repository with a README選項(xiàng)铐懊,我們不建議勾選邀桑。因?yàn)橐坏┕催x了,那么這個(gè)倉(cāng)庫(kù)就有內(nèi)容了居扒,就失去了原初面目概漱,這樣的話,如果本地已經(jīng)有了一個(gè)git項(xiàng)目喜喂,想要提交到這里瓤摧,就需要先拉取再提交,而不能直接提交了玉吁。
四:clone遠(yuǎn)程倉(cāng)庫(kù)到本地
git clone url
當(dāng)我們clone倉(cāng)庫(kù)到本地后照弥,可以在倉(cāng)庫(kù)中新建一個(gè)文件并修改。然后使用
git status
查看本地倉(cāng)庫(kù)的狀態(tài)进副。通過(guò)
git add name.txt
添加name.txt 到暫存區(qū)这揣。通過(guò)
git commit -m "add file"
將暫存區(qū)里面的文件統(tǒng)一提交到本地倉(cāng)庫(kù)。再通過(guò)
git push
就可以將本地倉(cāng)庫(kù)推送到遠(yuǎn)程倉(cāng)庫(kù)了影斑。
五:git詳細(xì)操作
前面講解了在先有g(shù)ithub的倉(cāng)庫(kù)给赞,然后克隆到本地進(jìn)行修改推送的操作。接下來(lái)我們看看先有本地倉(cāng)庫(kù)矫户,然后再連接本地和遠(yuǎn)程倉(cāng)庫(kù)片迅,推送到遠(yuǎn)程倉(cāng)庫(kù)的情況。
(一):創(chuàng)建一個(gè)本地倉(cāng)庫(kù)
mkdir gitTest
cd gitTest
git init
這樣就創(chuàng)建了一個(gè)本地文件夾皆辽,并且在里面進(jìn)行了初始化柑蛇。
(二):添加一個(gè)本地文件
touch test.txt
echo "first" >> test.txt
cat test.txt //我們可以查看test.txt里面的內(nèi)容
到這里,我們創(chuàng)建了一個(gè)test.txt的文件驱闷,并且在里面添加了一個(gè)first字符串耻台。此時(shí)我們可以通過(guò)命令查看當(dāng)前倉(cāng)庫(kù)的情況
git status
這要得益于我們之前配置的color.ui auto 因此我們可以看到一個(gè)紅色的標(biāo)志,上面的文字說(shuō)明了這個(gè)文件沒(méi)有被track空另,也就是這個(gè)文件獨(dú)立于這個(gè)倉(cāng)庫(kù)盆耽,并沒(méi)有被git管理到,那么我們經(jīng)過(guò)以下幾個(gè)操作,就可以讓這個(gè)文件處在git的管理中了征字。
git add test.txt
git commit -m "add first"
git status
如圖所示都弹,我們已經(jīng)將一個(gè)文件添加到git版本控制了娇豫。
(三):修改文件并查看修改前后差別,然后提交匙姜。
echo "second" >> test.txt
echo "thrid" >> test.txt
git status
git diff
這個(gè)時(shí)候,我們就可以提交了冯痢。但是我們要養(yǎng)成一個(gè)習(xí)慣氮昧,當(dāng)我們把修改的文件添加到暫存區(qū)之后,準(zhǔn)備commit的時(shí)候浦楣,最好先通過(guò)git diff HEAD來(lái)查看上次提交袖肥,和正準(zhǔn)備提交的這次,兩者之間的差別振劳。這里的HEAD是本分支的最后一次提交的指針椎组。當(dāng)我們看完之后,才提交就比較安全了历恐。
我們可以通過(guò)下面這個(gè)命令寸癌,查看屬于這個(gè)文件的相關(guān)日志
git log test.txt
(四):操作分支
git的強(qiáng)大之處表現(xiàn)之一就是分支。比如此時(shí)我們使用
git branch
就會(huì)顯示一個(gè)黃綠色的master弱贼。表明我們身在master分支中蒸苇。如果我們想以master分支創(chuàng)建新分支
git checkout -b develop
此時(shí)我們就身在develop分支中了。實(shí)際上上面的命令等同于下面的兩條命令
git branch develop
git checkout develop
俗話說(shuō)花開兩朵吮旅,暫表一枝溪烤。咱們先不管master分支,先來(lái)培育新建的這個(gè)develop分支庇勃。下面我們打算修改test.txt檬嘀,將里面的second修改為forth,然后在提交之前责嚷,先通過(guò)git diff Head查看和最近一次提交的差別鸳兽,然后提交。
(五):切換分支
上面我們已經(jīng)在develop分支中把代碼修改完了再层,此時(shí)我們可以使用命令來(lái)切換分支贸铜,看看master分支有沒(méi)有受到我們?cè)赿evelop分支上進(jìn)行改動(dòng)的影響。
git checkout master
正如大家所見(jiàn)聂受,剛剛我們?cè)赿evelop分支中蒿秦,將second修改為了forth,但是在master分支中蛋济,second依然為second棍鳖。
(六):合并分支
現(xiàn)在我們打算將在develop中的修改,應(yīng)用到master分支上,可以如下操作渡处,記住我們像把a(bǔ)分支合并到b分支上镜悉,我們需要把代碼切換到b分支上,如果不放心是否在b分支上医瘫,可以先git branch一下看看侣肄。在merge的過(guò)程中,會(huì)彈出編輯框醇份,這個(gè)編輯框是vi模式稼锅,需要懂得vi快捷鍵才能進(jìn)行編輯。
git branch
git merge --no-ff develop
git log
合并完成之后僚纷,我們也可以通過(guò)另外一個(gè)命令查看日志
git log --graph
(七):回溯分支
從上面的圖中矩距,我們可以看到當(dāng)前我們?cè)趍aster分支中,并且在中間又創(chuàng)建了一個(gè)新的develop分支怖竭。并且在develop分支中對(duì)test.txt進(jìn)行了修改锥债,然后又合并到了master分支中。那么我們現(xiàn)在就是要回溯分支痊臭。通過(guò)命令在master分支還沒(méi)有創(chuàng)建develop分支的時(shí)候哮肚,創(chuàng)建一個(gè)online分支,然后修改online分支并提交趣兄,再切回到master分支合并develop分支之后的狀態(tài)绽左,然后再合并online分支。這樣聽起來(lái)有一點(diǎn)yesterday once more的感覺(jué)艇潭。
我們要回溯分支拼窥,需要一個(gè)時(shí)間點(diǎn)的hash值,這個(gè)hash值可以通過(guò)git log來(lái)獲得蹋凝。通過(guò)上圖我們可以看出我們實(shí)際上是想回到2a95a4...這個(gè)節(jié)點(diǎn)鲁纠,現(xiàn)在我們?cè)趍aster分支上
git reset --hard 2a95a4
通過(guò)上圖的幾個(gè)命令操作,我們發(fā)現(xiàn)此時(shí)的master分支上的test.txt內(nèi)容鳍寂,已經(jīng)沒(méi)有了被之前develop修改的痕跡了改含,之前develop修改了second為forth,但是此時(shí)這個(gè)forth就不存在了迄汛。
這是我們就可以創(chuàng)建一個(gè)新的分支online捍壤,然后在online分支上,對(duì)這個(gè)test.txt進(jìn)行操作了鞍爱。
上面操作的命令鹃觉,就不用具體講解了,我們最后看到在online分支上的test.txt中的second這個(gè)字符串睹逃,被我們修改為了online這個(gè)字符串盗扇。接著我們就提交了這次修改。提交修改后,我們需要切換回master分支疗隶,準(zhǔn)備再次回到master與develop合并的那個(gè)節(jié)點(diǎn)佑笋。此時(shí)的git log命令只能查詢當(dāng)前節(jié)點(diǎn)之前的日志,但是當(dāng)前節(jié)點(diǎn)是在master與develop合并之前斑鼻,所以要查看所有的節(jié)點(diǎn)蒋纬,我們需要引入新的命令
git reflog
此時(shí)我們?cè)偈褂妹钋袚Q,將master分支切換到其與develop 分支合并的地方
git reset --hard 8441ba2
通過(guò)log卵沉,我們也可以看出颠锉,我們已經(jīng)將當(dāng)前節(jié)點(diǎn)切換到了講develop合并到master上的地方法牲。其中git log --pretty=short表示我們查看精簡(jiǎn)版的日志史汗,也就是每條日志不看提交日期。
接下來(lái)我們?cè)賮?lái)將online分支合并到master分支上拒垃。
這是我們看到命令提示CONFLICT停撞。表示合并出現(xiàn)來(lái)沖突,我們通過(guò)sublime打開這個(gè)test.txt文件查看沖突悼瓮,結(jié)果如圖所示戈毒。
分析如下:在master分支與online分支合并之前,master分支上的test.txt中的second字符串已經(jīng)被develop字符串修改為forth横堡,但是現(xiàn)在online分支又將之前的second修改為online埋市,所以系統(tǒng)不知道這二者之間到底要保存哪一個(gè)?因此出現(xiàn)來(lái)沖突命贴。這是需要我們自己手動(dòng)解決沖突道宅,我們可以保留forth,也可以保留online胸蛛,也可以兩者都保留污茵,或者兩者都不保留。這里我們就保留online吧葬项。
記得將git的沖突標(biāo)志以及不需要的代碼刪除泞当,結(jié)果如下
然后我們提交修改之后的內(nèi)容,并查看結(jié)果
(八):修改提交信息
我們通過(guò)git log --graph 查看日志民珍,發(fā)現(xiàn)上次提交叫做“conflict”不太合適襟士,于是我們想要補(bǔ)充這次提交的日志。我們可以使用新命令
git commit --amend
(九):修改日志
修改提交日志可以使用git rebase 命令嚷量,比如我們要將一個(gè)變量換一個(gè)名字等陋桂。
如圖所示,我們這里產(chǎn)生了兩次提交津肛,第一次提交添加了一個(gè)develop章喉,第二次提交修改develop為develop_b,下面我們通過(guò)命令將這兩個(gè)提交進(jìn)行合并
git rebase -i HEAD~2
此時(shí)會(huì)彈出一個(gè)編輯框,我們把編輯框里面的需要修改的日志前面的pick改成fixup即可秸脱,保存退出編輯框落包。我們通過(guò)命令查看
但是如果我們使用git reflog查看的話,我們的修改動(dòng)作摊唇,一目了然
六:推送本地倉(cāng)庫(kù)到遠(yuǎn)程
我們推送本地倉(cāng)庫(kù)到遠(yuǎn)程咐蝇,首先需要確保有本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)。遠(yuǎn)程倉(cāng)庫(kù)作為一個(gè)剛剛初始化的倉(cāng)庫(kù)巷查,最好不要?jiǎng)?chuàng)建任何東西在里面有序,連README.md最好也不要有。那么我們就可以通過(guò)下面的命令將遠(yuǎn)程倉(cāng)庫(kù)設(shè)置為本地倉(cāng)庫(kù)的遠(yuǎn)程倉(cāng)庫(kù)
git remote add origin git@github.com:xiaguangcheng/gitTest.git
現(xiàn)在我們回到master分支岛请,通過(guò)命令
git push -u origin master
開始推送本地倉(cāng)庫(kù)旭寿。
如果我們想推送其他分支
git check out develop
git push -u origin develop
這樣就可以了。然后我們可以通過(guò)命令查看是否是否推送成功
git branch -a
如果我們想從遠(yuǎn)程檢出新分支崇败,那么我們可以
git checkout -b develop_c origin/develop_c
這個(gè)命令表示盅称,我們從遠(yuǎn)程檢出一個(gè)名為develop_c的分支,并且保存在本地倉(cāng)庫(kù)后室,同時(shí)也命名為develop_c缩膝。
記住,我們?cè)谀膫€(gè)分支上使用
git push
就會(huì)推送本分支到本分支遠(yuǎn)程的分支上岸霹。git pull 和git push同理疾层。