Git 入門教程

via runoob
更多關於git的好文章推薦:

  1. 阮一峯:常用命令總結
  2. 廖雪峯老師的教程
  3. 阮一峯: Git遠程操作詳解
  4. 阮一峯:Git 使用規範流程

一、配置

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

1. 用戶信息

配置個人的用戶名稱和電子郵件地址:

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

如果用了 --global 選項,那麼更改的配置文件就是位於你用戶主目錄下的那個,以後你所有的項目都會默認使用這裏配置的用戶信息。
如果要在某個特定的項目中使用其他名字或者電郵,只要去掉 --global 選項重新配置即可,新的設定保存在當前項目的 .git/config 文件裏。

2. 文本編輯器

$ git config --global core.editor emacs

3. 差異分析工具

還有一個比較常用的是,在解決合併衝突時使用哪種差異分析工具。比如要改用 vimdiff 的話:

$ git config --global merge.tool vimdiff

Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合併工具的輸出信息。

4. 查看配置信息

$ git config --list
http.postbuffer=2M
user.name=runoob
[email protected]

有時候會看到重複的變量名,那就說明它們來自不同的配置文件(比如 /etc/gitconfig 和 ~/.gitconfig),不過最終 Git 實際採用的是最後一個。

二、工作區、暫存區和版本庫

  1. 工作區:就是你在電腦裏能看到的目錄。
  2. 暫存區:英文叫stage, 或index。一般存放在 “.git目錄下” 下的index文件(.git/index)中,所以我們把暫存區有時也叫作索引(index)。
  3. 版本庫:工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。在這裏插入圖片描述
    圖中左側爲工作區,右側爲版本庫。在版本庫中標記爲 “index” 的區域是暫存區(stage, index),標記爲 “master” 的是 master 分支所代表的目錄樹。
    圖中我們可以看出此時 “HEAD” 實際是指向 master 分支的一個"遊標"。所以圖示的命令中出現 HEAD 的地方可以用 master 來替換。
    圖中的 objects 標識的區域爲 Git 的對象庫,實際位於 “.git/objects” 目錄下,裏面包含了創建的各種對象及內容。
    當對工作區修改(或新增)的文件執行 “git add” 命令時,暫存區的目錄樹被更新,同時工作區修改(或新增)的文件內容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的文件索引中。
    當執行提交操作(git commit)時,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會做相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。
    當執行 “git reset HEAD” 命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是工作區不受影響。
    當執行 "git rm --cached " 命令時,會直接從暫存區刪除文件,工作區則不做出改變。
    當執行 “git checkout .” 或者 "git checkout – " 命令時,會用暫存區全部或指定的文件替換工作區的文件。這個操作很危險,會清除工作區中未添加到暫存區的改動。
    當執行 “git checkout HEAD .” 或者 "git checkout HEAD " 命令時,會用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區和以及工作區中的文件。這個命令也是極具危險性的,因爲不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改動。

三、創建倉庫

1. git init

Git 使用 git init 命令來初始化一個 Git 倉庫,Git 的很多命令都需要在 Git 的倉庫中運行,所以 git init 是使用 Git 的第一個命令。
在執行完成 git init 命令後,Git 倉庫會生成一個 .git 目錄,該目錄包含了資源的所有元數據,其他的項目目錄保持不變(不像 SVN 會在每個子目錄生成 .svn 目錄,Git 只在倉庫的根目錄生成 .git 目錄)。

2. git clone

比如,要克隆 Ruby 語言的 Git 代碼倉庫 Grit,可以用下面的命令:

$ git clone git://github.com/schacon/grit.git

執行該命令後,會在當前目錄下創建一個名爲grit的目錄,其中包含一個 .git 的目錄,用於保存下載下來的所有版本記錄。
如果要自己定義要新建的項目目錄名稱,可以在上面的命令末尾指定新的名字:

$ git clone git://github.com/schacon/grit.git mygrit

四、基本操作

1. 獲取與創建項目命令

  1. git init

    $ mkdir runoob
    $ cd runoob/
    $ git init
    Initialized empty Git repository in /Users/tianqixin/www/runoob/.git/
    # 在 /www/runoob/.git/ 目錄初始化空 Git 倉庫完畢。

