Git使用教程

是的,這跟上一篇文章同樣同是新手向教程,主要記錄我經常使用的Git操做和一些使用技巧和注意事項,但願能夠幫到你。html

這篇教程須要讀者懂點Command Line,不懂的話能夠看一下我另一篇文章:herenode

基礎知識

什麼是Git?
Git 是一個命令行工具的集合,它能夠幫你跟蹤和記錄文件的更改(源代碼,圖片等一切你想跟蹤回訪的)。有了它你能夠恢復舊版本的項目,甚至能夠比較、分析、合拼和修改等。這個過程咱們稱爲版本控制。除了Git以外,咱們還有SVN,Mercurial,Perforce,CVS,Bitkeeper等,幫助咱們實現版本控制git

Git的特色?
Git是分佈式的,咱們不須要一個主服務器來託管咱們的項目的各個版本,相反,它是工做在你本地磁盤上的文件夾,這個存儲着Git管理的項目的文件夾,咱們稱爲repository。同時,你也能夠把你的項目的副本放到線上,如Github或Gitlab,知足多人協做和項目代碼共享的須要github

安裝Git

這裏只列出macOS的安裝,主要經過 homebrew 來安裝數組

brew install git

若是你太新手的話,這裏再推薦兩個客戶端軟件,GitHub Desktop and Sourcetreebash

配置Git

安裝完成後,咱們須要添加一些配置信息。其餘Git有不少配置項須要去填寫,這裏咱們就先去填寫最重要的兩項,user.nameuser.email服務器

打開終端,輸入下面內容編輯器

git config --global user.name "My Name"
git config --global user.email myEmail@example.com

配置好這兩項,這樣每對Git操做一次都會帶上上面你輸入的信息,從而跟蹤每次操做是誰在作分佈式

更多瞭解能夠查看:hereide

建立Repository

上面咱們已經提到了,Git管理和存儲文件是在你磁盤的文件夾上進行的。在終端輸入下面內容

cd ~/node
mkdir git-demo
cd git-demo
git init

git init這句命令會告訴Git這個文件夾是特別的,同時也會在該文件夾下再建立一個.git文件夾用來存儲歷史信息和配置信息

初始化後會有下面的信息顯示

Initialized empty Git repository in /Users/chakhsu/node/git-demo/.git/

說明咱們的Git Repository已經建立完畢,不過裏面是空的,咱們須要建立一個文件hello.txt

touch hello.txt

查看Repo狀態

git status能夠幫助咱們查看當前Repository的狀態,包括哪些文件更新了,哪些是新添,哪些是被刪除了等等

git status

On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    hello.txt

nothing added to commit but untracked files present (use "git add" to track)

這裏返回的信息,就是上面咱們添加的文件。這段信息告訴咱們該文件是新的,但git還不知道是否須要去跟蹤它仍是要選擇忽略它,因此咱們進入 Git Staging 的學習

操做Stage狀態

Git有一個「staging area」的概念。你能夠把它想象爲你的學生時期的書包,裏面有各類做業本和書本(既是你的文件),這些做業本有些完成了做業,有些完成了一部分,有些還未作,甚至有些仍是新的。你能夠經過git add選擇哪些做業本是須要提交的,這些被選擇的做業本就進入了Stage狀態,等待最後被git commit

若是選擇其中一個文件,則以下

git add hello.txt

若是選擇所有,則以下

git add -A

若是隻選擇修改過的文件,不包括新增的文件和還未commit過的文件,則以下

git add .

咱們這裏執行第一個選擇,而後查看Git狀態,以下

git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   hello.txt

發現Git已經知道了咱們的hello.txt已經作好被提交上去的準備了

若是咱們要取消hello.txt這個文件的Stage狀態(取消add),則以下

git reset hello.txt

操做Commit狀態

將Staging的項目commit一下,就是將當前項目所在的Repository給定一個時間點狀態,同時還要加一段描述去簡述此次的commit的內容,就像平時說的快照,咱們能夠隨時回去看看它怎麼樣

git commit -m "Initial commit."

[master (root-commit) b1adc8d] Initial commit.
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 hello.txt

這句話的意思,跳過編輯器直接輸入 commit 簡述,完成提交,並顯示一些信息

咱們還能夠這樣,以下

git commit -am "Initial commit."

這句話的意思是,先執行git add .再跳過編輯器直接輸入 commit 簡述,完成提交

