天天看點

git的基本使用和常出現的問題及解決方法GIT 和 GITHUBGIT 沖突

GIT 和 GITHUB

  • 在學習之前我們要先要清楚幾個東西
  • git 和 github 是兩個東西,不是一個東西
  • 就像 java 和 javascript 一樣,是兩個東西
  • 需要搞清楚幾個詞語的意思
    • 本地:我自己的終端
    • 遠端:在網絡那一頭的終端
    • 倉庫:一個被 git 管理了的檔案夾
    • 推送:把本地的内容上傳到遠端裡面
    • 同步:讓遠端的内容和本地的内容保持一緻

什麼是 GIT

  • git 官方名稱: 分布式版本管理器
  • 私人解釋: 就是一個管理我們檔案夾的工具
    • 隻不過可以保留所有的版本資訊
  • 就是我們安裝一個軟體
    • 然後用這個軟體來管理我們的一個檔案夾
    • 這個檔案夾被 git 管理以後,我們可以對他進行各種操作
    • 保證我們寫過的内容不會丢失

什麼是 GITHUB

  • github 是一個網站,是一個我們托管項目的平台
  • 是一個 世界級别 的大型網站
  • 也就是說,我們寫的項目的 源碼 可以放在上面儲存,隻要我們不自己删除,不會丢失
    • 就相當于百度雲
    • 隻不過功能更加強大,上面都是開發人員(世界級别)
  • 因為 github 隻接受 git 來上傳代碼,是以叫做 github
  • 也就是說,我們可以通過 git 這個軟體來管理我們本地的檔案夾
    • 并且可以把檔案夾裡面的代碼上傳到 github 儲存
    • 也可以寫一個插件之類的工具,上傳到 github 上面讓其他開發者使用
    • 也可以從 github 上找到其他開發者寫的插件之類的東西下載下傳使用
  • 是以說,github 也是一個大型的 開源 的資源共享平台

GIT 使用

  • 剛才我們說過,git 是一個管理我們檔案夾的工具
  • 那麼我們就要先安裝工具,再使用工具管理我們的檔案夾

GIT 安裝

  • 下載下傳 git 直接到官網下載下傳就可以
    • git官網
    • git下載下傳中心
  • 找到和作業系統對應的版本就可以了
    1. 方法一: 打開官網,直接點選下載下傳
    2. 方法二: 打開下載下傳中心,選擇作業系統,選擇下載下傳版本
  • 下載下傳好以後,直接輕按兩下進行安裝就行
  • 一直下一步就可以,安裝再預設路徑就行
  • 安裝完畢後檢測一下安裝是否成功
    1. 方法一: 打開 cmd 視窗,輸入指令檢查

      # 檢測 git 是否安裝

      $ git --version

      • 出現版本号,說明安裝成功
    2. 方法二: 随便找個地方單機 滑鼠右鍵,出現下圖内容,說明安裝成功
  • 安裝完畢,接下來我們就可以開始使用了

GIT 使用

  • git 是一個軟體沒錯,但不是那種安裝了會再桌面出現一個圖示的軟體
  • 而是一個需要在 指令行 進行操作的軟體
  • 我們單機滑鼠右鍵,點選 Git Bash Here
  • 會出現下圖内容
  • 我們發現點開以後,就是一個 指令行視窗
  • 其實就是給我們寫一些指令使用的,隻不過色彩鮮豔一點
    • 使用 cmd 或者 powershell 視窗來運作 git 指令也可以
    • 隻要是再終端運作就行
    • OS 作業系統直接在 終端 中運作就行
  • Git Bash Here 表示再目前目錄下運作 Git Base
  • 是以,你在哪個檔案夾下點選的,那麼你出來的指令行視窗的目錄就是哪裡
  • 我們就在指令行裡面使用 git 來管理我們的檔案夾

GIT 初始化

  • 我們希望一個檔案夾被 git 管理的話,那麼就要在一個檔案夾下進行 git 初始化
  • 找到一個希望被 git 管理的檔案夾
  • 在檔案夾内單擊滑鼠右鍵,點開 Git Bash Here
  • 輸入指令

    # git 初始化的指令

    $ git init

  • 然後檔案夾内會多一個 .git 的檔案夾(這個檔案夾是一個隐藏檔案夾)
  • 這個時候,我的這個 git_demo 檔案夾就被 git 管理了
    • git 不光管理這一個檔案夾,包括所有的子檔案夾和子檔案都會被管理
  • 注意: 隻有當一個檔案夾被 git 管理以後,我們才可以使用 git 的功能去做版本管理
    • 也就是說,我們必須要把我們電腦中的某一個檔案夾授權給 git
    • git 才能對這個檔案夾裡面的内容進行各種操作
    • 而 git init 就是在進行這個授權的操作

