強大的版本管理工具 Git

Git 簡介

git 是一款免費、開源的分佈式版本控制系統,用於敏捷高效地處理任何或小或大的項目。是 linux 創始人 Linus Torvalds 爲了幫助管理 linux 內核開發而開發的一個開放源碼的版本控制軟件。最初 git 的開發是爲了輔助 linux 內核開發的過程,由於 git 免費而又超級好用,如今已經成爲最流行的分佈式版本控制系統,尤爲是 2008 年, github 網站上線了,它爲開源項目免費提供 git 存儲,無數開源項目開始遷移至 github 。

Git 安裝

提供了各類平臺的安裝方法,跟着說明安裝便可。html

以 windows 系統爲例,安裝完後打開 git bash 命令行工具,輸入 git --version 查看安裝的 git 版本node

alsy@home-alsy MINGW64 /
$ git --version
git version 2.11.0.windows.3

打印出版本信息說明你已經成功安裝 git 了linux

 Git 的相關設置

1. 自報家門,設置你的姓名和 email 

$ git config --global user.name "your_name"
$ git config --global user.email "your_email"

注意: git config 命令的 --global 參數,這時你這臺電腦上全部的 git 倉庫都會使用這個配置,固然你也能夠針對某個倉庫指定不一樣的用戶名和 email 地址。git

2. 設置 git 輸出顯示顏色,看起來更醒目

$ git config --global color.ui true

3. 關於 git config

查看倉庫級的config,命令:git config --local -lgithub

查看全局級的config,命令:git config --global -lwindows

查看系統級的config,命令:git config --system -l緩存

注意配置文件的優先級是: 倉庫 > 全局 > 系統bash

查看當前生效的配置,命令:git config -l,這個時候會顯示最終三個配置文件計算後的配置信息服務器

$ git config --local -l
$ git config --system -l
$ git config --global -l
$ git config -l

Git 工做流

你的本地倉庫由 git 維護的三棵「樹」組成。ssh

第一個是你的工做區, 它持有實際文件,就是你在文件資源管理器中看到的。

第二個是暫存區(stage),它像個緩存區域,臨時保存你的改動。

最後是HEAD,它指向你最後一次提交的結果。

Git 相關操做

1. 建立新倉庫 

在一個空的工做目錄中開始,建立一個名爲 learngit 的空目錄, 而後建立一個名爲 a.txt 的文件。

$ mkdir learngit
$ cd learngit
$ touch a.txt
$ ls
a.txt

你如今有一個包含單個文件的目錄,執行 git init 命令,從該目錄建立 git 倉庫。git 會自動建立的一個分支叫 master。

$ git init
Initialized empty Git repository in G:/learngit/.git/

2. 檢查倉庫的狀態

使用 git status 命令檢查當前倉庫的狀態,這是個比較經常使用的命令。

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

3. 將更改提到暫存區

使用 git add <file> 命令將文件更改提交到暫存區,當有多個文件時使用 git add . 命令提交全部文件的修改包括新建的文件。

$ git add a.txt
$ git add .

使用 git status 查看倉庫的狀態

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

4. 把暫存區的內容提交到當前分支(默認爲 master)

這裏會有一個 HEAD 指針指向 master 分支,而且 HEAD 指針老是指向你的當前分支。

$ git commit
[master (root-commit) 91c0959] first commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a.txt

執行 git commit 命令,會調出文本編輯器,提示你輸入一段本次提交的描述。

你也可使用 git commit -m 'first commit' 來快速的進行描述提交,若是發現提交的描述有誤或者不恰當可使用 git commit --amend 命令來對最近提交的描述信息進行替換

使用 git status 查看倉庫的狀態

$ git status
On branch master
nothing to commit, working tree clean

5. 查看歷史提交記錄

使用 git log 命令查看

$ git log
commit 91c0959fab89f5a612db84f047bf13afb1162a26
Author: alsy <2944927590@qq.com>
Date:   Sat Mar 25 14:10:44 2017 +0800

    first commit

這時列出了咱們第一次提交的記錄

下面咱們來更改 a.txt 的內容, 再次提交來查看記錄

$ echo 'some modified' > a.txt //向a.txt寫入'some modified'

$ git status //查看倉庫的狀態
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   a.txt

no changes added to commit (use "git add" and/or "git commit -a")

$ git commit -a -m 'second commit' //這是暫存和提交一塊兒操做的縮寫,後面跟描述
[master e9df1e3] second commit
 1 file changed, 2 insertions(+)

$ git log //查看記錄

commit e9df1e351fc321d4c63bfe9f76773759a03012e2
Author: alsy <2944927590@qq.com>
Date: Sat Mar 25 14:50:36 2017 +0800

second commit

commit 91c0959fab89f5a612db84f047bf13afb1162a26
Author: alsy <2944927590@qq.com>
Date: Sat Mar 25 14:10:44 2017 +0800

first commit
View Code

