Git的一些總結

版本控制是一種記錄一個或若干文件內容變化,以便將來查閱特定版本修訂情況的系統。 而對於Git這樣的分佈式版本控制系統 ,客戶端並不只提取最新版本的文件快照,而是把代碼倉庫完整地鏡像下來。這麼一來,任何一處協同工作用的服務器發生故障,事後都可以用任何一個鏡像出來的本地倉庫恢復。因爲每一次的提取操作,實際上都是一次對代碼倉庫的完整備份 。

1. 初次運行 Git 前的配置

Git 提供了一個叫做 git config的工具, 專門用來配置或讀取相應的工作環境變量。這些變量可以存放在以下三個不同的地方:

  • /etc/gitconfig 文件:系統中對所有用戶都普遍適用的配置。若使用 git config 時用 --system 選項,讀寫的就是這個文件。
  • ~/.gitconfig 文件:用戶目錄下的配置文件只適用於該用戶。若使用 git config 時用 --global 選項,讀寫的就是這個文件。
  • 當前項目的 Git 目錄中的配置文件(也就是工作目錄中的 .git/config 文件):這裏的配置僅僅針對當前項目有效。每一個級別的配置都會覆蓋上層的相同配置,所以 .git/config 裏的配置會覆蓋 /etc/gitconfig 中的同名變量。

1.1. 用戶信息

每次 Git 提交時都會引用這兩條信息,說明是誰提交了更新,所以會隨更新內容一起被永久納入歷史記錄:

$ git config --global user.name "John Doe"
$ git config --global user.email [email protected]

1.2. 在工作目錄中初始化新倉庫

要對現有的某個項目開始用 Git 管理,只需到此項目所在的目錄,執行:

$ git init

1.3. 添加版本控制文件

如果當前目錄下有幾個文件想要納入版本控制,需要先用 git add 命令告訴 Git 開始對這些文件進行跟蹤,然後提交:

$ git add * //所有文件
$ git add README.txt
$ git commit -m 'initial project version'

1.4. 從現有倉庫克隆

如果想對某個開源項目出一份力,可以先把該項目的 Git 倉庫複製一份出來,這就需要用到 git clone命令。

$ git clone git://github.com/xxx/xx.git
$ git clone git://github.com/xxx/xx.git rename

這兩者的唯一的差別就是,現在新建的目錄成了rename

2. 記錄每次更新到倉庫

工作目錄下面的所有文件都不外乎這兩種狀態:已跟蹤未跟蹤

  • 已跟蹤文件:指本來就被納入版本控制管理的文件,在上次快照中有它們的記錄,工作一段時間後,它們的狀態可能是未更新,已修改或者已放入暫存區。
  • 未跟蹤文件:所有其他文件,它們既沒有上次更新時的快照,也不在當前的暫存區域。

文件的狀態變化週期

2.1. 檢查當前文件狀態

要確定哪些文件當前處於什麼狀態,可以用 git status 命令。

2.2. 查看已暫存和未暫存的更新

如果要查看具體修改了什麼地方,可以用git diff 命令。

2.3. 提交更新

每次準備提交前,先用 git status 看下,是不是都已暫存起來了,然後再運行提交命令 git commit :

$ git commit

另外也可以用 -m 參數後跟提交說明的方式,在一行命令中提交更新:

$ git commit -m "details"

2.4. 移除文件

要從 Git 中移除某個文件,就必須要從已跟蹤文件清單中移除(確切地說,是從暫存區域移除),然後提交。可以用 git rm 命令完成此項工作,並連帶從工作目錄中刪除指定的文件,這樣以後就不會出現在未跟蹤文件清單中了。

如果刪除之前修改過並且已經放到暫存區域的話,則必須要用強制刪除選項 -f(譯註:即 force 的首字母),以防誤刪除文件後丟失修改的內容。

2.5. 移動文件

$ git mv file_from file_to

2.6. 查看提交歷史

默認不用任何參數的話,git log 會按提交時間列出所有的更新,最近的更新排在最上面。我們常用 -p 選項展開顯示每次提交的內容差異,用 -2 則僅顯示最近的兩次更新。

更詳細的介紹可以在這裏看到。

3. 撤消操作

3.1. 修改最後一次提交

有時候我們提交完了才發現漏掉了幾個文件沒有加,或者提交信息寫錯了。想要撤消剛纔的提交操作,可以使用 --amend 選項重新提交:

$ git commit --amend

如果剛纔提交時忘了暫存某些修改,可以先補上暫存操作,然後再運行 --amend 提交:

$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

上面的三條命令最終只是產生一個提交,第二個提交命令修正了第一個的提交內容。

4. 遠程倉庫的使用

遠程倉庫是指託管在網絡上的項目倉庫,可能會有好多個,其中有些你只能讀,另外有些可以寫。同他人協作開發某個項目時,需要管理這些遠程倉庫,以便推送或拉取數據,分享各自的工作進展。

4.1. 查看當前的遠程庫

要查看當前配置有哪些遠程倉庫,可以用 git remote 命令,它會列出每個遠程庫的簡短名字。

