Git使用

初始設置本地Git

首先來設置使用 Git 時的姓名和郵箱地址。名字請用英文輸入。php

$ git config --global user.name "Firstname Lastname"
$ git config --global user.email "your_email@example.com"

這個命令,會在「~/.gitconfig」中以以下形式輸出設置文件。linux

[user]
  name = Firstname Lastname
  email = your_email@example.com

想更改這些信息時,能夠直接編輯這個設置文件。這裏設置的姓名和郵箱地址會用在 Git 的 提交日誌中。因爲在 GitHub 上公開倉庫時,這裏的姓名和郵箱地址也會隨着提交日誌一同被公開,因此請不要使用不便公開的隱私信息。git

將 color.ui 設置爲 auto 可讓命令的輸出擁有更高的可讀性。github

$ git config --global color.ui auto

「~/.gitconfig」中會增長下面一行。shell

[color]
  ui = auto

這樣一來,各類命令的輸出就會變得更容易分辨。bash

注意:下面大多數命令是在Win下 git bash 中使用,固然,linux終端也可使用。框架

申請GitHub帳號及相關設置

設置SSH Key

GitHub 上鍊接已有倉庫時的認證,是經過使用了 SSH 的公開密鑰認證方式進行的。如今讓咱們來建立公開密鑰認證所需的 SSH Key,並將其添加至 GitHub。ssh

在 Git bash 運行下面的命令建立 SSH Key。編輯器

$ ssh-keygen -t rsa -C "your_email@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key
(/Users/your_user_directory/.ssh/id_rsa): 按回車鍵
Enter passphrase (empty for no passphrase): 輸入密碼
Enter same passphrase again: 再次輸入密碼

your_email@example.com的部分請改爲您在建立帳戶時用的郵箱地址。密碼須要在認證時輸入,請選擇複雜度高而且容易記憶的組合。輸入密碼後會出現提示已經建立密匙的提示,並告訴存儲位置以及相關信息。其中,id_rsa 文件是私有密鑰,id_rsa.pub 是公開密鑰ide

在 GitHub 中添加公開密鑰(Add SSH Key),從此就能夠用私有密鑰進行認證了。

在 Title 中輸入適當的密鑰名稱。Key 部分使用 id_rsa.pub 文件裏的內容。id_rsa.pub 的內容能夠用以下方法查看。

$ cat ~/.ssh/id_rsa.pub
ssh-rsa 公開密鑰的內容 your_email@example.com

添加後,帳戶郵箱會收到郵件提示。可使用以下命令測試用手中的私人密鑰與 GitHub 進行認證和
通訊。

$ ssh -T git@github.com

如果出現

The authenticity of host 'github.com (207.97.227.239)' can't be established.
RSA key fingerprint is fingerprint值 .
Are you sure you want to continue connecting (yes/no)? 輸入yes

出現以下結果即爲成功。

Hi hirocastest! You've successfully authenticated, but GitHub does not provide shell access.

建立新倉庫須要注意的細節

  • Initialize this repository with a README

在 Initialize this repository with a README 選項上打鉤,隨後GitHub 會自動初始化倉庫並設置 README 文件,讓用戶能夠馬上clone 這個倉庫。若是想向 GitHub 添加手中已有的 Git 倉庫,建議不要勾選,直接手動 push。

是剛剛建立的倉庫的頁面。

  • .gitignore

正如其名,這個設定會幫咱們把不須要在Git倉庫中進行版本管理的文件記錄在 .gitignore 文件中,省去了每次根據框架進行設置的麻煩。

  • GitHub Flavored Markdown

在 GitHub 上進行交流時用到的 Issue、評論、Wiki,均可以用 Markdown 語法表述,從而進行標記。準確地說應該是 GitHub Flavored Markdown(GFM)語法。該語法雖然是 GitHub 在 Markdown 語法基礎上擴充而來的,但通常狀況下只要按照本來的 Markdown 語法進行描述就能夠。

簡單試驗對已有倉庫的操做

clone

將代碼下載到了本地以倉庫名做爲文件夾名的文件夾中,可是與直接下載不一樣。