GIT 暫存區

  • 當一個檔案夾被 git 管理了以後
  • git 就會對目前檔案夾進行 “分區”
  • 會分為三個區域
    1. 工作區:我們書寫的源碼就在工作區裡面
    2. 暫存區:把我們想要存儲的内容放在暫存區
    3. 曆史區:把暫存區裡面的内容拿出來形成一個曆史版本
  • 也就是說,我們需要把想成為一個版本的代碼
    • 要先放在暫存區
    • 然後才能在暫存區裡面放到曆史去
    • 才可以生成一個版本儲存下來
  • 檢視git管理的檔案夾的狀态
    • git status
  • 我們要放入暫存區,要使用 git add 指令
  • 把單獨一個檔案放在暫存區

    # 把檔案夾下的 index.txt 文本放在暫存區

    $ git add index.txt

  • 把單獨一個檔案夾放在暫存區(暫存區不能存放空檔案夾)

    # 把檔案夾下的 ceshi檔案夾 放在暫存區

    $ git add ceshi/

  • 把所有檔案都放在暫存區

    # 把檔案夾下所有的内容都放在暫存區

    $ git add --all

    # git add --all 有一個簡單的寫法
    $ git add .
               
    • 全部存放的時候使用上面兩個指令哪個都行
  • 把已經放在暫存區的内容在拉回到工作區

    # 拉回暫存區的 index.txt 檔案

    $ git reset HEAD – index.txt

    # 拉回暫存區的 ceshi 檔案夾
    $ git reset HEAD -- ceshi/
    
    # 拉回暫存區的 所有檔案
    $ git reset HEAD -- .
               
    • 注意: – 兩邊都有空格,拉回所有檔案的時候有個 .
  • 暫存區,隻是幫我們暫時存放内容,我們删除了還是會丢的
  • 要想幫我們儲存下來,那麼還需要把暫存區的内容放到曆史區

GIT 曆史區

  • git 的曆史區,就是把我們暫存區裡面的檔案變成一個曆史版本
  • 當一些檔案形成一個版本的時候,就會被一直記錄下來了
  • 向曆史區裡面添加内容的時候,必須保證 暫存區 有内容
  • 因為曆史區就是把暫存區裡面的内容收錄進去
  • 向曆史區添加内容使用 git commit -m “做一個簡單的說明”

    # 把暫存區的内容放到曆史區之前需要先登入

    git config --global user.name “YOUR-NAME”

    git config --global user.email “YOUR-EMAIL-ADDRESS”

    # 把暫存區的内容放到曆史區

    $ git commit -m “我是第一個版本”

    • 我們一定要寫一個簡單的說明
    • 因為當我們的曆史版本多了以後,我們自己也記不住哪個版本做了哪些修改
    • 是以有個簡單的說明會好很多
  • 這個時候曆史區就有了我們的第一個版本
  • 我們使用 git log 這個指令檢視版本資訊

    # 檢視目前曆史區版本資訊

    $ git log

    • commit:這一個版本的版本編号
    • Author:作者
    • Date:本次版本的記錄時間
    • 後面的内容就是我剛才送出的時候寫的說明
  • 接下來我們對檔案夾内的内容進行一些修改,然後再次建立一個曆史版本
  • 對 index.txt 中的文本内容進行修改
    • 從 hello world 改變成 你好 世界
  • 然後我們再次列印日志看一下
    • 我們發現,日志資訊變成了兩條,也就是我們存在着兩個版本的内容了
  • 放在曆史區的内容,理論上就丢不了了
  • 現在我們可以把我們本地工作區中的内容給删除了,删除以後我們進行曆史回退
  • 我們使用 git reset --hard 版本編号 進行曆史回退

    # 回退到第一次送出的版本

    $ git reset --hard ce0c17f7a703c6847552c7aaab6becea6f0197f2

    # 回退到第二次送出的版本
    $ git reset --hard abb2c4f12566440e04bc166c3285f855a37a3bb2
               
  • 這個時候我們就可以來回來去的玩我們的曆史記錄了

