《GitHub 入門與實踐》閱讀筆記(第4章)

1. 基本操做

git init

$ mkdir git-tutorial # 新建目錄
$ cd git-tutorial # 進入目錄
$ git init # 初始化倉庫
  1. 執行初始化操做會生成一個 .git 目錄(該目錄存儲着管理當前目錄內容所需的倉庫數據);
  2. 文件的編輯等操做在工做樹中進行,而後記錄到倉庫中,以此管理文件的歷史快照;
  3. 若是想將文件恢復到原先的狀態,能夠從倉庫中調取以前的快照,在工做樹中打開。

git status

$ git status    # 顯示 Git 倉庫的狀態

git add

$ git add README.md     # 向暫存區添加文件
  1. 若是這是用 Git 倉庫的工做樹建立了文件,那麼該文件並不會被記入 Git 倉庫的版本管理對象當中(Untracked files);
  2. 要讓文件成爲管理對象,須要加入到暫存區(Stage 或者 Index);
  3. 暫存區是提交以前的一個臨時區域。

git commit

$ git commit -m "First commit" # 保存倉庫的歷史記錄
  1. 該命令將當前暫存區中的文件實際保存到倉庫的歷史記錄中;
  2. 經過這些記錄,咱們能夠在工做樹中復原文件;
  3. -m 參數後面的字符串稱做提交信息,是對這個提交的概述;
  4. 若是要記述詳細信息,請不加 -m,直接執行 git commit 命令。

git log

$ git log # 查看提交日誌
$ git log --pretty=short # 只顯示提交信息的第一行
$ git log README.md # 只顯示指定目錄、文件的日誌(README.md)
$ git log -p # 顯示文件的改動
$ git log -p README.md # 查看README.md 文件的提交日子以及提交先後的差異

git diff

$ git diff # 查看工做樹和暫存區的差異
$ git diff HEAD # 查看工做樹和最新提交的差異
PS:不妨養成這樣一個好習慣:在執行 git commit 命令以前先執行 git diff HEAD 命令,查看本次提交與上次提交之間有什麼差異,等確認完畢後再進行提交。這裏的 HEAD 是指向當前分支中最新一次提交的指針。

2. 分支的操做

master -----> master
        |---> feature-A
        |---> fix-B
  1. 建立分支後,每每會存在多個最新代碼狀態;
  2. master 分支是 Git 默認建立的分支,基本上全部開發都是以這個分支爲中心進行的;
  3. 不一樣分支進行不一樣的做業,等該分支完成以後再與 master 分支合併。
/---\ fix-B
master ---------------> master
        \--------/ feature-A

git branch

$ git branch # 顯示分支一覽表
* master # master 分支左側標有 `*`(星號),表示當前所在分支

git checkout -b

$ git checkout -b # 建立、切換分支

$ git checkout -b feature-A # 切換到 feature-A 分支並進行提交(下面兩條命令等同該條命令)

$ git branch feature-A # 建立 feature-A 分支
$ git checkout feature-A # 將當前分支切換爲 feature-A 分支

$ git checkout master # 切換到 master 分支

$ git checkout - # 切換回上一分支
  1. Git 與 SVN 不一樣,建立分支時不須要鏈接中央倉庫,這讓建立分支變得相對輕鬆;
  2. 當今大部分工做流程都用到了 特性(Topic)分支,即集中實現單一特性(主題),除此以外不進行任何做業的分支;
  3. 平常開發中,每每會建立數個特性分支,同時在此以外再保留一個隨時能夠發佈軟件的穩定分支;
  4. 穩定分支一般由 master 分支擔當;
  5. 基於特定主題的做業在特性分支中進行,主題完成後再與 master 分支合併。只要保持這樣一個開放流程,就能保證 master 分支能夠隨時供人查看。這樣一來,其餘開發者也能夠放心大膽地從 master 分支建立新的特性分支;
  6. 主幹分支是特性分支的原點,同時也是合併的終點。一般人們會用 master 分支做爲主幹分支;
  7. 有時咱們須要讓這個主幹分支老是配置在正式環境中,有時又須要用標籤 Tag 等建立版本信息,同時管理多個版本發佈。擁有多個版本發佈時,主幹分支也有多個。

git merge

下面演示如何將分支 feature-A 合併到 mastergit

首先,切換到 master 分支:github

$ git checkout master 
Switch to branch 'master'

而後合併 feature-A 分支:編輯器

爲了在歷史記錄中明確下本次分支合併,咱們須要建立合併提交。所以在合併時加上 --no-ff 參數。
$ git merge --no-ff feature-A

隨後編輯器會啓動,用於錄入合併提交的信息。隨後,feature-A 分支的內容就合併到 master 分支中了。學習

git log --graph

$ git log --graph # 用圖表形式輸出提交日誌
該命令能夠清楚看到特性分支的建立以及合併。

3. 更改提交的操做

git reset

/------> fix-B
master ---------------> master
        \------------/ feature-A
$ git reset --hard fd0cbf0d4a234f67sjdkfjklbj6786a # 回溯歷史版本
HEAD is now at fd0cbf0 Add index
  1. 要讓倉庫的 HEAD、暫存區、當前工做樹回溯到指定狀態,須要用到 git reset --hard 命令,只要提供目標時間點的哈希值,就能夠徹底恢復至該時間點的狀態;
  2. 使用 git reflog 命令能夠查看當前倉庫執行過的操做日誌,只要不進行 Git 的 GC (Garbage Collection,垃圾回收),就能夠經過日誌隨意調取近期的歷史狀態,就像給時間機器指定一個時間點,在過去將來中自由穿梭通常;
  3. 即使開發者錯誤執行了 Git 操做,基本也均可以利用 git reflog 命令恢復到原先的狀態,請務必牢記!(由於 git reflog 命令打印出來的操做前面都有版本哈希碼,能夠拿來使用)

git commit --amend

$ git commit -amend # 修改提交信息

git rebase -i

$ git rebase -i # 壓縮歷史

4. 推送至遠程倉庫

git remote add

$ git remove add origin git@github.com:github-book/git-tutorial.git # 添加遠程倉庫

git push

$ git push -u origin master # 推送至 master 分支

$ git checkout -b feature-D # 建立 feature-D 分支
$ git push -u origin feature-D # 推送至 feature-D 分支
  1. 參數 -u 能夠在推送的同時,將 origin 倉庫的 master 分支設置爲本地倉庫當前分支的 upstream(上游);
  2. 添加了這個參數,未來運行 git pull 命令從遠程倉庫獲取內容時,本地倉庫的這個分支就能夠直接從 originmaster 分支獲取內容,省去了另外添加參數的麻煩。

5. 從遠程倉庫獲取

git clone

$ git clone git@github.com:github-book/git-tutorial.git # 獲取遠程倉庫
$ git branch -a # 查看當前分支的相關信息
PS:參數 -a 能夠同時顯示本地倉庫和遠程倉庫的分支信息。

git pull

git pull origin feature-D # 獲取最新的遠程倉庫分支

6. 幫助深刻理解 Git 的資料

  • Pro Git 由就任於 GitHub 公司的 Scott Chacon 執筆,是一部零基礎的 Git 學習資料。
  • LearnGitBranching 是學習 Git 基本操做的網站。注重樹形結構的學習方式很是適合初學者,點擊右下角的地球標誌還可切換各類語言進行學習。
  • tryGit 可讓咱們正在 Web 上一邊操做一邊學習 Git 的基本功能(只有英文版)。
相關文章
相關標籤/搜索