咱們能夠看到咱們這兩次提交的記錄

6. 撤銷修改

文件的撤銷修改能夠分爲三個時間點的撤銷

a. 修改了文件,沒有 add 到暫存區

$ echo 'some modified ~' >> a.txt //往 a.txt 追加 'some modified ~'

$ cat a.txt //輸出 a.txt 的內容
some modified
some modified ~

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   a.txt

no changes added to commit (use "git add" and/or "git commit -a")
View Code

能夠看到咱們修改了 a.txt 文件,此時查看狀態,git 會提示你是要 git add <file> 去提交更改仍是 git checkout -- <file> 去丟棄更改,固然這裏咱們是要丟棄更改

$ git checkout -- a.txt

$ git status
On branch master
nothing to commit, working tree clean

$ cat a.txt
some modified
View Code

此時 a.txt 有恢復到原來的狀態

b. add 到暫存區,沒有 commit 到分支

$ echo 'some modified ~' >> a.txt

$ git add a.txt

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
        modified:   a.txt
View Code

能夠看到咱們修改了 a.txt 文件而且把它提交到暫存區,此時查看狀態,git 會提示你 git reset HEAD <file> 把暫存區的修改撤銷掉(unstage),從新放回工做區

$ git reset HEAD a.txt
Unstaged changes after reset:
M       a.txt

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   a.txt

no changes added to commit (use "git add" and/or "git commit -a")
View Code

執行 git reset HEAD a.txt 命令後,咱們查看狀態,能夠看到暫存區是乾淨的,工做區的 a.txt 有修改,和第 1 種狀況同樣

c. commit 到分支

$ echo 'some modified ~' >> a.txt

$ git commit -a -m 'add some modified'
[master 533f16a] add some modified
 1 file changed, 1 insertion(+)

$ git st
On branch master
nothing to commit, working tree clean

$ git log
commit 533f16a192ff11cbc5fa92643780155e50dcab60
Author: alsy <2944927590@qq.com>
Date:   Sat Mar 25 15:48:52 2017 +0800

    add some modified

commit 71b53372b30d69648a4c2516d73fa3563197ec08
Author: alsy <2944927590@qq.com>
Date:   Sat Mar 25 14:50:36 2017 +0800

    second commits

commit 91c0959fab89f5a612db84f047bf13afb1162a26
Author: alsy <2944927590@qq.com>
Date:   Sat Mar 25 14:10:44 2017 +0800

    first commit
View Code

能夠看到咱們已經把修改 commit 到分支了,這時咱們能夠採用兩種方式來撤銷

(1) git revert [ HEAD | commit-ish ]

$ git revert HEAD
[master e1f8ce3] Revert "add some modified"
 1 file changed, 1 deletion(-)

$ git log
commit e1f8ce3351bd1bf0e2532c8f1e227c995bbc48e0
Author: alsy <2944927590@qq.com>
Date:   Sat Mar 25 15:59:21 2017 +0800

    Revert "add some modified"

    This reverts commit 533f16a192ff11cbc5fa92643780155e50dcab60.

commit 533f16a192ff11cbc5fa92643780155e50dcab60
Author: alsy <2944927590@qq.com>
Date:   Sat Mar 25 15:48:52 2017 +0800

    add some modified

commit 71b53372b30d69648a4c2516d73fa3563197ec08
Author: alsy <2944927590@qq.com>
Date:   Sat Mar 25 14:50:36 2017 +0800

    second commits

commit 91c0959fab89f5a612db84f047bf13afb1162a26
Author: alsy <2944927590@qq.com>
Date:   Sat Mar 25 14:10:44 2017 +0800

    first commit
View Code

能夠看到 git revert 是生成一個新的提交來撤銷某次提交,這次提交以前的 commit 都會被保留

(2) git reset [ --soft | --mixed | --hard ]  [ HEAD^ | commit-sh ]

  • --soft

保留源碼,只回退到 commit 信息到某個版本,不回退暫存,若是還須要提交,直接commit便可。 

  • --mixed

保留源碼,回退 commit 和暫存信息到某個版本。

git reset 默認是 --mixed 模式  

git reset --mixed  等價於  git reset

  • --hard

源碼也會回退到某個版本,commit 和 index 都會回退到某個版本。

$ echo 'some modified ~' >> a.txt

$ git commit -a -m 'git reset test'

$ git log
commit 7c7c69f2b891b4368fd4d59c31827793e41ceac5
Author: alsy <2944927590@qq.com>
Date:   Sat Mar 25 16:31:08 2017 +0800

    git reset test

commit e1f8ce3351bd1bf0e2532c8f1e227c995bbc48e0
Author: alsy <2944927590@qq.com>
Date:   Sat Mar 25 15:59:21 2017 +0800

    Revert "add some modified"

    This reverts commit 533f16a192ff11cbc5fa92643780155e50dcab60.