GIT 儲存和忽略檔案

  • .gitkeep
    • 就是為了保留白檔案夾使用的
    • 隻有字尾沒有名字
  • .gitignore
    • 表示在 git 管理的檔案夾中忽略哪些東西
    • 直接寫在一個和 .git 同級的檔案夾下
      • index.html忽略一個指定的檔案
      • /css 忽略一個指定的檔案夾
      • *.css忽略指定字尾的檔案

        GIT 推送

    • 我們的所有内容已經全部保留在了本地曆史區
  • 理論上是不會丢失了
    • 但是如果把檔案夾删除了,還是沒有了
  • 是以我們要使用 git 把我們所有的内容推送到 github 上面儲存起來
  • 那麼就本地檔案夾就算删除了,那麼遠端上面還有一份,還可以拿回來使用
  • 是以我們現在就要把本地内容推送到遠端
  • 這個時候我們接需要一個 github 的賬号了
  • 先去 github官網 注冊一個賬号

開辟一個遠端倉庫

  • 有了 github 賬号以後
  • 我們就登入 github 網站,開辟一個遠端倉庫
  • github 的遠端也是以一個倉庫一個倉庫的形式來儲存代碼
    • 我們可以在一個 github 上儲存很多的項目
    • 隻要一個項目一個倉庫就可以了
  • 按照下面步驟開辟倉庫
    1. 先點選建立倉庫
    2. 按照要求填寫内容
    3. 出現下圖表示建立倉庫成功
  • 現在我們的遠端倉庫建立完畢了,我們就要把我們的項目代碼整個上傳了

添加倉庫位址

  • 接下來,要使用 git 上傳代碼了
  • 我們先要告訴 git 上傳到哪裡
  • 也就是給 git 添加一個上傳的位址
  • 我們還是來到我們的項目檔案夾
  • 使用 git remote add origin 倉庫位址 來添加

    # 在項目檔案夾下打開 git base

    # 添加倉庫位址

    $ git remote add origin https://github.com/guoxiang910223/ceshi2.git

    • remote:遠端的意思
    • add:添加的意思
    • origin:是一個變量名(就是指代後面一長串的位址)

上傳

  • 上傳到哪裡的位址我們已經添加好了
  • 接下來就是上傳内容了
    • 上傳要保證 曆史區 裡面有内容
    • 上傳的過程會把 曆史區 裡面所有的内容上傳到遠端
  • 我們使用 git push 指令來上傳

    # 上傳内容

    $ git push -u origin master

    # 表示把内容上傳到 origin 這個位址

    # master 是上傳到遠端的 master 分支

    • push 向遠端推送
    • -u 是我們第一次的使用用到了,是為了記錄一下使用者名和密碼
    • 下次上傳的時候就不需要再寫了
    • origin 推送的位址
    • master 主要分支
  • 第二次上傳
    • 第二次上傳的時候,因為有剛才的記錄,就不需要再寫 origin 和 master 了
    • 會預設傳遞到 origin 這個位址的 master 分支上
    • 除非你要傳遞到别的分支上的時候再進行書寫

      # 第二次上傳

      $ git push

  • 到這裡,就完成了一次 git 推送
  • 這個時候本地的檔案夾就真的可以删除了
  • 因為遠端有一份我們的内容,本地的删除了,可以直接把遠端的拉回來就行

GIT 分支

  • git 分支,就是我們自己把我們的整個檔案夾分成一個一個獨立的區域
  • 比如我在開發 登入 功能的時候,可以放在 login 分支下進行開發
    • 開發 清單 功能的時候,可以放在 list 分支下進行開發
    • 大家互不幹擾,每一個功能都是一個獨立的功能分支
  • 這樣開發就會好很多
  • git 在初始化的時候,會自動生成一個分支,叫做 master
  • 是表示主要分支的意思
  • 我們就可以自己開辟出很多獨立分支
  • 開辟一個分支使用 git branch 分支名稱 指令

    # 開辟一個 login 分支

    $ git branch login

  • 檢視一下目前分支情況

    # 檢視目前分支情況

    $ git branch

    • 會看到,目前有兩個分支了
    • 一個是 master,一個是 login
    • 前面有個 * 号,并且有高亮顯示的,表示你目前所處的分支
  • 我們對 登入 功能的開發要移動到 login 分支去完成
  • 我們切換所處分支使用 git checkout 分支名稱

    # 切換到 login 分支

    $ git checkout login

  • 然後我們在整個分支上進行 登入 功能的開發
  • 開發完畢以後,我們就在目前分支上進行送出
  • 送出以後我們進行分支切換
    • 發現 master 上面還是最初始的狀态
    • 而 login 分支上有我們新寫的 登入 功能的代碼
  • 我們按照分支把所有功能都開發完畢了以後
    • 隻要把所有代碼都合并到 master 主分支上就行了
  • git 的合并分支,隻能是把别的分支的内容合并到自己的分支上
  • 使用的指令是 git merge

    # 切換到 master 分支

    $ git checkout master

    # 把 login 的内容合并到自己的分支
    $ git merge login
    
    #儲存并退出
    $ :wq  
               
  • 這個時候,我們剛才在 login 上開發的東西就都來到了 master 主分支上
  • 如果是有多個分支的話,那麼所有的最後都合并到 master 分支上的時候
  • 我們的主分支上就有完整網站的所有頁面
    • 各個分支上都是單獨的頁面和功能
  • 這個時候我們開辟的分支就沒有什麼用了,就可以删除分支了
    1. 先切換到别的分支(不能自己删除自己)
    2. 使用指令 git branch -d 分支名稱 來删除

      # 先切換到别的分支

      $ git checkout master

      # 删除 login 分支
      $ git branch -d login
                 