$ git clone git@github.com:hirocastest/Hello-World.git
Cloning into 'Hello-World'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
$ cd Hello-World

這裏會要求輸入 GitHub 上設置的公開密鑰的密碼。認證成功後,倉庫便會被 clone 至倉庫名後的目錄中。將想要公開的代碼提交至這個倉庫再 push 到 GitHub 的倉庫中,代碼便會被公開。

若是以前並未設置密碼,那麼這裏也就不用輸入。

添加本身的文件

本地文件想要加入,須要先加到本地倉庫。只有添加到其中,才能實現跟蹤管理。

這裏咱們編寫一個 hello_world.php 文件,用來輸出「Hello World!」。

因爲 hello_word.php 尚未添加至 Git 倉庫,因此顯示爲 Untracked
files。

$ git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# hello_world.php
nothing added to commit but untracked files present (use "git add" to track)

添加到本地倉庫,這樣一來,這個文件就進入了版本管理系統的管理之下。從此的更改管理都交由 Git 進行。經過 git add命令將文件加入暫存區,再經過 git commit 命令附加信息並提交。

$ git add hello_world.php
$ git commit -m "Add hello world script by php"
[master d23b909] Add hello world script by php
1 file changed, 3 insertions(+)
create mode 100644 hello_world.php

添加成功後,能夠經過 git log 命令查看提交日誌。

$ git log
commit d23b909caad5d49a281480e6683ce3855087a5da
Author: 你的信息
Date: 你的時間
Add hello world script by php

關於許可:實際使用時,只需將 LICENSE 文件加入倉庫,並在README.md 文件中聲明使用了何種許可協議便可。使用沒有聲明許可協議的軟件時,以防萬一最好直接聯繫著做者。

push

以後只要執行 push,GitHub 上的倉庫就會被更新。

$ git push
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 328 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:hirocastest/Hello-World.git
46ff713..d23b909 master -> master

本地新倉庫推送遠程

init

要使用 Git 進行版本管理,必須先初始化倉庫。

在包含全部要上傳的文件的目錄級別下:

$ git init

若是初始化成功,執行了 git init 命令的目錄下就會生成 .git 目錄。這個 .git 目錄裏存儲着管理當前目錄內容所需的倉庫數據。在 Git 中,咱們將這個目錄的內容稱爲「附屬於該倉庫的工做樹」。文件的編輯等操做在工做樹中進行,而後記錄到倉庫中,以此管理文件的歷史快照。

status

工做樹和倉庫在被操做的過程當中,狀態會不斷髮生變化。

$ git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)

結果顯示了咱們當前正處於 master 分支下。接着還顯示了沒有可提交的內容。所謂提交(Commit),是指「記錄工做樹中全部文件的當前狀態」。

add

要想讓文件成爲 Git 倉庫的管理對象,就須要用 git add 命令將其加入暫存區(Stage 或者 Index)中。暫存區是提交以前的一個臨時區域。

$ git add README.md
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: README.md
#

可見,新建的文件被加到了暫存區(注意關注輸出內容中括號中的內容,會有一些功能性的建議)

commit

能夠將當前暫存區中的文件實際保存到倉庫的歷史記錄中。經過這些記錄,咱們就能夠在工做樹中復原文件。

$ git commit -m "First commit"
[master (root-commit) 9f129ba] First commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.md

-m 參數後的 "First commit"稱做提交信息,是對這個提交的概述。如果不加 -m,直接執行 git commit 命令。執行後編輯器就會啓動,並顯示以下結果。

git commit -am "..." 命令一次完成 add,commit。

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: README.md
#

在編輯器中記述提交信息的格式以下。

* 第一行:用一行文字簡述提交的更改內容
* 第二行:空行
* 第三行之後:記述更改的緣由和詳細內容

只要按照上面的格式輸入,從此即可以經過確認日誌的命令或工具看到這些記錄。

在以 #(井號)標爲註釋的 Changes to be committed(要提交的更改)欄中,能夠查看本次提交中包含的文件。將提交信息按格式記述完畢後,請保存並關閉編輯器,以 #(井號)標爲註釋的行沒必要刪除。隨後,剛纔記述的提交信息就會被提交。