commit 533f16a192ff11cbc5fa92643780155e50dcab60
Author: alsy <2944927590@qq.com>
Date:   Sat Mar 25 15:48:52 2017 +0800

    add some modified

commit 71b53372b30d69648a4c2516d73fa3563197ec08
Author: alsy <2944927590@qq.com>
Date:   Sat Mar 25 14:50:36 2017 +0800

    second commits

commit 91c0959fab89f5a612db84f047bf13afb1162a26
Author: alsy <2944927590@qq.com>
Date:   Sat Mar 25 14:10:44 2017 +0800

$ git reset --hard HEAD^
HEAD is now at e1f8ce3 Revert "add some modified"

$ cat a.txt
some modified
View Code

git revert 是用一次新的 commit 來回滾以前的 commit,git reset 是直接刪除指定的 commit。

7. 分支的管理

a. 建立分支

使用 git branch <branch_name> 來建立一條新的分支 

$ git branch dev

$ git branch
  dev
* master

咱們在 master 基礎上建立了一條 dev 分支,git branch 命令能夠幫助咱們查看全部的本地分支,而且在當前分支前帶有 * 號標記

b. 切換分支

使用 git checkout <branch_name> 來切換分支

$ git checkout dev
Switched to branch 'dev'

$ git branch
* dev
  master

看到咱們已經處於 dev 分支上了

c. 合併分支

如今咱們在 dev 分支上作一些修改

$ echo 'some modified on dev' >> a.txt

$ git commit -a -m 'some modified on dev'

咱們要將 dev 分支上的代碼合併到master,使用 git merge <branch_name> 來合併分支

$ git checkout master
Switched to branch 'master'

$ git merge dev
Updating e1f8ce3..0209ed1
Fast-forward
 a.txt | 1 +
 1 file changed, 1 insertion(+)

$ cat a.txt
some modified

some modified on dev
View Code

能夠看到此時 dev 上的修改已經到 master 上了

8. 遠程倉庫

遠程倉庫其實和本地倉庫同樣,只不過是做爲一個代碼提交、共享的平臺,通常也不會有人直接在上面作提交修改。github 是免費 git 倉庫的託管平臺,咱們能夠在 github 建立一個倉庫做爲咱們的遠程倉庫。固然咱們也能夠本身搭建 git服務器,來建立咱們的遠程倉庫。以 github 爲例:

a. 建立ssh key :

$ cd ~/.ssh/
$ ls
github_rsa  github_rsa.pub  id_rsa  id_rsa.pub

看看這個目錄下有沒有 id_rsa 和 id_rsa.pub 這兩個文件,若是沒有則執行如下命令來建立:

$ ssh-keygen -t rsa -C "youremail"

id_rsa 是私鑰, id_rsa.pub 是公鑰,咱們須要把公鑰添加到 github , 把 id_rsa.pub 裏面的內容添加到 github 上:

這樣咱們纔有權限去推送代碼

b. 建立遠程倉庫

c. 本地關聯遠程倉庫

咱們能夠根據 github 上給出的提示來與遠程倉庫進行關聯,即:

$ git remote add origin https://github.com/2944927590/node-practice.git

$ git push origin master
Counting objects: 13, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (13/13), 1.03 KiB | 0 bytes/s, done.
Total 13 (delta 0), reused 0 (delta 0)
To https://github.com/2944927590/node-practice.git
 * [new branch]      master -> master
View Code

咱們可使用 git push --set-upstream origin master 讓本地的 master 分支與遠程倉庫的 master 分支創建鏈接,這樣咱們能夠直接使用 git push 來將本地 master 分支代碼推送到遠程 master 分支

$ git push --set-upstream origin master
Branch master set up to track remote branch master from origin.
Everything up-to-date

$ git push
Everything up-to-date
View Code

d. 拉取最新代碼

git pull 命令來拉取遠程倉庫的最新代碼到本地,這裏須要指出 git pull 至關於 git fetch(取下更改) 和 git merge (合併到本地分支)兩條命令

$ git pull
Already up-to-date.
View Code

9. Git 設置別名

$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
$ git config --global alias.st status
$ git config --global alias.lg log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

這樣 git checkout 等命令能夠用 git co 等代替了,固然你能夠對其餘命令設置別名。

10. 實際開發中的分支

通常咱們在項目開發中,會有一個 master 分支做爲整個項目的主分支,也就是實際上線的代碼分支;同時可能還會有一個 dev 分支,做爲開發環境的代碼分支;有的還會有一個 qa 分支,做爲測試環境的代碼分支;咱們都是在爲這三條分支服務。好比咱們接到新的需求,開始建立分支,首先切到 master 分支,git pull 拉取最新的代碼,建立一個本身的開發分支 task , 咱們在 task 分支上開始寫咱們的代碼,merge 到 dev 分支進行開發調試,merge 到 qa 分支進行測試,最後 merge 到 master 分支上線。

拓展閱讀

相關文章
相關標籤/搜索