常用的分支命名

  • 我們的分支命名也要規範一些
  • 我們有一些分支名稱大家都預設是有特殊意義的
  • 比如我們之前的寫的 login 分支就是不規範的分支名稱
    • 而且也是不規範的分支操作
  • 常見的分支名稱
    1. master:主分支,永遠隻存儲一個可以穩定運作的版本,不能再這個分支上直接開發
    2. develop: 主要開發分支,主要用于所用功能開發的代碼合并,記錄一個個的完整版本
      • 包含測試版本和穩定版本
      • 不要再這個分支上進行開發
    3. feature-xxx:功能開發分支,從 develop 建立的分支
      • 主要用作某一個功能的開發
      • 以自己功能來命名就行,例如 feature-login / feature-list
      • 開發完畢後合并到 develop 分支上
    4. feature-xxx-fix: 某一分支出現 bug 以後,在目前分支下開啟一個 fix 分支
      • 解決完 bug 以後,合并到目前功能分支上
      • 如果是功能分支已經合并之後發現 bug 可以直接在 develop 上開啟分支
      • 修複完成之後合并到 develop 分支上
    5. hotfix-xxx: 用于緊急 bug 修複
      • 直接在 master 分支上開啟
      • 修複完成之後合并回 master

GIT 克隆

  • git 克隆是指把遠端倉庫裡面的内容克隆一份到本地
  • 可以克隆别人的 公開 的倉庫,也可以克隆自己的倉庫
  • 克隆别人的倉庫,我們隻能拿下來用,修改後不能從新上傳
  • 克隆自己的倉庫,我們修改後還可以再次上傳更新
  • 我們先找到一個别人的倉庫,或者自己的倉庫(這裡以 jQuery 的倉庫為例)
  • 複制好位址以後,選擇一個我們要存放内容的檔案夾(我這裡以桌面為例)
  • 直接在想存放内容的位置打開 git base
  • 輸入克隆指令 git clone 倉庫位址

    # 直接克隆倉庫

    $ git clone https://github.com/jquery/jquery.git

  • 等待一段時間
  • 你就會發現你的檔案夾裡面多了一個叫做 jquery 的檔案夾
  • 裡面就是人家倉庫的所有内容

GIT 下拉

  • 不管是你克隆下來的倉庫還是别的方式弄得本地倉庫
  • 當人家的代碼更新以後,你想獲得最新的代碼
  • 我們不需要從新克隆
  • 隻要拉取一次代碼就可以了
  • 直接在項目檔案夾裡面使用指令下拉

    # 拉取遠端最新代碼

    $ git pull

  • 這樣一來,你本地的倉庫就可遠端的倉庫同步了

GIT 沖突

  • git 沖突是指在我們的上傳過程中
  • 本地的版本和遠端的版本不一緻導緻的
  • 這個時候隻要先使用 git pull 拉取回來
    • 讓本地和遠端保持一緻
  • 然後再從新上傳就好了
  • 但是 git pull 相對不安全,因為會自動和本地内容合并
  • 我們也可以選擇使用 git fetch

    # 使用 fetch 擷取遠端最新資訊并開辟一個臨時分支

    $ git fetch origin master:tmp

    # 将目前分支和臨時分支的内容進行對比
    $ git diff tmp
    
    # 再選擇合并分支内容
    $ git merge tmp