Git 基礎操做

Git 倉庫的三大區域

本節將完成一次從本地倉庫修改代碼、提交併推送到遠程倉庫的操做。git

Git 本地倉庫有三大區域:工做區、暫存區、版本區。這是一個概念,有這個瞭解便可,隨着使用 Git 的時間增多,慢慢就會理解這三個區域的做用以及爲什麼要這麼設計。接下來以命令爲主線介紹 Git 的操做。瀏覽器

注意,全部 Git 命令都以 git 開頭。設計

一次完整的修改、提交、推送操做

首先,進入倉庫主目錄,執行 git status 查看整個倉庫的狀態:3d

對工做區進行修改

建立一個文件並再次查看倉庫狀態,這步操做是在工做區中:指針

添加修改到暫存區以及撤銷修改

按照上圖的提示,使用 git add [文件名] 命令跟蹤此新建文件,即把新增文件添加到暫存區,以備提交:code

若是對多個文件或目錄進行了增刪改,可使用 git add . 命令所有添加到暫存區。blog

注意這裏有個概念,當修改了工做區,git add 命令是將這些修改添加到暫存區,暫存區記錄的只是修改。若是要撤銷暫存區的修改,根據上圖的提示,執行 git reset -- [文件名] 或者 git rm --cached [文件名] 命令便可:教程

上圖的命令,若是省略最後的文件名,把命令寫成 git reset -- 便可把暫存區的所有修改撤銷。好,如今暫存區的修改被撤銷,又回到了工做區。it

如今介紹另外一個命令 git diff,它能夠用來查看工做區被跟蹤的文件的修改詳情,此時新建文件 one.txt 並未被跟蹤,而已被跟蹤的文件 README.md 無修改,因此看不到。注意,只有在版本區中存在的文件纔是被跟蹤文件。ast

先修改 README.md 文件,而後執行此命令:

如今,將工做區的兩處修改(新增文件 one.txt,修改文件 README.md)所有添加到暫存區,並使用 git diff --cached 查看暫存區的所有修改:

查看提交歷史

接下來,將執行 git commit 命令把暫存區的修改提交到版本區,生成一個新的版本。

在此以前,先介紹另外一個命令 git log,它用來查看版本區的提交歷史記錄,當前只有一個提交,就是在 GitHub 上建立新倉庫時的初始化提交。一樣此命令也會跳到新頁面,以下圖所示:

關於查看提交歷史記錄的命令,有些經常使用的選項介紹一下:

  • git log [分支名] 查看某分支的提交歷史,不寫分支名查看當前所在分支
  • git log --oneline 一行顯示提交歷史
  • git log -n 其中 n 是數字,查看最近 n 個提交
  • git log --author [貢獻者名字] 查看指定貢獻者的提交記錄
  • git log --graph 圖示法顯示提交歷史

配置我的信息

接下來須要對 Git 進行一些本地配置:

  • user.email:寫入本身註冊 GitHub 帳號的郵箱
  • user.name:本身的 GitHub 帳號名字

這兩個命令設置身份信息以下圖。git config -l 能夠查看配置信息(就不展現截圖了):

完成後,系統自動生成 Git 的配置文件,就是家目錄中的隱藏文件 .gitconfig

上圖所示的配置文件也是能夠直接手動修改。

提交暫存區的修改

如今執行 git commit 命令生成一個新的提交,一個必須的選項 -m 用來提供該提交的備註:

提交後,暫存區的修改被清空,執行 git log 查看提交記錄,紫色框中的十六進制序列號就是提交版本號,這是很重要的信息,每一個提交都有本身單獨的版本號,就像公民身份證號同樣:

觀察上圖的提交信息,提交版本是按時間倒序排列的,也就是最近的提交排在最上面,可能須要查看時間正序排列的信息,那麼可使用 git log --reverse 命令。

如今介紹一個超級實用、使用頻率極高但幾乎全部 Git 教程都不重視的命令 git branch -avv,它用來查看所有分支信息:

上圖執行命令後顯示出有三行信息,依次說明:

第一行,開頭的星號表示當前所在分支,綠色的 master 是分支名,之因此是綠色,也是由於它是當前所在分支。後面第二項是版本號,第三項中括號裏面藍色的字,表示此分支跟蹤的遠程分支的名字,固然,這也是克隆遠程倉庫到本地時的默認設置 -- 建立 master 分支並自動跟蹤遠程同名分支;冒號後面白色文字表示本地分支領先其跟蹤的遠程分支一個提交。最後一項是提交時填寫的備註信息。

第二行,是 Git 指針信息,它指向遠程倉庫的 master 分支,這行信息暫不重要。

第三行,遠程分支信息,詳見第一行的解釋。