現在你可以看到在你的項目中生成了 .git 這個子目錄。 這就是你的 Git 倉庫了,所有有關你的此項目的快照數據都存放在這裏。

  1. git clone
$ git clone [email protected]:schacon/simplegit.git
Cloning into 'simplegit'...
remote: Counting objects: 13, done.
remote: Total 13 (delta 0), reused 0 (delta 0), pack-reused 13
Receiving objects: 100% (13/13), done.
Resolving deltas: 100% (2/2), done.
Checking connectivity... done.

默認情況下,Git 會按照你提供的 URL 所指示的項目的名稱創建你的本地項目目錄。 通常就是該 URL 最後一個 / 之後的項目名稱。如果你想要一個不一樣的名字, 你可以在該命令後加上你想要的名稱。

  1. 基本快照
    Git 的工作就是創建和保存你的項目的快照及與之後的快照進行對比。本章將對有關創建與提交你的項目的快照的命令作介紹。

  2. git add
    5. git status 命令用於查看項目的當前狀態。
    接下來我們執行 git add 命令來添加文件,現在我們再執行 git status,就可以看到這兩個文件已經加上去了。
    在這裏插入圖片描述
    新項目中,添加所有文件很普遍,我們可以使用 git add . 命令來添加當前項目的所有文件。
    現在我們修改 README 文件:在這裏插入圖片描述“AM” 狀態的意思是,這個文件在我們將它添加到緩存之後又有改動。改動後我們再執行 git add 命令將其添加到緩存中:在這裏插入圖片描述當你要將你的修改包含在即將提交的快照裏的時候,需要執行 git add。

  3. git status
    git status 以查看在你上次提交之後是否有修改。
    我演示該命令的時候加了 -s 參數,以獲得簡短的結果輸出。如果沒加該參數會詳細輸出內容:

  4. git diff
    尚未緩存的改動:git diff
    查看已緩存的改動: git diff --cached
    查看已緩存的與未緩存的所有改動:git diff HEAD
    顯示摘要而非整個 diff:git diff --stat
    git status 顯示你上次提交更新後的更改或者寫入緩存的改動, 而 git diff 一行一行地顯示這些改動具體是啥

  5. git commit
    使用 git add 命令將想要快照的內容寫入緩存區, 而執行 git commit 將緩存區內容添加到倉庫中。
    Git 爲你的每一個提交都記錄你的名字與電子郵箱地址,所以第一步需要配置用戶名和郵箱地址。
    接下來我們寫入緩存,並提交對 hello.php 的所有改動。在首個例子中,我們使用 -m 選項以在命令行中提供提交註釋。
    在這裏插入圖片描述現在我們已經記錄了快照。如果我們再執行 git status:在這裏插入圖片描述以上輸出說明我們在最近一次提交之後,沒有做任何改動,是一個"working directory clean:乾淨的工作目錄"。
    如果你沒有設置 -m 選項,Git 會嘗試爲你打開一個編輯器以填寫提交信息。 如果 Git 在你對它的配置中找不到相關信息,默認會打開 vim.
    如果你覺得 git add 提交緩存的流程太過繁瑣,Git 也允許你用 -a 選項跳過這一步

  6. git reset HEAD
    兩個文件修改後,都提交到了緩存區,我們現在要取消其中一個的緩存在這裏插入圖片描述
    現在你執行 git commit,只會將 README 文件的改動提交,而 hello.php 是沒有的。在這裏插入圖片描述可以看到 hello.php 文件的修改並未提交。
    這時我們可以使用以下命令將 hello.php 的修改提交:在這裏插入圖片描述簡而言之,執行 git reset HEAD 以取消之前 git add 添加,但不希望包含在下一提交快照中的緩存。

  7. git rm
    如果只是簡單地從工作目錄中手工刪除文件,運行 git status 時就會在 Changes not staged for commit 的提示。
    要從 Git 中移除某個文件,就必須要從已跟蹤文件清單中移除,然後提交。可以用git rm ,如果刪除之前修改過並且已經放到暫存區域的話,則必須要用強制刪除選項 -f,git rm -f ,
    如果把文件從暫存區域移除,但仍然希望保留在當前工作目錄中,換句話說,僅是從跟蹤清單中刪除,使用 --cached 選項即可,git rm --cached
    可以遞歸刪除,即如果後面跟的是一個目錄做爲參數,則會遞歸刪除整個目錄中的所有子目錄和文件。進入某個目錄中,執行此語句,會刪除該目錄下的所有文件和子目錄:git rm –r *

  8. git mv
    git mv 命令用於移動或重命名一個文件、目錄、軟連接。
    在這裏插入圖片描述

