GIT基礎知識
-
-
什麼是git?
分散式版本控制系統,它是由Linux(全球比較大的伺服器系統)創始人花兩週使用C語言編寫的,(在GIT命令視窗中一般是執行Linux命令)
-
什麼是版本控制系統?
能夠把之前操作的具體資訊記錄下來,方便日後的更改。
- 備份檔案
- 記錄歷史
- 回到過去
- 多端共享
- 團隊協作
-
常用的版本控制系統
- git:分散式版本控制系統
- svn:集中式版本控制系統
面試題:分散式和集中式的區別?
[集中式]:
- 想要做歷史記錄的檢視或者備份,必須連線到中央伺服器才可以(需要聯網)
- 處理速度沒有git快
[分散式]:
- 每個開發者本地都是一個單獨的倉庫,在自己的倉庫中就可以完成歷史版本記錄和檢視(不需要聯網)
- git處理的速度更快(git是按照資料儲存的)
-
-
Linux作業系統中常用的命令
-
ls:檢視當前目錄下的檔案(或資料夾)
-
-l :檢視詳細資訊
-
-a:檢視隱藏檔案
-
-la:同時具備以上特點
-
-
clear:清屏
-
cd: 目錄切換
- cd ../ 返回上級目錄
- cd ./ 返回當前目錄
- cd / 返回根目錄
- cd xxx 進入到指定資料夾
- cd E 進入到指定的磁碟
-
mkdir 建立資料夾
-
touch 建立一個空檔案
- 可以建立無檔名的檔案,例如:
touch .gitignore
- 在電腦隱藏檔案字尾名的情況下,我們也不至於建立出1.txt.txt這樣重複字尾名的檔案
- 可以建立無檔名的檔案,例如:
-
vi 向指定檔案中插入內容 例如:vi.txt
- 首先進入命令視窗模式
- 我們先按i,進入到插入內容模式
- 編輯需要寫的內容
- 按ESC鍵,再按英文下的 : 鍵,再按wq(儲存並退出)
- 按 q!(強制退出,新輸入的內容不儲存)
-
echo xxx > 1.txt 把xxx內容放到1.txt檔案中,如果沒有這個檔案則建立這個檔案(新存放的內容會替換原有檔案的內容)
-
echo xxx >> 1.txt 新的內容會追加到原有內容的後面
-
cat 檢視檔案中的內容
-
cp 拷貝檔案
-
rm 刪除檔案
- -r 遞迴刪除(把當前資料夾中所有的後代元素都遍歷到刪除)
- -f 強制刪除
- -rf 上面兩種合併到一起,沒有辦法還原回來,使用要慎重
Git的工作原理和流程
安裝完成git後,我們應該先把基礎資訊配置一下(自己需要配置一次即可)
$ git config -l 檢視當前本機的配置清單 $ git config --global user.name xxx $ git config --global user.email xxx (xxx寫github/coding等平臺的賬號和郵箱) 複製程式碼
Git的工作流程
Git是分散式版本控制系統,每一臺客戶端都是一個獨立的git倉庫(有git工作的全套機制)
一個git倉庫分為三個區域;
- 工作區:平時寫程式碼的地方
- 暫存區:寫好的一些程式碼暫時儲存的地方
- 歷史區:生成一個個版本記錄得地方
1.建立GIT倉庫
在指定目錄中,開啟git bash命令列,執行
git init
,相當於以當前目錄作為基礎,建立了一個本地git倉庫建立完成後,會在專案的根目錄中展示 .git 這個隱藏檔案:有這個.git檔案的才叫做git倉庫,沒有則不能被稱為git倉庫(因為暫存區和歷史區都是存在 .git 資料夾中的)
2.把工作區的內容提交到暫存區
$ git add xxx 把某個檔案提交到暫存區 $ git add . 把所有修改的檔案(修改和新增的包含,刪除的不包含)提交到暫存區 $ git add -u 把所有修改的檔案(包含修改和刪除的,不包含新增的) $ git add -A 是點和u的集合體,(所有修改,新增,刪除的資訊都會提交到暫存區),但是真實效果中兩者都差不多,用哪個都可以 $ git status 檢視當前檔案的狀態 紅色:在工作區中,還沒有提交到暫存區 綠色:在暫存區中,還沒有提交到歷史區 複製程式碼
如果在提交的時候,有些內容不想提交,我們可以增加git提交的忽略檔案:
.gitignore
(沒有檔名只有字尾名).gitignore 中的資訊:
.idea // 使用WS開啟專案或者編輯專案,自動會生成的檔案
node_modules // 使用npm安裝模組的時候,當前安裝在專案中的第三方模組都在這個資料夾中(之所以忽略是因為檔案太大了)
.DS_Store (mac本中的檔案)等等
3.把暫存區提交到歷史區
$ git commit
$ git commit -m'註釋內容'
$ git commit -a -m'註釋內容'
把提交到暫存區和提交到歷史區合併到一起完成。但是隻適合已經提交過一次的檔案,被修改後可以快速提交。但是對於新增的檔案,一次都沒有提交過的,是不允許這樣操作的。
複製程式碼
【root-commit】根提交:
- 簡單理解為:第一次提交到歷史區域,如果我們建立一個新的倉庫。但是沒有做根提交,此時我們倉庫中沒有任何分支(哪怕是master),也就不存在所謂的分支切換(當前倉庫還不完整,只有一個工作流程走完一遍才算完整)
4.工作流中的一些細節知識:
不管是從工作區提交到暫存區,還是從暫存區提交到歷史區,每一個區域當前的內容是已知儲存下來的不會消失。
$ git log
或
$ git reflog
複製程式碼
都是檢視歷史提交記錄的(也相當於檢視歷史版本號),在沒有歷史版本回滾的時候,我們用哪個都可以。如果有歷史版本回滾,
git log
只能檢視當前回退版本以前的版本
$ git rm --cached . -r
複製程式碼
可以把
.
替換為具體的檔名,這條命令的意思是:從暫存區把所有內容(或者是你指定的具體檔案)都撤回到工作區(不管暫存區中的內容是否已經提交到歷史版本上了,也不管是你第幾次放到暫存區的,統統撤回到工作區)
這種方式太暴力,我們用的很少,不推薦使用
$ git checkout .
複製程式碼
這條命令的意思是:
把暫存區內容撤回工作去(覆蓋現有工作區中的內容無法找回)。
也可以理解為:用上一個暫存區儲存的內容覆蓋現有工作區的內容,工作區內容變為和上一個暫存區一樣的內容,暫存區內容還在。
存在問題:只能限制當前程式碼還沒有提交的情況,當前程式碼沒提交回滾的是上一次提交到暫存區的內容(和工作區內容不一樣);如果當前這次也提交了,暫存區和工作區一樣,回滾回來也是一樣的,這個方式就解決不了了。
解決問題:
- 輸入命令
$ git reset HEAD .
: 在暫存區中,回滾到上一次暫存區中記錄的內容(暫存區先回滾一次)- 輸入命令
$ git checkout .
: 把最新暫存區的內容回滾到工作區,替換工作區中的內容
$ git diff
複製程式碼
工作區 VS 暫存區 :
git diff
工作區 VS 歷史區 :
git diff master
暫存區 VS 歷史區 :
git diff --cached
檢視不同區域之間程式碼的不同,我們一般都是基於視覺化的頁面來檢視不一樣的
最重要的程式碼回滾技巧:
$ git reset --hard 版本號
複製程式碼
git log
可以檢視版本號回滾的時候指定的版本號不一定非常全,有七八位即可
當我們回滾到某一個歷史版本之後,暫存區和工作區的內容都將被這個版本內容所代替
$ history > xxx.txt //(把歷史操作步驟輸出)
複製程式碼
團隊協作開發下的git操作
- 前面講的都是單獨開發,在自己本地建立git倉庫的一系列操作流程,在團隊寫作開發下,流程還是有所區別的
1. 建立中央倉庫
一般是由團隊技術LEADER或者指派人完成的,倉庫中預設是有一些初始化檔案的
中央倉庫可能是在:gitHub,Coding,自己公司的git倉庫服務平臺,自己公司的伺服器等...
基於gitHub建立遠端倉庫,建立完成後會生成一個遠端地址,例如:
https//github.com/username/Repository name.git
作為LEADER,還需要把專案中一些基礎的資訊提交到遠端倉庫上:
- 在自己本地建立一個倉庫,把一些基礎內容都放在倉庫中
- 把新增加的內容提交到本地倉庫歷史區中
- 讓本地倉庫和遠端倉庫保持關聯
- 把本地倉庫歷史區中的資訊同步(推送)到遠端倉庫上
讓本地倉庫和遠端倉庫保持關聯:
$ git remote add 名字(一般都叫做origin) 遠端倉庫地址 $ git remote rm 名字 // 移除關聯 $ git remote -v // 檢視當前倉庫和哪些遠端倉庫保持關聯 複製程式碼
讓本地歷史區資訊和遠端倉庫資訊保持同步:
第一種方法:
$ git push origin master // 把本地資訊推送到遠端倉庫上 $ git pull origin master // 把遠端的拉取到本地倉庫 (origin 是本地和遠端倉庫關聯的那個名字,master 是遠端倉庫的主分支) 複製程式碼
第二種方法:(推薦使用)
我們建立完成後遠端倉庫後,可以直接通過
git clone 倉庫地址 倉庫別名(可以不寫)
的方式把遠端倉庫克隆到本地:相當於在本地建立了一個倉庫
也讓本地這個倉庫和遠端倉庫保持了連線(名字:origin)
也把遠端倉庫現有的內容克隆到了本地
2. 無分支模式下的團隊協作
作為開發者每天來的第一件事情或者提交程式碼之前,都要先pull一下
- 【如果遠端倉庫和本地倉庫不是同一個檔案同一行程式碼衝突】
git 會自動依賴於 Fast-forward 模式進行合併
自動合併後,我們重新提交即可
git add/commit/push
【同一個檔案的同一行程式碼衝突】
找到衝突的檔案,留下自己想要的程式碼
不管之前是否commit過,都要重新的commit,然後push即可
2.單獨分支管理
每天第一件事情,就是建立一個dev分支並切換到這個分支上
正常的開發程式碼,把每天開發的任務都先提交到自己的分支上
提交到遠端倉庫上:
把本地自己分支DEV中的內容,合併到本地自己的MASTER 分支下
把自己本地建立的分支刪除(可以不刪除,但是有的公司不希望遠端中出現分支,或者避免開發人員的分支衝突,提交之前都要把自己建立的分支刪除掉)
和第一種只使用MASTER分支一樣了,把本地最新合併的MASTER分支程式碼,提交到遠端倉庫的MADTER下,(衝突合併即可)
操作分支的基礎命令:
$ git branch //檢視現有的分支 $ git branch xxx //建立一個新的分支(當切換到某個分支上的時候,會把當前MASTER分支中的新資訊同步到這個分支上) $ git checkout xxx //切換到某個分支上 $ git checkout -b xxx //建立一個新的分支並且切換到這個分支上 $ git branch -D xxx //刪除某個分支(一定要切換到其他分支上才可以刪除當前分支) $ git merge xxx //合併分支內容 $ git log --graph / --oneline //再有分支的情況下,可以更清楚地檢視分支的提交和合並內容(瞭解就好) 複製程式碼
GitHub介面操作
給別的倉庫提交程式碼修改或建議
首先fork別人的倉庫
- 把別人的倉庫克隆一份一模一樣的,放到自己的賬號下,變為自己的倉庫(我們平時可以修改自己倉庫的原始碼)
- fork的倉庫和別人的原始的倉庫會預設建立一些關係,我們可以把自己倉庫中和別人不一樣的地方,提交給別人,用(pull-request)
把自己fork的倉庫,克隆到本地
- 以後自己有一些新的程式碼心得,可以自己嘗試去修改,然後同步到自己fork的倉庫中
在github中點選 new pull request
GitHub還可以釋出非後臺專案
GitHub只提供了web站點的釋出,後臺專案沒有提供必要的環境
把整個倉庫作為一個專案釋出(這種模式不常用)
master是專案程式碼,gh-pages分支下儲存的是專案預覽頁面的程式碼
其他人克隆研究的是master分支下的程式碼
看介紹頁面,看的是gh-pages分支下的程式碼
- 建立一個倉庫
- 把倉庫克隆到本地
- 把原始碼傳到master分支上
- 在本地倉庫中建立gh-pages分支
- 把介紹頁面放在gh-pages分支下
- 把介紹頁面的內容上傳到github的gh-pages分之下
訪問頁面:http://使用者名稱.github.io/倉庫名/頁面名.html (如果頁面是index可以忽略不寫)
把自己寫的純靜態頁面專案通過github地址可以看到頁面效果
第一步,在github上新建一個倉庫,把遠端倉庫通過
git clone xxx
克隆到本地第二步,把自己寫好的作品放在本地倉庫中
第三步,通過
git add -A
,git commit -m
,git push origin master
三步操作,把自己的專案同步到遠端倉庫github中
- 以後修改後,重新執行這三步推送即可
在投簡歷的時候,把網址
https://使用者名稱.github.io/倉庫名
寫到簡歷上就可以訪問到頁面效果。如果覺得地址太長不好記,也可以通過草料二維碼 ,來製作自己喜歡的二維碼