在執行 commit 命令時,有一個並不推薦的選項 -a ,它的做用是將未添加到暫存區的修改,也就是工做區的修改也一併提交,但會略過未被跟蹤的文件,好比新建文件 one.txt,此命令的完整格式:git commit -am xxxxx 。謹慎的作法是按照前文的順序,修改工做區 - 提交到暫存區 - 隨時使用 git status 查看倉庫狀態 - 將暫存區的修改提交到版本區生成一次新的提交。

最後一個環節,將本地新增的提交推送到 GitHub 遠程倉庫中,命令是 git push,後面不須要任何選項和參數,此命令會把本地倉庫 master 分支上的新增提交推送到遠程倉庫的同名分支上,由於當前所在的分支就是 master,並且上文提到,它已經跟蹤了遠程倉庫的同名分支:

此命令須要輸入用戶名和密碼,若是是 Linux 用戶,密碼爲隱藏數據,輸入時看不到。若是是 Windows,會彈出一個窗口,告訴你輸入用戶名和密碼,如圖所示。

推送成功後執行 git branch -avv 查看分支狀況:

如上圖所示,本地分支 master 與遠程分支 origin/master 的版本號一致,一般看兩個版本號是否一致,只需比對前四位。看一下網頁上的狀況:

徹底符合預期。

以上就是一次完整的修改 - 提交 - 推送操做。一次推送中能夠包含多個 git commit 操做,也就是多個提交能夠一塊兒推送。

版本回退

若是發現 one.txt 文件內容有誤,怎麼作?能夠修改此文件而後再次添加到暫存區、提交、推送,也能夠撤銷最近一次提交,修改文件後從新提交推送。如今使用後一種方法來演示撤銷提交的操做流程。

首先執行 git reset --soft HEAD^ 撤銷最近的一次提交,將修改還原到暫存區。--soft 表示軟退回,對應的還有 --hard 硬退回,後面會講到,HEAD^ 表示撤銷一次提交,HEAD^^ 表示撤銷兩次提交,撤銷 n 次能夠簡寫爲 HEAD~n。軟退回一個提交後執行 git branch -avv 命令查看分支信息:

能夠看到本地倉庫的 master 分支的版本號已經發生了變化,變成了前一次提交的版本號,中括號裏也有提示信息,本地分支 master 落後其跟蹤的遠程分支 origin/master 一個提交。

執行 git status 查看倉庫狀態,果真上一個提交中的修改所有扔回了暫存區:

再次修改 one.txt 文件,執行 git add . 命令將新的修改添加到暫存區,而後執行 git commit 命令生成新的提交:

處理 commit 時間線分叉

執行 git statusgit branch -avv 查看倉庫狀態和分支狀態:

能夠看到本地倉庫的 master 分支與遠程倉庫的 origin/master 分支在提交版本上有了衝突,又叫作提交時間線分叉。由於剛纔的提交操做不是基於遠程倉庫 origin/master 分支的最新提交版本,而是撤回了一個版本。這種狀況下也是能夠將本地 master 分支推送到遠程倉庫的,須要加一個選項 -f ,它是 --force 的簡寫,這就是強制推送:

執行 git branch -avv 看一下分支信息,本地 master 與遠程 master 的版本號一致,前四位都是 aeea,在瀏覽器上刷新 GitHub 頁面,結果如預期:

本地倉庫 commit 變化記錄

假設此時發現狀況不對,以前的那次版本號爲 e9ac 的提交是正確的,剛纔的版本回退操做全都是誤操做,怎麼辦?再次執行一次版本回退嗎?固然不須要,有 git reflog 命令,它會記錄本地倉庫全部分支的每一次版本變化。實際上只要本地倉庫不被刪除,隨你怎麼折騰,都能回退到任何地方。reflog 記錄只存在於本地倉庫中,本地倉庫刪除後,記錄消失。執行此命令以下圖所示:

怎麼回退到 e9ac 那個版本呢?能夠直接執行命令 git reset --hard [版本號] ,若是記不清版本號,也能夠根據上圖的信息,執行 git reset --hard HEAD@{2} 命令,其中 HEAD@{2} 就是上圖第 5 行第 2 列所示,這個命令的意思是回到當前分支最近兩次提交版本變化前:

還想反悔,剛纔仍是改錯了,怎麼辦?再執行一次便可,此次大括號裏就是 1 了:

重要的一點,本節所有命令中,只有 push 是須要聯網執行的,它對遠程倉庫進行了修改。

總結

本節內容包括:

  • Git 倉庫的三大區域
  • 修改工做區
  • 將工做區的修改添加到暫存區
  • 從暫存區撤銷修改到工做區
  • 查看提交歷史
  • 配置我的信息
  • 完成一次提交
  • 版本回退
  • 處理提交時間線分叉問題
  • 使用 git reflog 命令查看本地倉庫版本變化
相關文章
相關標籤/搜索