若是咱們要修改上一次 commit 的簡述,以下

git commit --amend

而後跳出編輯器,讓你修改當前的簡述

若是咱們要取消剛剛的 commit ,但要保留修改過的文件或者項目,以下

git reset HEAD^ --soft

若是咱們要回到上一次commit乾淨的狀態,以下

git reset HEAD^ --hard

遠程Repo

上面的基礎知識是在本地上操做,全部的commit都是僅存在項目裏的.git文件夾內。雖然本地的Repository是夠用的,但大多數的狀況下,咱們須要共享或者部署咱們的項目到線上,或者是託管到遠程Repositories

鏈接遠程Repo

這個時候,須要咱們到Github上註冊帳號,而後在上面建立空的Repository,假設咱們已經都註冊好和建立好Repository

這個Repository的地址是https://github.com/chakhsu/lilicia.git,這裏的地址須要換成你本身的,這裏只是做爲教程使用

而後,打開終端輸入 以下

git remote add origin https://github.com/chakhsu/lilicia.git

一個項目可能有多個遠程Repositories,爲了區分不一樣的遠程Repositories,咱們就要給他們起不一樣的名字,這裏的origin,就是這支Repositories的名字

上傳到服務器

剛剛咱們已經連上了遠程Repositories,但上面尚未任何東西,須要咱們把commit好的文件上傳到遠程Repositories

git push origin master

Counting objects: 3, done.
Writing objects: 100% (3/3), 211 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/chakhsu/lilicia.git
 * [new branch]      master -> master

這裏的git push還會要求你輸入你的github的用戶名和密碼才能運行push

還有git push是帶有兩個參數,一個是遠程Repo的名稱(咱們這裏稱爲origin)和分支push(master是每一個Repo的默認分支)

克隆Repo

上面我已經把本地的Repo上傳到Github上了,別人就能在Github上查看和瀏覽Repo上的東西,甚至能克隆到他們本身的本地上,以下

git clone https://github.com/chakhsu/lilicia.git

Repo就會在本地上自動建立,且本地上Repo版本爲Github上的版本

獲取更新

你更新了Repo,別人能夠經過git pull更新線上的Repo到本身的本地Repo

git pull origin master

From https://github.com/chakhsu/lilicia
 * branch            master     -> FETCH_HEAD
Already up-to-date.

這裏的pull指下載遠程的Repo而且合併本地的Repo

一樣地你能夠這樣獲取別人的Repo

Branches管理

當咱們須要開發一個新的功能,最好的實踐是複製原始項目,在其副本上完成開發,這個副本咱們稱爲分支(Branches)。這條分支有本身的版本控制,每次的修改都會跟其餘項目有所區分,直到你決定合併它們。

分支管理的好處:

  • 對於已經穩定工做的版本的代碼將不會有任何影響

  • 多人協做共同開發

  • 開發者能夠在本身的分支上完成開發,不會受他人的影響

  • 當不肯定那個功能更好時,能夠開出更多的分支,進行對比

建立分支

每個Repo的默認分支都叫master,建立其餘分支,使用git branch <name>,以下

git branch baranch-one

或者git checkout -b <name>

git checkout -b  baranch-one

意思是建立該分支而且切換到該分支

至此,咱們的baranch-one就建立完成,跟master分支上的版本一致

查看分支

列出全部本地branch

git branch

列出全部遠程branch

git branch -r

列出全部本地以及遠程branch

git branch -a

切換分支到baranch-one

git checkout baranch-one

合併分支

上面咱們已經建立好分支baranch-one,須要咱們選擇該分支,而後進入,以下

git branch
baranch-one
* master
git checkout baranch-one

而後咱們給該分支建立feature.txt,而後addcommit

touch feature.txt
git add feature.txt
git commit -m "New feature complete."

接着,咱們須要切換master分支上

git checkout master

下面這步就是合併分支

git merge baranch-one

合併以後,原來的baranch-one已經不須要了,能夠刪除了,以下

git branch -d baranch-one

進階教程

這部分可能會在咱們的平常開發過程當中用到,知道而且會用就能夠了

檢查commits

咱們每一次的commit都有隨機生成一個惟一id,它由一串數字和字母組成,若是要查看全部commit以及它的id,咱們能夠用git log,以下

git log

commit 108e80c5d06dc802c2000d7085dcd2bd4162e666
Author: Your Name <youname@mail.com>
Date:   Sun Feb 26 00:56:14 2017 +0800

    Initial commit.