4.2. 添加遠程倉庫

要添加一個新的遠程倉庫,可以指定一個簡單的名字,以便將來引用,運行 git remote add [shortname][url]

git remote add pb git://github.com/paulboone/ticgit.git

4.3. 從遠程倉庫抓取數據

$ git fetch [remote-name]

此命令會到遠程倉庫中拉取所有你本地倉庫中還沒有的數據。運行完成後,你就可以在本地訪問該遠程倉庫中的所有分支,將其中某個分支合併到本地,或者只是取出某個分支,一探究竟。

4.4. 推送數據到遠程倉庫

git push [remote-name] [branch-name]

如果要把本地的 master 分支推送到 origin 服務器上(再次說明下,克隆操作會自動使用默認的 master 和 origin 名字),可以運行下面的命令:

$ git push origin master

4.5. 推送本地分支

git push (遠程倉庫名) (分支名)

git push origin master

5. Git 分支

Git 中的分支,其實本質上僅僅是個指向 commit 對象的可變指針。Git 會使用 master 作爲分支的默認名字。在若干次提交後,你其實已經有了一個指向最後一次提交對象的 master 分支,它在每次提交的時候都會自動向前移動。

由於 Git 中的分支實際上僅是一個包含所指對象校驗和(40 個字符長度 SHA-1 字串)的文件,所以創建和銷燬一個分支就變得非常廉價。說白了,新建一個分支就是向一個文件寫入 41 個字節(外加一個換行符)那麼簡單,當然也就很快了。

分支其實就是從某個提交對象往回看的歷史

5.1. 創建一個新的分支指針

比如新建一個 testing 分支,可以使用 git branch 命令:

$ git branch testing

這會在當前 commit 對象上新建一個分支指針。

插入後的示意圖

5.2. 切換分支

要切換到其他分支,可以執行 git checkout 命令。

$ git checkout testing

5.3. 新建並切換分支

要新建並切換到該分支,運行 git checkout 並加上 -b 參數:

$ git checkout -b iss53
Switched to a new branch 'iss53'

5.4. 合併

git merge 命令來進行合併 :

$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
 README | 1 -
 1 file changed, 1 deletion(-)

合併時出現了“Fast forward”的提示。由於當前 master 分支所在的提交對象是要併入的 hotfix 分支的直接上游,Git 只需把 master 分支指針直接右移。換句話說,如果順着一個分支走下去可以到達另一個分支的話,那麼 Git 在合併兩者時,只會簡單地把指針右移,因爲這種單線的歷史分支不存在任何需要解決的分歧,所以這種合併過程可以稱爲快進(Fast forward)。

這裏寫圖片描述

使用 git branch-d 選項執行刪除操作:

$ git branch -d hotfix
Deleted branch hotfix (was 3a0874c).

更多更全的解釋請看這裏

對於衝突的合併,需要使用對比工具對比來比較兩者的差異。需要人工檢測。(ubuntu的bs4可以使用)

5.6. 分支管理

  1. git branch 命令不僅僅能創建和刪除分支,如果不加任何參數,它會給出當前所有分支的清單 。
  2. 若要查看各個分支最後一個提交對象的信息,運行 git branch -v
  3. 要從該清單中篩選出你已經(或尚未)與當前分支合併的分支,可以用 --merged--no-merged 選項(Git 1.5.6 以上版本)。

5.7. 利用分支進行開發的工作流程

對於項目而言,可以建立長期分支特性分支(topic)。

這裏寫圖片描述

  • 長期分支:許多使用 Git 的開發者都喜歡用這種方式來開展工作,比如僅在 master 分支中保留完全穩定的代碼,即已經發布或即將發佈的代碼。與此同時,他們還有一個名爲 developnext 的平行分支,專門用於後續的開發,或僅用於穩定性測試 — 當然並不是說一定要絕對穩定,不過一旦進入某種穩定狀態,便可以把它合併到 master 裏。
  • 特性分支:一個特性分支是指一個短期的,用來實現單一特性或與其相關工作的分支。

這裏寫圖片描述

5.8. 刪除遠程分支

如果不再需要某個遠程分支了,比如搞定了某個特性並把它合併進了遠程的 master 分支(或任何其他存放穩定代碼的分支),可以用這個非常無厘頭的語法來刪除它:git push [遠程名] :[分支名]

$ git push origin :serverfix

一定要注意這條語句!

6. SSH

由於本地Git倉庫和倉庫之間的傳輸是通過SSH加密的,所以必須要讓倉庫認證你SSH key,在此之前,必須要生成SSH key。

6.1. 創建SSH Key

在windows下查看[c盤->用戶->自己的用戶名->.ssh]下是否有id_rsaid_rsa.pub文件,如果沒有需要手動生成。
打開git bash,在控制檯中輸入以下命令:

$ ssh-keygen -t rsa -C "[email protected]"

密鑰類型可以用 -t 選項指定。如果沒有指定則默認生成用於SSH-2的RSA密鑰。這裏使用的是rsa。

參考

  1. Git Book
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章