若是在編輯器啓動後想停止提交,請將提交信息留空並直接關閉編輯器,隨後提交就會被停止。

提交以後,工做樹狀態會提示沒有更改,由於處於最新狀態。

要修改上一條提交信息,可使用 git commit --amend 命令。

log

能夠查看什麼人在何時進行了提交或合併,以及操做先後有怎樣的差異。

針對剛纔

$ git log
commit 9f129bae19b2c82fb4e98cde5890e52a6c546922(指向這個提交的哈希值)
Author: ...
Date: ...
First commit(該提交的提交信息。)

若是隻想讓程序顯示第一行簡述信息,能夠在 git log 命令後加上 --pretty=short

$ git log --pretty=short
commit 9f129bae19b2c82fb4e98cde5890e52a6c546922
Author: ...
First commit

$ git log -p README.md

git log 命令後加上 -p 參數,文件的先後差
別就會顯示在提交信息以後。加上目錄名,便會只顯示該目錄下的日誌。若是加的是文件名,就會只顯示與該文件相關的日誌。

git log -- graph ——以圖表形式查看分支合併提交等信息。

diff

能夠查看 工做樹暫存區最新提交之間的差異。顯示的內容的內容中,「+」號標出的是新添加的行,被刪除的行則用「-」號標出。

要查看與最新提交的差異,請執行如下
命令。

$ git diff HEAD

這裏的 HEAD 是指向當前分支中最新一次提交
的指針。

branch

在進行多個並行做業時,咱們會用到分支。在這類並行開發的過程當中,每每同時存在多個最新代碼狀態。master 分支是 Git 默認建立的分支,所以基本上全部開發都是以這個分支爲中心進行的。不一樣分支中,能夠同時進行徹底不一樣的做業。等該分支的做業完成以後再與 master 分支合併。

git branch 命令能夠將分支名列表顯示,同時能夠確認當前所在分支。

分支左側標有「*」(星號),表示這是咱們當前所
在的分支。結果中沒有顯示其餘分支名,表示本地倉庫中只存在 master 一個分支。

若是想以當前的 master 分支爲基礎建立新的分支,咱們須要用到 git checkout -b命令。

$ git checkout -b feature-A
Switched to a new branch 'feature-A'

等同於:

$ git branch feature-A
$ git checkout feature-A

建立 feature-A 分支,並將當前分支切換爲 feature-A 分支。這時再來查看分支列表,會顯示咱們處於 feature-A 分支下。

在這個狀態下像正常開發那樣修改代碼、執行 git add 命令並進行提交的話,代碼就會提交至 feature-A 分支。

命令 git checkout - 能夠切換回上一個分支,固然指定名字也能夠。

主幹分支和特性分支

特性分支顧名思義,是集中實現單一特性(主題),除此以外不進行任何做業的分支。在平常開發中,每每會建立數個特性分支,同時在此以外再保留一個隨時能夠發佈軟件的穩定分支。穩定分支的角色一般由 master 分支擔當。

主幹分支是剛纔咱們講解的特性分支的原點,同時也是合併的終點。一般人們會用 master 分支做爲主幹分支。主幹分支中並無開發到一半的代碼,能夠隨時供他人查看。有時咱們須要讓這個主幹分支老是配置在正式環境中,有時又須要用標籤 Tag 等建立版本信息,同時管理多個版本發佈。擁有多個版本發佈時,主幹分支也有多個。

merge

接下來,咱們假設 feature-A 已經實現完畢,想要將它合併到主幹分支 master 中。爲了在歷史記錄中明確記錄下本次分支合併,咱們須要建立合併提交。所以,在合併時加上 --no-ff 參數,在主幹分支中執行

$ git merge --no-ff feature-A

隨後編輯器會啓動,用於錄入合併提交的信息。默認信息中已經包含了是從 feature-A 分支合併過來的相關內容,因此可沒必要作任何更改。將編輯器中顯示的內容保存,關閉編輯器會提示成功合併。

合併時可能發生衝突(Conflict),不解決,沒法合併。按提示解決就好。

reset

