本篇文章給大家?guī)?lái)了關(guān)于git的基礎(chǔ)知識(shí)總結(jié)的相關(guān)知識(shí),其中包括git和github的簡(jiǎn)介以及遠(yuǎn)程倉(cāng)庫(kù)等相關(guān)問(wèn)題,希望對(duì)大家有幫助。
Git
在實(shí)際工作中,我們會(huì)遇到很多無(wú)法預(yù)料的問(wèn)題:
問(wèn)題一:頻繁改需求。例:
開(kāi)發(fā)功能A – V1
添加功能B – V2
在功能B上添加功能C – 重新寫(xiě)功能B,再添加功能C – V3
在功能B上添加功能D – 重新寫(xiě)功能B,再天添加功能D
項(xiàng)目開(kāi)發(fā)好以后,形成版本v1.0 需求改變: 在v1.0的基礎(chǔ)上添加功能A,形成版本v1.1 - 在上個(gè)版本的基礎(chǔ)上添加功能A 在v1.0的基礎(chǔ)上添加功能B,形成版本v1.2 - 在上個(gè)版本的基礎(chǔ)上刪除功能A,添加功能B 在v1.1的基礎(chǔ)上添加功能C,形成版本v1.3 - 在上個(gè)版本的基礎(chǔ)上刪除功能B,添加功能A,再添加功能C 在v1.2的基礎(chǔ)上添加功能D,形成版本v1.4 - 上個(gè)版本的基礎(chǔ)上刪除功能A,刪除功能C,添加功能B,添加功能D
git可以完美解決這個(gè)刪除添加的過(guò)程。因?yàn)間it可以將每個(gè)版本保存下來(lái),可以很輕松的將當(dāng)前版本切換到之前的某個(gè)版本。
問(wèn)題二:一不小心將文件刪除了,還需要重新寫(xiě)。
在公司寫(xiě)了一丟丟代碼,回了家,繼續(xù)開(kāi)發(fā),白天寫(xiě)的代碼沒(méi)有拷貝回來(lái)
使用git的話(huà),如果將某個(gè)文件刪除,形成新的版本,也可以很輕松的切換到之前的版本,將刪除的文件找回來(lái)。
問(wèn)題三:在當(dāng)前電腦開(kāi)發(fā)好的內(nèi)容,換了一臺(tái)電腦,發(fā)現(xiàn)代碼還需要重新寫(xiě)
使用git的話(huà),將每次寫(xiě)好的代碼,上傳到github網(wǎng)站,只要有網(wǎng)就能下載,相當(dāng)于備份
問(wèn)題四:工作中每個(gè)人寫(xiě)好的文件最后需要合并到一個(gè)大文件中,需要很繁瑣的復(fù)制粘貼
多人分工開(kāi)發(fā),最終需要將代碼合并起來(lái)
使用git可以很輕松的進(jìn)行文件合并
git和github簡(jiǎn)介
git:分布式版本控制工具。其實(shí)就是一個(gè)軟件,來(lái)管理文件夾使用的。需要通過(guò)命令操作。
github:世界級(jí)的開(kāi)源網(wǎng)站,存儲(chǔ)文件使用。使用者都是開(kāi)發(fā)者。文件可以選擇加密,只有自己能用,可以選擇開(kāi)源,所有人都能用。還可以和作者溝通。只接受git工具上傳。在這個(gè)網(wǎng)站上又很多別人寫(xiě)好的各種語(yǔ)言的代碼文件,如果有什么插件需要下載,可以在這個(gè)網(wǎng)站上搜索。
git可以管理本地文件,也可以管理gitgub的文件。
本地倉(cāng)庫(kù):在自己電腦上被 git 管理的文件夾
遠(yuǎn)程倉(cāng)庫(kù):在線(xiàn)上管理的文件夾
推送:將本地的內(nèi)容,上傳到遠(yuǎn)程
同步:將線(xiàn)上的內(nèi)容和本地內(nèi)容保持一致
專(zhuān)業(yè)術(shù)語(yǔ)
使用的是git bash here – 使用命令操作
倉(cāng)庫(kù):是用來(lái)存儲(chǔ)代碼的一個(gè)文件夾,這個(gè)文件夾被git工具所管理
本地倉(cāng)庫(kù):本地計(jì)算上被git管理的文件夾
遠(yuǎn)程倉(cāng)庫(kù):遠(yuǎn)程服務(wù)器上被git管理的文件夾
推送:將本地倉(cāng)庫(kù)中的內(nèi)容上傳到遠(yuǎn)程倉(cāng)庫(kù) – push
拉取(同步):將遠(yuǎn)程倉(cāng)庫(kù)的內(nèi)容下載到本地一份 – 讓本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)保持一致
像百度網(wǎng)盤(pán) – 但是只能存儲(chǔ)代碼文件
像百度貼吧 – 可以進(jìn)行交友、互粉、點(diǎn)贊…
github.com – 全球最大的同性交友網(wǎng)站 – 國(guó)外
本地使用git
下載安裝,檢測(cè)是否安裝成功:
git --version
或者點(diǎn)擊鼠標(biāo)右鍵出現(xiàn)下圖也可以
git安裝成功的標(biāo)志 |
---|
![]() |
查看文件
dir
首先要在被管理的文件夾中進(jìn)行初始化,才能在這個(gè)文件夾中使用git命令管理:
git init
執(zhí)行結(jié)束后,在文件夾中會(huì)生成一個(gè) 隱藏文件夾 .git;標(biāo)志著這個(gè)文件夾成為了git倉(cāng)庫(kù)
初始化后,會(huì)出現(xiàn)一個(gè)隱藏的文件夾.git
,此時(shí)代表當(dāng)前這個(gè)文件夾及其以下內(nèi)容都被git管理了。git管理文件夾的時(shí)候?qū)⒐芾磉^(guò)程分為3個(gè)區(qū)域:
-
工作區(qū):自己寫(xiě)的源文件
工作區(qū)示意圖 -
暫存區(qū):將要保存的文件,暫時(shí)存在暫存區(qū)
暫存區(qū)示意圖 - 歷史區(qū):生成一個(gè)版本,只能將暫存區(qū)的內(nèi)容生成版本。上傳的時(shí)候只能上傳歷史區(qū)的內(nèi)容
將源文件添加到暫存區(qū):
git add 文件 # 將單獨(dú)一個(gè)文件添加到暫存區(qū) git add 文件夾/ # 將整個(gè)文件夾添加到暫存區(qū)(git不管理空文件夾) git add --all # 將當(dāng)前文件夾中所有文件和文件夾都添加到暫存區(qū) - 簡(jiǎn)寫(xiě):git add .
查看git管理的文件的狀態(tài):
git status
將暫存區(qū)的文件拉回到源文件:
git reset HEAD -- 文件 # 將某個(gè)文件從暫存區(qū)變?yōu)樵次募?git reset HEAD -- 文件夾/ # 將整個(gè)文件夾從暫存區(qū)變?yōu)樵次募?git reset HEAD -- . # 將所有文件從暫存區(qū)變?yōu)樵次募?/pre>
將暫存區(qū)的內(nèi)容生成歷史版本:
git commit -m "版本說(shuō)明"
working tree clean 工作區(qū)是干凈的 轉(zhuǎn)移歷史區(qū)成功!
當(dāng)將所有暫存區(qū)的內(nèi)容放到歷史區(qū)的時(shí)候,工作區(qū)就是趕干凈 working tree clean
注意事項(xiàng):
不能單獨(dú)將某一個(gè)文件放到歷史區(qū),一次性會(huì)將所有暫存區(qū)的內(nèi)容放到歷史區(qū)
只能將暫存區(qū)的內(nèi)容放到歷史區(qū),不能跨步驟(將工作區(qū)的內(nèi)容放到歷史)操作初次需要設(shè)置自己的郵箱和姓名 輸入以下指令 所以解決方法是當(dāng)出現(xiàn)這個(gè)上述提示后 接著補(bǔ)充 你在命令行中執(zhí)行 git config --global user.email "你的郵箱" git config --global user.name "你的名字" (注意 “ 前面是有空格的) 輸入完后再接著執(zhí)行g(shù)it commit 即可成功! 查看所有版本信息:
git log查看版本信息:
版本信息示意圖 |
---|
![]() |
回到指定版本:
git reset --hard HEAD^ # 有幾個(gè)上檔鍵就回退幾個(gè)版本git reset --hard 歷史版本號(hào)
刪除歷史版本:
git rebase -i 指定的歷史版本
刪除歷史版本的坑:
1.刪除的時(shí)候不能指定要?jiǎng)h除的版本,需要指定要?jiǎng)h除的版本之前的版本
2.刪除命令執(zhí)行后,會(huì)打開(kāi)一個(gè)文件, :wq 敲回車(chē),需要將其中的pick改成drop才能刪除成功
3. 打開(kāi)這個(gè)文件以后,是無(wú)法進(jìn)行輸入的,需要按 i a s 進(jìn)入到插入模式
4. 就可以將單詞進(jìn)行修改,保存并退出,按 esc 退出了插入模式,再按 :wq 保存并退出的意思
兩個(gè)特殊文件
git在進(jìn)行管理文件夾的時(shí)候,不能管理空文件夾,為了避免誤會(huì)產(chǎn)生,讓空文件夾被管理,git提供了一個(gè)專(zhuān)業(yè)的管理空文件夾的文件 – 名字是固定的:.gitkeep – 將這個(gè)文件放到被管理的空文件夾 – 此時(shí)的空文件夾被管理了
如果某些文件或文件夾不希望被git管理,就可以設(shè)置一個(gè)黑名單,讓這個(gè)文件或文件夾被忽略掉,此時(shí)git提供了一個(gè)文件叫 .gitignore 這個(gè)文件就可以設(shè)置黑名單 將需要被忽略掉的文件的路徑寫(xiě)在這個(gè)文件中<
讓git能管理一個(gè)空文件夾:
在空文件夾中新建文件:.gitkeep
,這個(gè)文件沒(méi)有實(shí)際意義,這是為了占位,讓空文件夾能被管理的標(biāo)識(shí),以后要在文件夾中寫(xiě)文件的時(shí)候,這個(gè)文件可以被刪除
讓某些文件或者文件夾被忽略管理:
在和.git
同級(jí)的位置,新建文件:.gitignore
,在這個(gè)文件中書(shū)寫(xiě)要忽略的內(nèi)容:
直接寫(xiě)文件名,代表要忽略的是哪個(gè)文件 寫(xiě)文件夾路徑,表示要忽略的是哪個(gè)文件夾 *.后綴,表示要忽略的是所有后綴為指定后綴的文件
遠(yuǎn)程操作
創(chuàng)建倉(cāng)庫(kù)的時(shí)候,可以選擇初始化,也可以選擇不初始化
不初始化
在本地創(chuàng)建倉(cāng)庫(kù),放到暫存區(qū),形成歷史區(qū)
讓本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)之間建立連接
git remote add origin https://gitee.com/web_wang_wu/good-man.git
origin是一個(gè)變量,可以自定義
將本地倉(cāng)庫(kù)的內(nèi)容上傳到遠(yuǎn)程倉(cāng)庫(kù):
git push -u origin master
需要輸入賬號(hào)密碼:注冊(cè)使用的郵箱以及密碼
當(dāng)下次再次上傳的時(shí)候,就不需要輸入賬號(hào)密碼了,因?yàn)閣indows已經(jīng)將這次輸入的賬號(hào)密碼保存起來(lái)了
賬號(hào)密碼存儲(chǔ)在計(jì)算機(jī)的 “憑據(jù)管理器” 中 ,可以刪除
并且我們下次上傳的時(shí)候,只需要執(zhí)行命令:
git push
選擇初始化
相當(dāng)于遠(yuǎn)程倉(cāng)庫(kù)中已經(jīng)有內(nèi)容了
首先,必須先將這個(gè)倉(cāng)庫(kù)給本地克隆一份
git clone 遠(yuǎn)程倉(cāng)庫(kù)地址 // 遠(yuǎn)程倉(cāng)庫(kù)地址后,有一個(gè)可選項(xiàng),代表克隆到本地的文件夾名稱(chēng)
就在這個(gè)文件夾中,進(jìn)行本地操作,要上傳到遠(yuǎn)程
git push
如果我們希望使用一下別人倉(cāng)庫(kù)中的代碼,就克隆下來(lái)
我已經(jīng)有過(guò)上傳的代碼了,我想修改代碼,但是本地倉(cāng)庫(kù)不見(jiàn)了
項(xiàng)目經(jīng)理做好一個(gè)項(xiàng)目的倉(cāng)庫(kù),我需要根據(jù)這個(gè)倉(cāng)庫(kù)中已知的文件進(jìn)行二次開(kāi)發(fā)
遠(yuǎn)程倉(cāng)庫(kù)
上傳到遠(yuǎn)程倉(cāng)庫(kù):
在github上新建倉(cāng)庫(kù):
使用https上傳:
添加上傳地址:
git remote add origin https://github.com/weberWangjie/test.git # 其中的origin是變量名表示上傳地址,可以自定義
開(kāi)始上傳:
git push -u origin master # 其中的origin是表示地址的那個(gè)變量名
首次推送遠(yuǎn)程需要輸入用戶(hù)名和密碼。
第二次上傳的時(shí)候只需要:git push
將遠(yuǎn)程代碼拉取到本地:(要先新建一個(gè)文件夾作為git管理的文件夾)
git clone 遠(yuǎn)程倉(cāng)庫(kù)地址
將本地代碼和遠(yuǎn)程代碼同步:(在本地倉(cāng)庫(kù)使用命令)
git pull
分支
一個(gè)大項(xiàng)目,會(huì)分很多人開(kāi)發(fā),每個(gè)人一個(gè)功能,這時(shí)候,每個(gè)功能作為一個(gè)分支,主分支只有目錄結(jié)構(gòu)。當(dāng)所有人將自己負(fù)責(zé)的功能開(kāi)發(fā)完成的時(shí)候,再將所有分支合并到主分支上,形成一個(gè)完整的項(xiàng)目。
每次初始化一個(gè)git的時(shí)候,默認(rèn)創(chuàng)建一個(gè)主要分支:master
創(chuàng)建分支:
git branch 分支名
查看當(dāng)前分支:
git branch
切換分支:
git checkout 分支名
創(chuàng)建并切換到這個(gè)分支:
git checkout -b 新分支名
合并分支:(將別的分支合并到自己分支)
git merge 要合并的分支
刪除分支:(不能自己刪自己)
git branch -D 要?jiǎng)h除的分支
沖突
在項(xiàng)目開(kāi)發(fā)階段,有兩個(gè)人同時(shí)操作一個(gè)倉(cāng)庫(kù),最終總會(huì)有一個(gè)人先上傳, 一個(gè)人后上傳,先上傳的能成功,后上傳的不能成功
因?yàn)?,git遠(yuǎn)程倉(cāng)庫(kù)中,任何一個(gè)版本的形成,都需要從上一個(gè)版本 作為基礎(chǔ) 再形成新的版本
如果推送不成功,就需要在本地先有遠(yuǎn)程的版本2,然后再形成版本3,推送才能成功
同步/拉取
git pull // 讓本地先跟遠(yuǎn)程保持一致,然后再次推送新版本
遠(yuǎn)程倉(cāng)庫(kù)中,任何一個(gè)新版本,都必須是基于上一個(gè)版本形成的,跳版本形成:李四 – 1~3 必須是2~3
同步:
在本地新建一個(gè)跟遠(yuǎn)程分支同名的分支名,本地切換過(guò)去,git pull
失敗,提示命令:
git branch –set-upstream-to=origin/遠(yuǎn)程的分支名 本地的分支名
繼續(xù)git pull
提交:
在本地新建了分支,希望推送到遠(yuǎn)程倉(cāng)庫(kù),失敗,提示命令:
git push –set-upstream origin 遠(yuǎn)程的分支名
git add .
git commit -m “版本描述” # 為了避免代碼丟失,一定要寫(xiě)完以后 commit一下
git push
git pull
git clone 遠(yuǎn)程倉(cāng)庫(kù)地址
遠(yuǎn)程分支操作 – 給別人提交
兩個(gè)人同時(shí)操作同一個(gè)分支,提交的時(shí)候會(huì)有先后順序,先提交的人正常提交了,后一個(gè)人提交的時(shí)候會(huì)產(chǎn)生沖突。因?yàn)間it規(guī)定,每次提交必須是在原來(lái)的版本基礎(chǔ)上,但是第二個(gè)人在提交的時(shí)候,在遠(yuǎn)程已經(jīng)有了第二個(gè)版本,所以第二個(gè)人相當(dāng)于從第一個(gè)版本向第三個(gè)版本提交。如下圖:
git沖突示意圖 |
---|
![]() |
![]() |
沖突解決:
-
使用命令讓本地和遠(yuǎn)程同步:
git pull
然后手動(dòng)解決文件沖突
-
開(kāi)辟新的分支,然后進(jìn)行分支合并
git fetch origin master:tmp # 使用 fetch 獲取遠(yuǎn)程最新信息并開(kāi)辟一個(gè)臨時(shí)分支 git diff tmp # 將當(dāng)前分支和遠(yuǎn)程分支進(jìn)行對(duì)比 git merge tmp # 將臨時(shí)分支合并到當(dāng)前分支
歷史版本回滾的沖突
本地先形成版本1
本地再形成版本2
上傳到遠(yuǎn)程
本地回滾到版本1
再次形成版本1·2
再次上傳
報(bào)錯(cuò)
因?yàn)檫h(yuǎn)程倉(cāng)庫(kù)只有一條時(shí)間線(xiàn),但本地有兩條,解決:
先拉取,解決沖突問(wèn)題
再次上傳
分支遠(yuǎn)程操作
默認(rèn)不能提交其他分支,因?yàn)?,遠(yuǎn)程默認(rèn)提交為master分支。
如果非要提交其他分支:
git --set-upstream push origin 分支名 # 將以前記錄的-u默認(rèn)的master改為新的分支名 git push origin 分支名 # 臨時(shí)提交,不改默認(rèn)的master
本地跟遠(yuǎn)程倉(cāng)庫(kù)進(jìn)行除了master分支之外的分支,進(jìn)行推送、同步,多執(zhí)行一個(gè)命令,報(bào)錯(cuò)提示的命令。
刪除遠(yuǎn)程分支:
git push origin --delete 將要?jiǎng)h除的分支名
github服務(wù)器分支
github上一個(gè)特殊的分支:gh-pages
只要有這個(gè)分支,就可以將這個(gè)分支中的代碼作為一個(gè)服務(wù)器打開(kāi)其中的文件。默認(rèn)打開(kāi)index.html文件,其他名稱(chēng)的文件需要手動(dòng)輸入。
有了這個(gè)分支之后,就可以在這個(gè)倉(cāng)庫(kù)的setting中,找到打開(kāi)這個(gè)分支中文件的服務(wù)器鏈接。
分支命名規(guī)范
master是主分支,創(chuàng)建倉(cāng)庫(kù)的時(shí)候默認(rèn)生成。不接收任何上傳,只接收dev分支合并的內(nèi)容,這個(gè)分支只存儲(chǔ)每一次開(kāi)發(fā)過(guò)程中經(jīng)過(guò)測(cè)試合格的代碼。
dev是開(kāi)發(fā)主分支,也可以說(shuō)development/deve,初始化項(xiàng)目后,從master分支上開(kāi)辟的新分支。這個(gè)分支也不接受任何代碼提交,只接收主功能分支合并的內(nèi)容。當(dāng)dev分支上的代碼測(cè)試通過(guò)以后,會(huì)被合并到主分支上。
feature-XXX是主功能分支,是從dev分支上開(kāi)辟出的分支,進(jìn)行各個(gè)功能的開(kāi)發(fā),開(kāi)發(fā)完成后合并到dev分支上進(jìn)行測(cè)試,這些分支接收開(kāi)發(fā)的代碼提交。
feature-XXX-fix-XXX是功能bug解決分支,在項(xiàng)目運(yùn)行過(guò)程中,出現(xiàn)的bug進(jìn)行修復(fù),是從功能分支上開(kāi)辟出來(lái)的,修改完畢后合并到功能分支上,再由功能分支合并到dev分支上。
hot-fix-XXX是緊急bug修復(fù)分支,直接從master上開(kāi)辟,修復(fù)緊急bug后,直接合并到master分支上。
SSH提交配置秘鑰
github上傳除了使用https協(xié)議上傳,也可以使用ssh協(xié)議來(lái)上傳。ssh上傳需要配置公鑰和秘鑰,公鑰和秘鑰是配置在自己計(jì)算機(jī)上的,所以使用了ssh之后,只能在當(dāng)前計(jì)算機(jī)使用了,不像https上傳,在任何電腦上都能上傳。
但是ssh上傳需要配合秘鑰。
秘鑰配置:
ssh-keygen -t rsa -C "git全局郵箱"# 敲3次回車(chē)
查看git全局配置:
git config --list
秘鑰所在文件夾:C:UsersAdmin.ssh
上面的秘鑰,下面后綴為pub的是公鑰,需要將公鑰配置在github賬號(hào)中。
打開(kāi)之后,title項(xiàng)中自定義,key中將公鑰文件中的所有內(nèi)容復(fù)制過(guò)來(lái)。
點(diǎn)擊添加按鈕后,需要輸入密碼驗(yàn)證。
此時(shí)就將ssh配置好了,后面就可以使用ssh協(xié)議進(jìn)行操作了。
以后就可以使用這個(gè)地址進(jìn)行克隆和上傳了。
推薦學(xué)習(xí):《Git教程》