五、分支管理

1. 創建分支命令

git branch (branchname)

2. 切換分支命令

git checkout (branchname)當你切換分支的時候,Git 會用該分支的最後提交的快照替換你的工作目錄的內容, 所以多個分支不需要多個目錄。
合併分支命令:

3. 合併分支命令

git merge
開始前我們先創建一個測試目錄:
在這裏插入圖片描述

4. 增加修改分支

  1. 沒有參數時,git branch 會列出你在本地的分支。

    $ git branch

    • master
  2. 要手動創建一個分支。執行 git branch (branchname) 即可。

    $ git branch testing
    $ git branch
    * master
      testing

現在我們可以看到,有了一個新分支 testing。
當你以此方式在上次提交更新之後創建了新分支,如果後來又有更新提交, 然後又切換到了 testing 分支,Git 將還原你的工作目錄到你創建分支時候的樣子。
3. 當我們切換到 testing 分支的時候,我們添加的新文件 test.txt 被移除了。切換回 master 分支的時候,它們有重新出現了。在這裏插入圖片描述
4. 我們也可以使用 git checkout -b (branchname) 命令來創建新分支並立即切換到該分支下,從而在該分支中操作在這裏插入圖片描述如你所見,我們創建了一個分支,在該分支的上移除了一些文件 test.txt,並添加了 runoob.php 文件,然後切換回我們的主分支,刪除的 test.txt 文件又回來了,且新增加的 runoob.php 不存在主分支中。
使用分支將工作切分開來,從而讓我們能夠在不同開發環境中做事,並來回切換。

五、刪除分支

git branch -d (branchname)
$ git branch
* master
  testing
$ git branch -d testing
Deleted branch testing (was 85fc7e7).
$ git branch
* master

六、合併分支

一旦某分支有了獨立內容,你終究會希望將它合併回到你的主分支在這裏插入圖片描述以上實例中我們將 newtest 分支合併到主分支去,test.txt 文件被刪除。
合併完後就可以刪除分支:在這裏插入圖片描述

七、合併衝突

創建一個叫做 change_site 的分支,切換過去,我們將 runoob.php 內容改爲:創建一個叫做 change_site 的分支,切換過去,我們將 runoob.php 內容改爲:

<?php
echo 'runoob';
?>

在這裏插入圖片描述將修改的內容提交到 change_site 分支中。 現在,假如切換回 master 分支我們可以看內容恢復到我們修改前的(空文件,沒有代碼),我們再次修改 runoob.php 文件。在這裏插入圖片描述現在這些改變已經記錄到我的 “master” 分支了。接下來我們將 “change_site” 分支合並過來。在這裏插入圖片描述
我們將前一個分支合併到 master 分支,一個合併衝突就出現了,接下來我們需要手動去修改它。在這裏插入圖片描述在 Git 中,我們可以用 git add 要告訴 Git 文件衝突已經解決在這裏插入圖片描述現在我們成功解決了合併中的衝突,並提交了結果。

八、歷史

 git log

–oneline 選項來查看歷史記錄的簡潔的版本。–oneline 選項來查看歷史記錄的簡潔的版本。

git log --oneline

–graph 選項,查看歷史中什麼時候出現了分支、合併。以下爲相同的命令,開啓了拓撲圖在這裏插入圖片描述

用 --reverse 參數來逆向顯示所有日誌。
在這裏插入圖片描述

如果只想查找指定用戶的提交日誌可以使用命令:git log --author , 例如,比方說我們要找 Git 源碼中 Linus 提交的部分:

