Git基礎知識詳解

無敵UFO發表於2019-04-10

GIT基礎知識

    1. 什麼是git?

      分散式版本控制系統,它是由Linux(全球比較大的伺服器系統)創始人花兩週使用C語言編寫的,(在GIT命令視窗中一般是執行Linux命令)

      1. 什麼是版本控制系統?

        能夠把之前操作的具體資訊記錄下來,方便日後的更改。

        • 備份檔案
        • 記錄歷史
        • 回到過去
        • 多端共享
        • 團隊協作
      2. 常用的版本控制系統

        • git:分散式版本控制系統
        • svn:集中式版本控制系統

        面試題:分散式和集中式的區別?

        [集中式]:

        Git基礎知識詳解

      • 想要做歷史記錄的檢視或者備份,必須連線到中央伺服器才可以(需要聯網)
      • 處理速度沒有git快

      [分散式]:

      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. 工作區:平時寫程式碼的地方
  2. 暫存區:寫好的一些程式碼暫時儲存的地方
  3. 歷史區:生成一個個版本記錄得地方

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 .
複製程式碼

這條命令的意思是:

把暫存區內容撤回工作去(覆蓋現有工作區中的內容無法找回)。

也可以理解為:用上一個暫存區儲存的內容覆蓋現有工作區的內容,工作區內容變為和上一個暫存區一樣的內容,暫存區內容還在。

存在問題:只能限制當前程式碼還沒有提交的情況,當前程式碼沒提交回滾的是上一次提交到暫存區的內容(和工作區內容不一樣);如果當前這次也提交了,暫存區和工作區一樣,回滾回來也是一樣的,這個方式就解決不了了。

解決問題:

  1. 輸入命令 $ git reset HEAD . : 在暫存區中,回滾到上一次暫存區中記錄的內容(暫存區先回滾一次)
  2. 輸入命令 $ 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倉庫服務平臺,自己公司的伺服器等...

    1. 基於gitHub建立遠端倉庫,建立完成後會生成一個遠端地址,例如: https//github.com/username/Repository name.git

    2. 作為LEADER,還需要把專案中一些基礎的資訊提交到遠端倉庫上:

      1. 在自己本地建立一個倉庫,把一些基礎內容都放在倉庫中
      2. 把新增加的內容提交到本地倉庫歷史區中
      3. 讓本地倉庫和遠端倉庫保持關聯
      4. 把本地倉庫歷史區中的資訊同步(推送)到遠端倉庫上
  • 讓本地倉庫和遠端倉庫保持關聯:

$ 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一下

  1. 【如果遠端倉庫和本地倉庫不是同一個檔案同一行程式碼衝突】

git 會自動依賴於 Fast-forward 模式進行合併

自動合併後,我們重新提交即可 git add/commit/push

  1. 【同一個檔案的同一行程式碼衝突】

    找到衝突的檔案,留下自己想要的程式碼

    不管之前是否commit過,都要重新的commit,然後push即可

2.單獨分支管理

  1. 每天第一件事情,就是建立一個dev分支並切換到這個分支上

  2. 正常的開發程式碼,把每天開發的任務都先提交到自己的分支上

  3. 提交到遠端倉庫上:

    把本地自己分支DEV中的內容,合併到本地自己的MASTER 分支下

    把自己本地建立的分支刪除(可以不刪除,但是有的公司不希望遠端中出現分支,或者避免開發人員的分支衝突,提交之前都要把自己建立的分支刪除掉)

  4. 和第一種只使用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介面操作

給別的倉庫提交程式碼修改或建議

  1. 首先fork別人的倉庫

    • 把別人的倉庫克隆一份一模一樣的,放到自己的賬號下,變為自己的倉庫(我們平時可以修改自己倉庫的原始碼)
    • fork的倉庫和別人的原始的倉庫會預設建立一些關係,我們可以把自己倉庫中和別人不一樣的地方,提交給別人,用(pull-request)
  1. 把自己fork的倉庫,克隆到本地

    • 以後自己有一些新的程式碼心得,可以自己嘗試去修改,然後同步到自己fork的倉庫中
  2. 在github中點選 new pull request

GitHub還可以釋出非後臺專案

GitHub只提供了web站點的釋出,後臺專案沒有提供必要的環境

  • 把整個倉庫作為一個專案釋出(這種模式不常用)

  • master是專案程式碼,gh-pages分支下儲存的是專案預覽頁面的程式碼

    其他人克隆研究的是master分支下的程式碼

    看介紹頁面,看的是gh-pages分支下的程式碼

    1. 建立一個倉庫
    2. 把倉庫克隆到本地
    3. 把原始碼傳到master分支上
    4. 在本地倉庫中建立gh-pages分支
    5. 把介紹頁面放在gh-pages分支下
    6. 把介紹頁面的內容上傳到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/倉庫名 寫到簡歷上就可以訪問到頁面效果。如果覺得地址太長不好記,也可以通過草料二維碼 ,來製作自己喜歡的二維碼

相關文章