原文出自:https://www.pandashen.com
什么是 Git?
Git 是一個(gè)免費(fèi)的開源分布式版本控制系統(tǒng)芋齿,它的設(shè)計(jì)目的是為了速度和效率的處理從小型到大型的項(xiàng)目啸如;Git 可以幫我們管理我們的代碼侍匙,記錄歷史,只要代碼提交到 Git 上就永久不會(huì)丟失叮雳,可以隨時(shí) “穿越”(回到之前的某一個(gè)版本)想暗;可以多端共享,團(tuán)隊(duì)協(xié)作中帘不,多個(gè)人操作了同一個(gè)文件時(shí)说莫,可以實(shí)現(xiàn)自動(dòng)合并(模塊化,組件化)寞焙、標(biāo)記沖突储狭,擁有強(qiáng)大的分支管理系統(tǒng)。
Git 與 SVN 的區(qū)別
SVN:集中式捣郊,需要一臺(tái)中央服務(wù)器辽狈,所有代碼的拉取和提交都是在中央服務(wù)器,一旦中央服務(wù)器或者網(wǎng)絡(luò)出現(xiàn)故障呛牲,則不能拉取和提交代碼刮萌,需要不斷去備份中央服務(wù)器,防止代碼丟失娘扩。
Git:分布式着茸,有一個(gè)中央服務(wù)器的同時(shí)壮锻,每個(gè)開發(fā)者本地都有自己的本地倉庫,擁有完整的版本庫元扔,不用擔(dān)心代碼丟失躯保,Git 存儲(chǔ)的是代碼變化的快照,更新代碼的速度要比 SVN 更快澎语。
Git 安裝
Windows
Mac
- 如果安裝過 Xcode 自帶 Git途事,<a>https://developer.apple.com/xcode/</a>
- 可以安裝 Homebrew,是 wmac 的包管理器擅羞,<a>https://brew.sh/</a>尸变,下面是兩款界面美化插件:
- Oh My ZSH:<a>http://ohmyz.sh/</a>
- iTerm2:<a>https://www.iterm2.com/</a>
Linux 命令
1、打印工作目錄
pwd
2减俏、創(chuàng)建文件夾
mkdir 文件夾名
3召烂、改變路徑
進(jìn)入盤符:
cd d:
進(jìn)入文件夾:
cd 文件夾名
回上一級目錄:
cd ..
進(jìn)入某一個(gè)路徑:
cd 路徑
想要進(jìn)入某一個(gè)不知道路徑的文件夾中,可以直接拖拽該文件到命令窗口娃承,會(huì)自動(dòng)識別路徑奏夫。
4、查看文件列表
ls
ls -al
下面命令加了 -al
參數(shù)可以查看隱藏文件历筝。
5酗昼、創(chuàng)建文件
touch 文件名
6、移動(dòng)文件
mv 文件/文件夾 路徑
將文件或者文件夾移動(dòng)到所輸入的路徑下梳猪。
7麻削、查看文件內(nèi)容
cat 文件名
8、刪除文件 / 文件夾
rm -rf 文件夾名
rm 文件名
-rf
為遞歸刪除春弥,后面加上 *
為參數(shù)會(huì)遞歸刪除整個(gè)文件夾的內(nèi)容呛哟,rm -rf *
(慎用)。
9匿沛、清空命令窗口
clear
10扫责、查看命令歷史
直接在命令行中查看:
history
將當(dāng)前 Git 的命令歷史寫入文件中:
history > 文件名
11、使用 vi 編輯器編輯文件
vi 文件名
進(jìn)入編輯模式:
i
進(jìn)入命令模式:
Esc
保存并退出:
:wq
強(qiáng)制退出:
:q!
12俺祠、使用命令編輯文件
向文件輸入內(nèi)容:
echo 內(nèi)容 > 文件名
向文件追加內(nèi)容:
echo 內(nèi)容 >> 文件名
當(dāng)使用 echo
編輯了一個(gè)不存在的文件時(shí)公给,會(huì)創(chuàng)建一個(gè)新文件并將內(nèi)容編輯到文件中,而 touch
創(chuàng)建的是空文件蜘渣。
Git 的本地操作
Git 在管理文件時(shí)淌铐,所有文件都具有三種狀態(tài),已修改蔫缸、已暫存腿准、已提交。
Git 在本地倉庫中由三部分組成,工作區(qū)吐葱、暫存區(qū)街望、版本庫。
Git 管理的文件夾下都有一個(gè)名為 .git
的隱藏文件夾弟跑。
對應(yīng)關(guān)系如下:
- 已修改 → 工作區(qū)
- 已暫存 → 暫存區(qū)(
.git
文件夾下的index
文件中) - 已提交 → 版本庫
1灾前、配置用戶
不配置用戶無法提交代碼。
查看配置信息:
git config --list
配置用戶名:
git config --global user.name "你的名字"
配置郵箱:
git config --global user.email "你的郵箱"
2孟辑、初始化 Git 倉庫
在要初始化的文件夾下執(zhí)行下面命令哎甲,告訴 Git 哪個(gè)文件夾被 Git 所管理,一個(gè)項(xiàng)目初始化一次饲嗽,不能嵌套炭玫。
git init
3、查看 Git 狀態(tài)
git status
文件為紅色貌虾,代表有修改吞加,文件名為綠色,代表已經(jīng)加入暫存區(qū)尽狠。
4衔憨、添加到暫存區(qū)
git add 文件名
git add .
git add -A
.
和 -A
兩個(gè)參數(shù)均為全部提交到暫存區(qū),.
只監(jiān)控修改袄膏、添加文件的變化巫财,-A
監(jiān)控修改、添加哩陕、刪除文件。
5赫舒、刪除暫存區(qū)
git rm --cached 文件名
git rm --cached . -r
第一個(gè)命令是刪除某一個(gè)文件的暫存區(qū)悍及,當(dāng)參數(shù)為 .
的時(shí)候刪除全部暫存區(qū),所以需要加上代表遞歸刪除的參數(shù) -r
接癌。
6心赶、提交到版本庫
從暫存區(qū)提交到版本庫:
git commit -m "版本信息"
從工作區(qū)直接提交到版本庫(需要之前添加過暫存區(qū)):
git commit -a -m "版本信息"
7、查看提交日志
git log
8缺猛、比較工作區(qū)缨叫、暫存區(qū)、版本庫
工作區(qū)和暫存區(qū)比較:
git diff
工作區(qū)和版本庫比較:
git diff 分支名
暫存區(qū)和版本庫比較:
git diff --cached
9荔燎、撤銷操作
git checkout 文件名
git checkout .
撤銷操作是將暫存區(qū)覆蓋到工作區(qū)耻姥,會(huì)放棄掉當(dāng)前工作區(qū)修改的內(nèi)容,. 參數(shù)是將整個(gè)暫存區(qū)覆蓋當(dāng)前工作區(qū)有咨,一旦撤銷就回不到之前的工作區(qū)了琐簇。
當(dāng)不小心將當(dāng)前工作區(qū)錯(cuò)誤的代碼提交到暫存區(qū),可以使用下面命令將暫存區(qū)回滾到上一個(gè)暫存區(qū)座享,只可回滾一次婉商。
git reset HEAD 文件名
10似忧、回退版本
查看所有的版本號:
git reflog
按版本號回退版本:
git reset --hard 版本號
回退到上一個(gè)版本:
git reset --hard HEAD^
回退某一個(gè)版本的文件到工作區(qū):
git checkout 版本號 文件名
回退版本會(huì)將當(dāng)前版本庫選中的版本重新覆蓋暫存區(qū)和工作區(qū)。
11丈秩、分支操作
查看分支:
git branch
Git 剛剛初始化管理的的文件夾必須有一次提交到版本庫(root-commit:根提交)以后才會(huì)有主分支 master盯捌,否則即使創(chuàng)建了新分支也無法切換回 master。
創(chuàng)建分支:
git branch 分支名
切換分支:
git checkout 分支名
創(chuàng)建并切換分支:
git checkout -b 分支名
刪除分支(需切換出要?jiǎng)h除的分支):
git branch -D 分支名
新創(chuàng)建的分支和主分支 master 還是同一個(gè)區(qū)域蘑秽,新建的文件只有提交到新分支的版本庫才真正脫離關(guān)系饺著。
分支工作區(qū)有更改不能直接切換其他分支,可以提交更改或者暫存更改筷狼,若暫存更改(使用暫存區(qū)覆蓋掉工作區(qū))瓶籽,等待重新切回分支時(shí),還原暫存埂材。
此處所說的暫存不是之前的將代碼提交到暫存區(qū)塑顺,因?yàn)楫?dāng)前分支工作區(qū)的代碼會(huì)變成要切換分支工作區(qū)的代碼,而導(dǎo)致當(dāng)前分支工作區(qū)的更改丟失俏险,此處的暫存類似于將修改寄存严拒,重新切回該分支時(shí)再還原。
暫存更改:
git stash
還原暫存的內(nèi)容:
git stash pop
合并分支:
將指定分支合并到當(dāng)前所在的分支竖独,所以裤唠,在分支開發(fā)完畢后,合并分支需要先切換回 master 主分支莹痢。
git merge 指定的分支名
查看分支合并的圖譜:
git log --graph
git log --graph --oneline
紅色線代表主分支种蘸,綠色線代表新創(chuàng)建的分支,分支上的 *
代表提交到版本庫的節(jié)點(diǎn)竞膳。--oneline
參數(shù)表示提交信息顯示為一行航瞭。
12、解決沖突
當(dāng)創(chuàng)建分支后坦辟,分支和 master 主分支分別提交代碼到版本庫刊侯,此時(shí)切換回 master 主分支,合并分支會(huì)出現(xiàn)沖突锉走,需手動(dòng)處理后滨彻,重新提交到暫存區(qū)并提交到版本庫。
// 代碼沖突
<<<<<<< HEAD (當(dāng)前更改)
master 分支代碼
=======
開發(fā)分支的代碼
>>>>>>> 開發(fā)的分支 (傳入的更改)
Git 操作遠(yuǎn)程倉庫
遠(yuǎn)程倉庫可以是 Github挪蹭、Gitee(碼云)亭饵、Coding 或者中央服務(wù)器等等。
以下是常用免費(fèi)倉庫的地址梁厉,可以在首頁注冊賬號:
- Github: <a>https://github.com</a>
- Gitee: <a>https://gitee.com</a>
- Coding: <a>https://coding.net</a>
1冬骚、處理需要過濾和提交的文件夾
使用 WebStrom 編輯器編輯代碼時(shí),會(huì)自動(dòng)在根目錄生成 .idea
文件夾,使用 Mac 開發(fā)時(shí)根目錄下的 .DS_Store
文件夾只冻,以及在項(xiàng)目開發(fā)時(shí)會(huì)安裝依賴存放在 node_modules
文件夾中庇麦,此類文件夾都是在把代碼上傳到遠(yuǎn)程倉庫或中央服務(wù)器時(shí)不應(yīng)該上傳的,因此應(yīng)該在上傳之前過濾掉喜德。
在根目錄創(chuàng)建
.gitignore
文件用于記錄上傳時(shí)被忽略的文件夾山橄,內(nèi)容(可根據(jù)需要自行配置)如下:
文件:.gitignore
.idea
.DS_Store
node_modules
Git 上傳時(shí)會(huì)自動(dòng)忽略空文件夾,假設(shè)想要上傳一個(gè)名為 public
的空文件夾舍悯,需要在文件夾內(nèi)新建一個(gè)名為 .gitkeep
的文件(名字隨意航棱,最好有語義化),目的是使要提交的空文件夾不再為空萌衬。
2饮醇、關(guān)聯(lián)遠(yuǎn)程倉庫
git remote add origin 遠(yuǎn)程倉庫地址
3、查看關(guān)聯(lián)的遠(yuǎn)程倉庫
git remote -v
4秕豫、刪除遠(yuǎn)程倉庫的關(guān)聯(lián)
git remote rm 地址別名
地址別名指的是上面的 origin
朴艰,也可以是其他名稱,必須對應(yīng)要?jiǎng)h除關(guān)聯(lián)的地址別名混移。
5祠墅、推送代碼到遠(yuǎn)程倉庫
git push origin master
git push -u origin master
如果加上了 -u
參數(shù),以后再次提交時(shí)可省略地址別名和分支名稱歌径,直接執(zhí)行下面命令進(jìn)行提交毁嗦。
git push
6、拉取遠(yuǎn)程倉庫的代碼
在提交代碼時(shí)回铛,如果直接提交到遠(yuǎn)程倉庫狗准,會(huì)將當(dāng)前代碼覆蓋到遠(yuǎn)程倉庫,如果別人之前也向遠(yuǎn)程倉庫提交了代碼茵肃,會(huì)在遠(yuǎn)程倉庫中造成沖突驶俊,所以一般在提交代碼之前先拉取遠(yuǎn)程倉庫的代碼與本地代碼進(jìn)行合并,并產(chǎn)生一個(gè)新的歷史記錄免姿,若出現(xiàn)沖突,手動(dòng)處理沖突后再統(tǒng)一提交到遠(yuǎn)程倉庫榕酒。
拉取但不合并代碼(與 merge 配合胚膊,不常用):
git fetch origin master
拉取并合并代碼(常用):
git pull origin master
7、創(chuàng)建 gh-pages 分支來發(fā)布靜態(tài)頁
涉及到遠(yuǎn)程倉庫網(wǎng)站上的操作均以 Github 為例想鹰,其他倉庫大同小異:
- 在項(xiàng)目中創(chuàng)建一個(gè)名為
gh-pages
的分支紊婉; - 將分支提交到線上倉庫;
- 找到提供給你的倉庫網(wǎng)站的
Settings
切換到github-pages
辑舷; - 點(diǎn)擊該欄頂端的地址可以訪問我們的靜態(tài)頁喻犁。
git checkout -b gh-pages
touch index.html
git add .
git commit -m "提交信息"
git push origin gh-pages
8、拉取別人的項(xiàng)目到本地
git clone 項(xiàng)目地址 項(xiàng)目別名
上面命令項(xiàng)目別名是可選的,相當(dāng)于給項(xiàng)目根文件夾重命名肢础。
9还栓、向別人的項(xiàng)目提問
- 在遠(yuǎn)程倉庫網(wǎng)站進(jìn)入別人的項(xiàng)目頁面;
- 點(diǎn)擊
Issue
選項(xiàng)传轰; - 輸入問題標(biāo)題和問題描述并點(diǎn)擊提交剩盒;
- 項(xiàng)目所有者可以回復(fù)或關(guān)閉問題。
10慨蛙、更改別人的項(xiàng)目代碼
- 在別人項(xiàng)目的主頁上有一個(gè)叉子的圖標(biāo)辽聊,操作名為
Fork
; -
Fork
是在當(dāng)前項(xiàng)目下克隆了一份期贫,如果代碼更新跟匆,不會(huì)隨之更新; - 使用
clone
命令克隆自己的地址將項(xiàng)目拉到本地通砍,進(jìn)行操作玛臂; - 默認(rèn)就是 Git 倉庫而且有
origin
地址,修改后可以將代碼提交到自己的倉庫上埠帕; - 只有
Fork
關(guān)系才能修改別人代碼后點(diǎn)擊New pull request
發(fā)送提交請求垢揩; - 點(diǎn)擊
Create pull request
按鈕,填寫提交標(biāo)題敛瓷,和提交詳情叁巨,確認(rèn)提交; - 項(xiàng)目所有者可以在自己的項(xiàng)目頁面中
Pull request
菜單中查看提交并處理呐籽; - 點(diǎn)擊
Close pull request
關(guān)閉锋勺,點(diǎn)擊Merge pull request
同意提交并合并。
如果是一個(gè)團(tuán)隊(duì)的其他人需要操作同一個(gè)項(xiàng)目狡蝶,上面的過程顯得很繁瑣庶橱,項(xiàng)目所有者可以在 Settings
的 Collaborators
選項(xiàng)中通過添加別人的賬號或用戶名向項(xiàng)目中添加貢獻(xiàn)者,被添加的人擁有最大權(quán)限贪惹。
GUI 界面化
在當(dāng)前的前端開發(fā)編輯器中苏章,如 VSCode 和 WebStorm 等都集成了 Git,可以直接點(diǎn)擊按鈕操作奏瞬,不必使用命令行枫绅,這種操作 Git 的界面稱作 GUI 界面,個(gè)人建議還是盡量少的使用 GUI 界面硼端,命令行是根本并淋,還是多敲命令行,孰能生巧珍昨。