要讓倉庫的 HEAD 、暫存區、當前工做樹回溯到指定狀態,須要用到 git rest --hard 命令。只要提供 目標時間點的哈希值,就能夠徹底恢復至該時間點的狀態。

git log 命令只能查看以當前狀態爲終點的歷史日誌。因此這裏要使用 git reflog 命令,查看當前倉庫的操做日誌。在日誌中找出回溯歷史以前的哈希值,經過 git reset --hard 命令恢復到回溯歷史前的狀態。

在日誌中,咱們能夠看到 commit、checkout、reset、merge 等 Git 命令的執行記錄。只要不進行 Git 的 GC(Garbage Collection,垃圾回收),就能夠經過日誌隨意調取近期的歷史狀態。

rebase

在合併特性分支以前,若是發現已提交的內容中有些許拼寫錯誤等,不妨提交一個修改,而後將這個修改包含到前一個提交之中,壓縮成一個歷史記錄。

git rebase -i HEAD~2 方式執行 git rebase 命令,能夠選定當前分支中包含 HEAD(最新提交)在內的兩個最新歷史記錄爲對象,並在編輯器中打開。

出現相似

pick 7a34294 Add feature-C
pick 6fba227 Fix typo

6fba227 左側的 pick 部分刪除,改寫爲 fixup

pick 7a34294 Add feature-C
fixup 6fba227 Fix typo

保存編輯器裏的內容,關閉編輯器。提示 rebase 成功。這樣一來,Fix typo 就從歷史中被抹去,也就至關於 Add feature-C中歷來沒有出現過拼寫錯誤。這算是一種良性的歷史改寫。

remote add

在 GitHub 上新建一個倉庫。爲防止與其餘倉庫混淆,倉庫名請與本地倉庫保持一致。建立時請不要勾選 Initialize this repository with a README 選項。由於一旦勾選該選項,GitHub 一側的倉庫就會自動生成 README 文件,從建立之初便與本地倉庫失去了整合性。雖然到時也能夠強制覆蓋,但爲防止這一狀況發生仍是建議不要勾選該選項。

如今咱們用 git remote add 命令將github新建倉庫設置成本地倉庫的遠程倉庫。

$ git remote add origin 遠程倉庫路徑

按照上述格式執行 git remote add 命令以後,Git 會自動將遠程倉庫的名稱設置爲 origin(標識符)。

push

當前分支下本地倉庫內容推送到遠程倉庫。

假定在 master 分支下工做。

$ git push -u origin master

當前分支的內容就會被推送給遠程倉庫 originmaster 分支。

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

對於其餘分支,咱們在本地倉庫中建立了 feature-D 分支,如今將它 push 給遠程倉
庫並保持分支名稱不變。

$ git checkout -b feature-D
$ git push -u origin feature-D

獲取遠程倉庫其餘分支開發

不要與以前操做的倉庫在同一目錄下。執行 git clone 命令後咱們會默認處於 master 分支下,同時系統會自動將 origin 設置成該遠程倉庫的標識符。也就是說,當前本地倉庫的 master 分支與 GitHub 端遠程倉庫(origin)的 master 分支在內容上是徹底相同的。

git branch -a命令查看當前分支的相關信息。添加 -a 參數能夠同時顯示本地倉庫和遠程倉庫的分支信息。

若要獲取遠程特性分支 feature-D,可使用以下操做。

$ git checkout -b feature-D origin/feature-D

-b 參數的後面是本地倉庫中新建分支的名稱。爲了便於理解,咱們仍將其命名爲 feature-D,讓它與遠程倉庫的對應分支保持同名。新建分支名稱後面是獲取來源的分支名稱。

例子中指定了 origin/feature-D,就是說以遠程 origin 的倉庫的 feature-D 分支做爲來源,在本地倉庫中建立 feature-D 分支。更改添加提交推送便可。

$ git commit -am "Add feature-D"
$ git push

此時,本地分支中並未有內容,須要使用 pull

$ git pull origin feature-D

若是兩人同時修改了同一部分的源代碼,push 時就很容易發生衝突。因此多名開發者在同一個分支中進行做業時,爲減小衝突狀況的發生,建議更頻繁地進行 push 和 pull 操做。

相關文章
相關標籤/搜索