若是要查看具體的某次commit,咱們能夠用git show [commit],以下

git show 108e80c5

commit 108e80c5d06dc802c2000d7085dcd2bd4162e666
Author: Your Name <youname@mail.com>
Date:   Sun Feb 26 00:56:14 2017 +0800

    Initial commit.

diff --git a/hello.txt b/hello.txt
new file mode 100644
index 0000000..e69de29

若是要查看兩次commit之間的不一樣,咱們能夠用 git diff [commit-from]..[commit-to],這裏就不演示了

恢復文件

上面其實已經提到了,這裏再補充說明

git checkout hello.txt
git checkout 108e80c5 hello.txt

這兩個命令,前者是將hello.txt恢復到最近一次的commit狀態,然後者則是指定恢復到某個commit的狀態

處理合並衝突

不少時候,咱們常常要進行多人協做,共同開發,咱們不停地操做着建立分支合併分支。在這個過程當中,就有可能會出現合併衝突。

讓咱們來看一下例子。首先咱們建立了兩個分支,分別叫branch-chakhsubranch-ping,都要在同一個文件中寫一個函數來顯示數組的全部元素

假設這個同一個文件爲showarray.js

branch-chakhsu分支的寫法,以下

// Use a for loop to console.log contents.
for(var i=0; i<arr.length; i++) {
    console.log(arr[i]);
}

branch-ping分支的寫法,以下

// Use forEach to console.log contents.
arr.forEach(function(item) {
    console.log(item);
});

而後咱們都對上面兩個分支合併,而後就會報錯

git checkout master
git merge branch-chakhsu
git merge branch-ping

Auto-merging showarray.js
CONFLICT (content): Merge conflict in showarray.js
Automatic merge failed; fix conflicts and then commit the result.

而後咱們打開showarray.js,發現

<<<<<<< HEAD
// Use a for loop to console.log contents.
for(var i=0; i<arr.length; i++) {
    console.log(arr[i]);
}
=======
// Use forEach to console.log contents.
arr.forEach(function(item) {
    console.log(item);
});
>>>>>>> Ping's commit.

<<<<<<< HEAD=======之間是當前咱們所在的分支的commit內容

=======>>>>>>> Ping's commit.是咱們要合併的branch-ping分支的內容

這個時候咱們要作決定選擇是兩個都要留下,仍是選擇其中一個或者改爲本身想要的內容,這裏改爲咱們想要的內容

刪除<<<<<<< HEAD>>>>>>> Ping's commit.之間的內容,修改成

// Not using for loop or forEach.
// Use Array.toString() to console.log contents.
console.log(arr.toString());

將修正的文件加入到stage狀態,而後從新commit一次,以下

git add showarray.js
git commit -m "Array printing conflict resolved."

合併衝突就此解決了。當咱們發生衝突的時候,處理步驟以下

  • 將發生衝突的文件打開編輯,處理內容

  • 使用git add將處理好的文件加入stage

  • 重複上面兩個步驟,直到全部衝突處理完畢

  • git commit提交,完成

配置 .gitignore

不少時候,咱們並不須要全部文件都須要git add,尤爲當咱們使用git add -A的時候,這個命令是選擇全部文件進入stage狀態。有什麼辦法能夠避免?那就是配置.gitignore文件

下面這些文件或者文件夾是能夠被忽略

  • 日誌文件(log)

  • 程序運行任務建立的文件夾

  • Node.js中的node_modules文件夾

  • IDE建立的文件

  • 和一些開發者本身的我的文件

根據上面的清單,咱們能夠修改.gitignore文件的內容爲

*.log
build/
node_modules/
.idea/
my_notes.txt

總結

寫了很久,本身也看了挺多資料,也算是一次大複習,另外,文章可能有錯誤,歡迎指正

這裏再列出編寫這篇教程發現到資料,但願能幫到你

  • Git官方文檔:here

  • Git的客戶端:here

  • GitHub Git 備忘單:here

  • Github 練習小遊戲:here

  • .gitignore在線生成器:here

教程編寫結合了實踐和參考了下面文章

tutorialzine.com/2016/06/learn-git-in-30-minutes/
blog.gogojimmy.net/2012/01/21/how-to-use-git-2-basic-usage-and-worflow/

歡迎訪問個人博客:https://www.linpx.com/

相關文章
相關標籤/搜索