Git基礎命令篇

1、Git介紹

(1)Git是一個開源(Linus Torvalds 爲了幫助管理 Linux 內核開發而開發)的分佈式版本控制系統,用於敏捷高效地處理任何或小或大的項目,與經常使用的版本控制工具 CVS, SVN等不一樣,它採用了分佈式版本庫的方式,沒必要服務器端軟件支持。javascript

(2)Git 的工做區、暫存區和版本庫:html

  • 工做區:就是你在電腦裏能看到的目錄。
  • 暫存區:英文叫stage, 或index。通常存放在 ".git目錄下" 下的index文件(.git/index)中,因此咱們把暫存區有時也叫做索引(index)。
  • 版本庫:工做區有一個隱藏目錄.git,這個不算工做區,而是Git的版本庫。

2、安裝

Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平臺上運行。java

(1)Windows 上安裝 Git

在 Windows 平臺上安裝 Git 很容易,有個叫作 msysGit 的項目提供了安裝包,能夠到 GitHub 的頁面上下載 exe 安裝文件並運行(安裝包下載地址:https://gitforwindows.org/git

安裝成功後,就可使用命令行的 git 工具(已經自帶了 ssh 客戶端,右擊->"Git Bash")進行Git操做,另外還有一個圖形界面的 Git 項目管理工具web

(2)其餘安裝 參見菜鳥教程: http://www.runoob.com/git/git-install-setup.htmlwindows

3、使用

(1)基本使用

1. git init 能夠在任什麼時候候/目錄中建立新的 Git 倉庫,徹底是本地化的:

git init //在目錄中建立新的 Git 倉庫,缺省狀況下 Git 就會爲你建立"master"分支

建立完後會在項目中生成「 .git 」這個子目錄。 這就是你的 Git 倉庫了,全部有關你的此項目的快照數據都存放在這裏,eg:緩存

2.git clone 拷貝一個 Git 倉庫到本地進行查看修改:

git clone [url] //默認,Git 會用此 URL 最後一個「/」以後的名稱做爲本地項目名稱,你也能夠在該命令後加上你想要的名稱: git clone [url] <project name>

eg.:bash

首先,去coding(較流行的一個Git服務器)隨便找個項目,複製Git倉庫地址:服務器

而後,到本地計算機右擊選擇「git clone」:app

3.git add 將文件添加到緩存

新項目可使用  「git add .  」 命令遞歸地添加當前工做目錄中的全部文件。

4.git status 查看在你上次提交以後是否有修改

git status -s //查看狀態, -s表示short,若是不加會詳細輸出內容
/** git status -s 狀態碼解析*****************
  A: 你本地新增的文件(服務器上沒有).   
  C: 文件的一個新拷貝.   
  D: 你本地刪除的文件(服務器上還在).  
  M: 文件的內容或者mode被修改了.    
  R: 文件名被修改了。   
  T: 文件的類型被修改了。   
  U: 文件沒有被合併(你須要完成合並才能進行提交)。  
  X: 未知狀態(極可能是遇到git的bug了,你能夠向git提交bug report)  
  ?:未被git進行管理,可使用git add file1把file1添加進git能被git所進行管理
  這些狀態也會組合出現,eg:
 "AM" :意思是,這個文件在咱們將它添加到緩存以後又有改動,改動後咱們再執行 git add 命令將其添加到緩存中
 "UU" :
**/

5.git diff 查看執行 git status 的結果的詳細信息

git diff 比較工做目錄中當前文件和暫存區域快照之間的差別,也就是修改以後尚未暫存起來的變化內容。git status 顯示你上次提交更新後的更改或者寫入緩存的改動, 而 git diff 則一行一行地顯示這些改動具體是啥:

  • 還沒有緩存的改動:git diff
  • 查看已緩存的改動: git diff --cached
  • 查看已緩存的與未緩存的全部改動:git diff HEAD
  • 顯示摘要而非整個 diff:git diff --stat

6.git commit

 git add 將想要快照的內容寫入緩存區, git commit 則將緩存區內容添加到倉庫中。

git commit 
git commit -m "<message>" //使用 -m 選項以在命令行中提供提交註釋
git commit -a //把unstaged的文件變成staged(不包括新建(untracked)的文件)而後commit,通常仍是推薦先git add再git commit
git commit -am "<message>"//或 git commit –a –m "<message>",至關於git add . + git commit –m "<message>"合併使用
git commit --amend //增補提交,會使用與當前提交節點相同的父節點進行一次新的提交,舊的提交將會被取消.

Git 爲你的每個提交都記錄你的名字與電子郵箱地址,因此第一步須要配置用戶名和郵箱地址

7.git reset HEAD  取消以前 git add 已緩存的內容,但不包含在下一提交快照中的緩存。

HEAD關鍵字指的是當前分支最末梢最新的一個提交,也就是版本庫中該分支上的最新版本.

git reset HEAD //把add進去的文件從staged狀態取出來,能夠單獨針對某一個文件操做: git reset HEAD <filename>
git reset --mixed HEAD//--mixed是缺省參數,是將git的HEAD變了(也就是提交記錄變了),但文件目錄並無改變, 取消了commit和add的內容.
git reset --soft HEAD// 實際上,是git reset –mixed id 後,又作了一次git add.即取消了commit的內容.
git reset --hard HEAD//是將git的HEAD變了,文件也變了.
     按改動範圍排序以下:
     soft (commit) < mixed (commit + add) < hard (commit + add + local working)

8.git revert HEAD: 撤銷最近的一個提交:

  git revert會建立一個反向的新提交,能夠經過參數-n來告訴Git先不要提交.

9.git rm 從已跟蹤文件清單中移除某個文件:

若是隻是簡單地從工做目錄中手工刪除文件,運行 git status 時就會在 Changes not staged for commit 的提示。要從 Git 中移除某個文件,就必需要從已跟蹤文件清單中移除,而後提交:

git rm <file>
git rm -f <file> //若是刪除以前修改過而且已經放到暫存區域的話,則必需要用強制刪除選項 -f
git rm --cached <file>//僅從跟蹤清單中刪除,把文件從暫存區域移除但仍保留在當前工做目錄中使用
git rm –r * //遞歸刪除,即若是後面跟的是一個目錄作爲參數,則會遞歸刪除整個目錄中的全部子目錄和文件

10.git mv 命令用於移動或重命名一個文件、目錄、軟鏈接:

git mv <file> <new file>

11.git clean是從工做目錄中移除沒有track的文件:

git clean -d// -d表示同時移除目錄
git clean -f// -f表示force,由於在git的配置文件中, clean.requireForce=true,若是不加-f,clean將會拒絕執行.

12.git stash把當前的改動壓入一個棧:

git stash將會把當前目錄和index中的全部改動(但不包括未track的文件)壓入一個棧,而後留給你一個clean的工做狀態,即處於上一次最新提交處

git stash list//顯示這個棧的list.
git stash apply//取出stash中的上一個項目(stash@{0}),而且應用於當前的工做目錄.也能夠指定別的項目,如:git stash apply stash@{1}
git stash pop//在應用stash中項目的同時想要刪除它
git stash drop// 刪除上一個,也可指定參數刪除指定的一個項目
git stash clear// 刪除全部項目

13.git reflog 對reflog進行管理

reflog是git用來記錄引用變化的一種機制,好比記錄分支的變化或者是HEAD引用的變化,git會將變化記錄到HEAD對應的reflog文件中,其路徑爲 .git/logs/HEAD, 分支的reflog文件都放在 .git/logs/refs 目錄下的子目錄中

git reflog//不指定引用的時候,默認列出HEAD的reflog。HEAD@{0}表明HEAD當前的值,HEAD@{3}表明HEAD在3次變化以前的值.

 (2)Git 分支管理

幾乎全部版本控制系統都支持分支。使用分支能夠從開發主線上分離開來,在不影響主線的同時繼續工做。

1.建立分支:

git branch (branchname) //沒有參數時,git branch 會列出你在本地的分支。

2.切換分支:

當你切換分支的時候,Git 會用該分支的最後提交的快照替換你的工做目錄的內容, 因此多個分支不須要多個目錄。

git checkout (branchname) //該分支存在則切換到分之下不然建立新分支並當即切換到該分支下

3.合併分支:

Git 合併,不只僅是簡單的文件添加、移除的操做, 也會合並修改。你能夠屢次合併到統一分支, 也能夠選擇在合併以後直接刪除被併入的分支。

git merge (branchname)  //將此分支合併到主分支去
git checkout -b (branchname) //建立並切換到新的分支,至關於git branch newbranch + git checkout newbranch 合併使用
git checkout <filename>//此命令會使用HEAD中的最新內容替換掉你的工做目錄中的文件,已添加到暫存區的改動以及新文件都不會受到影響。會刪除該文件中全部沒有暫存和提交的改動,這個操做是不可逆的

合併出現衝突須要手動去修改它,而後:

git add // 解決了衝突要告訴 Git 文件衝突已經解決
git merge --abort//或者你也能夠取消merge

4.刪除分支:

git branch -d (branchname)

5.查看分支的最後一次提交:

git branch -v

(3)Git log查看提交日誌

Git 最爲出色的是它的合併跟蹤(merge tracing)能力。使用 git log 命令查看提交歷史:

git log
git log --oneline //查看歷史記錄的簡潔的版本
git log --reverse --oneline //逆向顯示全部日誌
git log --oneline --number //顯示number條,每條log只顯示一行
git log --oneline --graph //圖形化顯示分支合併歷史
git log branchname// 顯示特定分支的log
git log --oneline branch1 ^branch2//查看在分支1不在分支2中的log,^表示排除這個分支
git log --decorate//會顯示出tag信息
git log --grep //根據commit信息過濾log: git log --grep=keywords 默認狀況下, git log --grep --author是OR的關係,即知足一條即被返回,若是你想讓它們是AND的關係,能夠加上--all-match的option
git log -S: filter by introduced diff ,如: git log -SmethodName (注意S和後面的詞之間沒有等號分隔).
git log -p//每個提交都是一個快照(snapshot),Git會把每次提交的diff計算出來,做爲一個patch顯示給你看,另外一種方法是git show [SHA].
git log --stat//一樣是用來看改動的相對信息的,--stat比-p的輸出更簡單一些.
//--no-merges能夠將merge的commits排除在外.

用 --graph 選項,開啓了拓撲圖選項,能夠更清楚明瞭地查看歷史中何時出現了分支、合併,eg.:

$ git log --oneline --graph
*   88afe0e Merge branch 'change_site'
|\  
| * d7e7346 changed the site
* | 14b4dca 新增長一行
|/  
* 556f0a0 removed test2.txt
* 2e082b7 add test2.txt
* 048598f add test.txt
* 85fc7e7 test comment from runoob.com

若是隻想查找指定用戶的提交日誌可使用命令:git log --author ,eg.:

$ git log --author=Linus --oneline -5 //找 Git 源碼中 Linus 提交的部分
81b50f3 Move 'builtin-*' into a 'builtin/' subdirectory
3bb7256 make "index-pack" a built-in
377d027 make "git pack-redundant" a built-in
b532581 make "git unpack-file" a built-in
112dd51 make "mktag" a built-in

若是你要指定日期,能夠執行幾個選項:--since 和 --before, --until 和 --after,eg.:

$ git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges //看 Git 項目中三週前且在四月十八日以後的全部提交,我能夠執行這個, --no-merges 選項以隱藏合併提交
5469e2d Git 1.7.1-rc2
d43427d Documentation/remote-helpers: Fix typos and improve language
272a36b Fixup: Second argument may be any arbitrary string
b6c8d2d Documentation/remote-helpers: Add invocation section
5ce4f4e Documentation/urls: Rewrite to accomodate transport::address
00b84e9 Documentation/remote-helpers: Rewrite description
03aa87e Documentation: Describe other situations where -z affects git diff
77bc694 rebase-interactive: silence warning when no commits rewritten
636db2c t3301: add tests to use --format="%N"

(4)Git 標籤

1.若是你但願永遠記住重要的階段那個特別的提交快照,你可使用 git tag 給它打上標籤,eg.:

git tag -a v1.0 //給最新一次提交打上(HEAD)"v1.0"的標籤,-a 選項意爲"建立一個帶註解的標籤",不用 -a 選項也能夠執行的,但它不會記錄這標籤是啥時候打的,誰打的,也不會讓你添加個標籤的註解。推薦建立帶註解的標籤

2.查看標籤:

$ git tag//查看全部標籤
v0.9
v1.0

3.若是咱們忘了給某個提交打標籤,又將它發佈了,咱們能夠給它追加標籤,eg.:

$ git tag -a v0.9 85fc7e7 //給發佈提交的 85fc7e7 追加標籤
$ git log --oneline --decorate --graph
*   88afe0e (HEAD, tag: v1.0, master) Merge branch 'change_site'
|\  
| * d7e7346 (change_site) changed the site
* | 14b4dca 新增長一行
|/  
* 556f0a0 removed test2.txt
* 2e082b7 add test2.txt
* 048598f add test.txt
* 85fc7e7 (tag: v0.9) test comment from runoob.com

4.指定標籤信息:

git tag -a <tagname> -m "<message>"

5.PGP簽名標籤:

git tag -s <tagname> -m "<message>"

6.刪除標籤:

git tag -d <tagname>

7.查看某個標籤版本所修改的內容:

git show <tagname>

4、Git倉庫

Git 並不像 SVN 那樣有個中心服務器。 Git 命令都是在本地執行,若是你想經過 Git 分享你的代碼或者與其餘開發人員合做。 你就須要將數據放到一臺其餘開發人員可以鏈接的服務器上。

(1)添加遠程庫

要添加一個新的遠程倉庫,能夠指定一個簡單的名字,以便未來引用,命令格式以下:

git remote add [shortname] [url]

目前流行的Git倉庫有不少,使用最多的有:GitHub、Coding(兼具SVN、Git)。具體的使用如同普通的軟件同樣很簡單,能夠直接上手

(2)使用Git倉庫

1.查看當前的遠程庫

由於不須要每次都用完整的url,因此Git爲每個remote repo的url都創建一個別名,而後用git remote來管理這個list,若是你clone一個project,Git會自動將原來的url添加進來,別名就叫作:origin

git remote// 列出remote aliases.
git remote -v//查看每個別名對應的實際url.
git remote add [alias] [url]// 添加一個新的remote repo.
git remote rm [alias]// 刪除一個存在的remote alias.
git remote rename [old-alias] [new-alias]//重命名
git remote set-url [alias] [url]//更新url, 能夠加上—push和-fetch參數,爲同一個別名set不一樣的存取地址.

2.提取遠程倉庫

git fetch //取全部你本地沒有的數據,取下來的分支(remote branches)和本地分支同樣(能夠看diff、log、merge),可是Git不容許你checkout到它們
git fetch [alias]//取某一個遠程repo
git fetch --all//取到所有repo

3.推送到遠程倉庫

① 從遠程倉庫下載新分支與數據

 若是有多我的向同一個remote repo push代碼, Git會首先在你試圖push的分支上運行git log,檢查它的歷史中是否能看到server上的branch如今的tip,若是本地歷史中不能看到server的tip,說明本地的代碼不是最新的,Git會拒絕你的push,讓你先fetch,merge,以後再push,這樣就保證了全部人的改動都會被考慮進來

git push [alias] [branch] // 把當前分支merge到alias上的[branch]分支,若是分支已經存在,將會更新,若是不存在,將會添加這個分支.
git push (remote-name) (branch-name) //(local-branch)缺省就意味着刪除remote-branch

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

git merge [alias]/[branch] 

git rebase不會產生合併的提交,它會將本地的全部提交臨時保存爲補丁(patch)放在」.git/rebase」目錄中,而後將當前分支更新到最新的分支尖端、最後把保存的補丁應用到分支上。

//rebase的過程當中,也許會出現衝突,Git會中止rebase並讓你解決衝突,在解決完衝突以後,用git add去更新這些內容,而後無需執行commit,只須要: 
git rebase --continue//就會繼續打餘下的補丁
git rebase --abort//終止rebase,當前分支將會回到rebase以前的狀態

4.刪除遠程倉庫

git remote rm [別名]

5.git pull 缺省參數== fetch + merge FETCH_HEAD

git pull//== git pull --merge,先執行git fetch,而後執行git merge把取來的分支的head merge到當前分支產生一個新的commit   
git pull --rebase//先執行git fetch,而後執行git rebase

(3)本身搭建Git 倉庫

你也能夠搭建屬於本身的Git服務器,參見:http://www.runoob.com/git/git-server.html

一、安裝Git

$ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel
$ yum install git

建立一個git用戶組和用戶,用來運行git服務:

$ groupadd git
$ useradd git -g git

二、建立證書登陸

收集全部須要登陸的用戶的公鑰,公鑰位於id_rsa.pub文件中,把咱們的公鑰導入到/home/git/.ssh/authorized_keys文件裏,一行一個。若是沒有該文件建立它:

$ cd /home/git/
$ mkdir .ssh
$ chmod 755 .ssh
$ touch .ssh/authorized_keys
$ chmod 644 .ssh/authorized_keys

三、初始化Git倉庫

選定一個目錄做爲Git倉庫:

$ cd /home
$ mkdir gitrepo
$ chown git:git gitrepo/
$ cd gitrepo

$ git init --bare runoob.git
Initialized empty Git repository in /home/gitrepo/runoob.git/

以上命令Git建立一個空倉庫,服務器上的Git倉庫一般都以.git結尾。而後,把倉庫所屬用戶改成git:

$ chown -R git:git runoob.git

四、克隆倉庫

$ git clone git@192.168.45.4:/home/gitrepo/runoob.git
Cloning into 'runoob'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.

5、目前主流的代碼編譯器都已集成了版本控制系統

以webstorm爲例,安裝了git後就可使用:

分別是:拉取、提交

branch(分支)管理

右擊項目名,就能看到git選項

ps:webstorm自身的local history能夠看到編譯日誌(項目運行後存放在webstorm生成的「.idea文件夾」)。右擊項目名,就能看到local history選項

打開後能夠看到每次修改的記錄,你還能夠revert還原代碼,以下:

相關文章
相關標籤/搜索