git log --author=Linus --oneline -5

如果你要指定日期,可以執行幾個選項:–since 和 --before,但是你也可以用 --until 和 --after。
例如,如果我要看 Git 項目中三週前且在四月十八日之後的所有提交,我可以執行這個(我還用了 --no-merges 選項以隱藏合併提交):

git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges

九、標籤

  1. 如果你達到一個重要的階段,並希望永遠記住那個特別的提交快照,你可以使用 git tag 給它打上標籤。
    $ git tag -a v1.0

  2. 如果我們忘了給某個提交打標籤,又將它發佈了,我們可以給它追加標籤。
    例如,假設我們發佈了提交 85fc7e7(上面實例最後一行),但是那時候忘了給它打標籤。 我們現在也可以:
    git tag -a v0.9 85fc7e7

  3. 查看所有標籤可以使用以下命令:$ git tag

  4. 指定標籤信息命令:
    git tag -a -m “runoob.com標籤”

  5. PGP簽名標籤命令:
    git tag -s -m “runoob.com標籤”

十、遠程倉庫

1. 添加遠程庫

git remote add [shortname] [url]

2. 生成 SSH Key

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

cat ~/.ssh/id_rsa.pub就能看到了,在github上配置好就能使用了
完整使用例子:

$ mkdir runoob-git-test                     # 創建測試目錄
$ cd runoob-git-test/                       # 進入測試目錄
$ echo "# 菜鳥教程 Git 測試" >> README.md     # 創建 README.md 文件並寫入內容
$ ls                                        # 查看目錄下的文件
README
$ git init                                  # 初始化
$ git add README.md                         # 添加文件
$ git commit -m "添加 README.md 文件"        # 提交併備註信息
[master (root-commit) 0205aab] 添加 README.md 文件
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

# 提交到 Github
$ git remote add origin [email protected]:tianqixin/runoob-git-test.git
$ git push -u origin master

3. 要查看當前配置有哪些遠程倉庫

git remote

4. 執行時加上 -v 參數,你還可以看到每個別名的實際鏈接地址。

在這裏插入圖片描述

5. 提取遠程倉庫

Git 有兩個命令用來提取遠程倉庫的更新。

  1. 從遠程倉庫下載新分支與數據:

git fetch

該命令執行完後需要執行git merge 遠程分支到你所在的分支。

  1. 從遠端倉庫提取數據並嘗試合併到當前分支:
    git merge

該命令就是在執行 git fetch 之後緊接着執行 git merge 遠程分支到你所在的任意分支。
假設你配置好了一個遠程倉庫,並且你想要提取更新的數據,你可以首先執行 git fetch [alias] 告訴 Git 去獲取它有你沒有的數據,然後你可以執行 git merge [alias]/[branch] 以將服務器上的任何更新(假設有人這時候推送到服務器了)合併到你的當前分支

6. 推送到遠程倉庫

git push [alias] [branch]

以上命令將你的 [branch] 分支推送成爲 [alias] 遠程倉庫上的 [branch] 分支,實例如下。

$ git add runoob-test.txt 
$ git commit -m "添加到遠程"
master 69e702d] 添加到遠程
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 runoob-test.txt

$ git push origin master    # 推送到 Github

7. 刪除遠程倉庫

git remote rm [別名]

8. 例子

origin    [email protected]:tianqixin/runoob-git-test.git (fetch)
origin    [email protected]:tianqixin/runoob-git-test.git (push)

# 添加倉庫 origin2
$ git remote add origin2 [email protected]:tianqixin/runoob-git-test.git

$ git remote -v
origin    [email protected]:tianqixin/runoob-git-test.git (fetch)
origin    [email protected]:tianqixin/runoob-git-test.git (push)
origin2    [email protected]:tianqixin/runoob-git-test.git (fetch)
origin2    [email protected]:tianqixin/runoob-git-test.git (push)

# 刪除倉庫 origin2
$ git remote rm origin2
$ git remote -v
origin    [email protected]:tianqixin/runoob-git-test.git (fetch)
origin    [email protected]:tianqixin/runoob-git-test.git (push)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章