Git 常用命令詳解(二)

Git是一個很強大的分佈式版本管理工具,它不但適用於管理大型開源軟件的源代碼,管理私人的文檔和源代碼也有很多優勢,Git的更多介紹,請參考我的上一篇博客:Git版本管理工具

1、Git命令初識

在正式介紹Git命令之前,先介紹一下Git的基本命令和操作,對Git命令有一個總體的認識。示例:從Git版本庫的初始化,通常有兩種方式:

1、git clone:這是一種較爲簡單的初始化方式,當你已經有一個遠程的Git版本庫,只需要在本地克隆一份,例如:git clone git://github.com/someone/some_project.git

上面的命令就是將 git://github.com/someone/some_project.git 這個URL地址的遠程版本庫,完全克隆到本地some_project目錄下

2、git init和git remote:這種方式稍微複雜一些,當你本地創建了一個工作目錄,你可以進入這個目錄,使用 git init 命令進行初始化;Git以後就會對該目錄下的文件進行版本控制,這時候如果你需要將它放到遠程服務器上,可以在遠程服務器上創建一個目錄,並例如:git remote add origin git://github.com/someone/another_project.git

上面的命令就會增加URL地址爲 git://github.com/someone/another_project.git,名稱爲origin的遠程服務器,以後提交代碼的時候只需要使用origin別名即可。

2、Git常用命令

1、遠程倉庫相關命令

檢出倉庫:git clone git://github.com/jQuery/jquery.git
查看遠程倉庫:git remote -v
添加遠程倉庫:git remote add [name] [url]
刪除遠程倉庫:git remote rm [name]
修改遠程倉庫:git remote set-url –push [name] [newUrl]
拉取遠程倉庫:git pull [remoteName]
推送遠程倉庫:git push [remoteName] [localBranckName]

如果想把本地的某個分支test提交到遠程倉庫,並作爲遠程倉庫的master分支,或者作爲另外一個名叫test的分支,如下:
git push origin test:master // 提交本地test分支作爲遠程的master分支
git push origin test:test // 提交本地test分支作爲遠程的test分支

2、分支(branch)操作相關命令

查看本地分支:git branch
查看遠程分支:git branch -r
創建本地分支:git branch [name] —-注意新分支創建後不會自動切換爲當前分支
切換分支:git checkout [name]
創建新分支並立即切換到新分支:git checkout -b [name]
刪除分支:git branch -d [name] —-d選項只能選擇刪除已經參與合併的分支,對於未有合併的分支是無法刪除的。如果想強制刪除一個分支,可以使用 -D 選項
合併分支:git merge [name] —-將名稱爲[name]的分支與當前分支合併
創建遠程分支(本地分支 push 到遠程):git push origin [name]
刪除遠程分支:git push origin :head/[name] 或 git push origin :[name]

創建空的分支:(執行命令之前記得先提交你當前分支的修改,否則會被強制刪除)
git symbolic -ref HEAD refs/heads/[name]
rm .git/index
git clean -fdx

3、版本(tag)操作相關命令

查看版本:git tag
創建版本:git tag [name]
刪除版本:git tag -d [name]
查看遠程版本:git tag -r
創建遠程版本(本地版本 push 到遠程):git push origin [name]
刪除遠程版本:git push origin :refs/tags/[name]
合併遠程倉庫的 tag 到本地:git pull origin –tags
上傳本地tag到遠程倉庫:git push origin –tags
創建帶註釋的 tag:git tag -a [name] -m ‘yourMessage’

4、子模塊(submodule)相關操作命令

添加子模塊:git submodule add [url] [path]
如:git submodule add git://github.com/soberh/ui-libs.git src/main/webapp/ui-libs

初始化子模塊:git submodule init —-只在首次檢出倉庫時運行一次就行
更新子模塊:git submodule update —-每次更新或切換分支後都需要運行一下

刪除子模塊:(分4步)
1). git rm –cached [path]
2). 編輯 .gitmodules 文件,將子模塊的相關配置節點刪除掉
3). 編輯 .git/config 文件,將子模塊的相關配置節點刪除掉
4). 手動刪除子模塊殘留的目錄

5、忽略一些文件、文件夾不提交

在倉庫根目錄下創建名稱爲 .gitignore 的文件,寫入不需要的文件夾名或文件,每個元素佔一行即可,如:
target
bin
*.db

3、Git命令詳解

現在我們有了本地和遠程的版本庫,讓我們來試着用用Git的基本命令:
git pull:從其他的版本庫(既可以是遠程的也可以是本地的)將代碼更新到本地,例如:git pull origin master 就是將 origin 這個版本庫的代碼更新到本地的 master 主枝,該功能類似於 SVN 的update

git add:是將當前更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示記入了版本歷史中,這也是提交之前所需要執行的一步,例如 git add app/model/user.rb 就會增加 app/model/user.rb 文件到Git的索引中,該功能類似於 SVN 的add

git rm:從當前的工作空間中和索引中刪除文件,例如 git rm app/model/user.rb,該功能類似於 SVN rm、del

git commit:提交當前工作空間的修改內容,類似於 SVN 的 commit 命令,例如 git commit -m story #3, add user model,提交的時候必須用 -m 來輸入一條提交信息,該功能類似於 SVN 的 commit

git push:將本地 commit 的代碼更新到遠程版本庫中,例如 git push origin 就會將本地的代碼更新到名爲 origin 的遠程版本庫中

git log:查看歷史日誌,該功能類似於 SVN 的log

git revert:還原一個版本的修改,必須提供一個具體的 Git 版本號,例如 git revert bbaf6fb5060b4875b18ff9ff637ce118256d6f20,Git 的版本號都是生成的一個哈希值

上面的命令幾乎都是每個版本控制工具所公有的,下面就開始嘗試一下 Git 獨有的一些命令:

git branch:對分支的增刪改查等操作,例如 git branch new_branch 會從當前的工作版本創建一個叫做 new_branch 的新分支,git branch -D new_branch 就會強制刪除叫做 new_branch 的分支,git branch 就會列出本地所有的分支

git checkout:Git 的checkout 有兩個作用,其一是在不同的 branch 之間進行切換,例如 git checkout new_branch 就會切換到 new_branch 的分支上去;另一個功能是還原代碼的作用,例如 git checkout app/model/user.rb 就會將 user.rb 文件從上一個提交的版本中更新回來,未提交的內容全部會回滾

git rebase:用下面兩幅圖解釋會比較清楚一些,rebase 命令執行後,實際上是將分支點 C 移到了 G,這樣分支也就具有了從 C 到 G 的功能

這裏寫圖片描述

git reset:將當前的工作目錄完全回滾到指定的版本號,假設如下圖,我們有 A-G 五次提交的版本,其中 C 的版本號是 bbaf6fb5060b4875b18ff9ff637ce118256d6f20,我們執行了 git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20,那麼就只剩下了 A-C 三個提交的版本

這裏寫圖片描述

git stash:將當前未提交的工作存入 Git 工作棧中,時機成熟的時候再應用回來,這裏暫時提一下這個命令的用法,後面在技巧偏會重點講解

git config:利用這個命令可以新增、更改 Git 的各種設置,例如 git config branch.master.remote origin 就將 master 的遠程版本庫設置爲別名叫做 origin 版本庫,後面在技巧篇會利用這個命令個性化設置你的 Git,爲你打造獨一無二的 Git

git tag:可以將某個具體的版本打上一個標籤,這樣你就不需要記憶複雜的版本哈希值了,例如你可以使用 git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20 來標記這個被你還原的版本,那麼以後你想查看該版本時,就可以使用 revert_version 標籤名,而不是哈希值了

Git 之所以能夠提供方便的本地分支等特性,是與它的文件存儲機制有關的。Git 存儲版本控制信息時使用它自己定義的一套文件系統存儲機制,在代碼根目錄下有一個 .git 文件,會有如下這樣的目錄結構:

這裏寫圖片描述

有幾個比較重要的文件和目錄需要解釋一下:HEAD文件存放根節點的信息,其實目錄結構就表示一個樹形結構,Git 採用這種樹形結構來存儲版本信息,那麼 HEAD 就表示根;refs 目錄存儲了你在當前版本控制目錄下的各種不同引用(引用指的是你本地和遠程所用到的各個樹分支的信息),它有 heads、remotes、stash、tags 四個子目錄,分別存儲對不同的根、遠程版本庫、Git 棧和標籤的四種引用,你可以通過命令 git show-ref 更清晰地查看引用信息;logs 目錄根據不同的引用存儲了日誌信息。因此,Git 只需要代碼根目錄下的這一個 .git 目錄就可以記錄完整的版本控制信息,而不是像 SVN 那樣根目錄和子目錄下都有 .svn 目錄。那麼下面就來看一下 Git 與 SVN 的區別吧

4、Git 與 SVN 的比較

SVN(Subversion)是當前使用最多的版本控制工具。與它相比較,Git 最大的優勢在於兩點:易於本地增加分支和分佈式的特性。
下面兩幅圖可以形象的展示 Git 與 SVN 的不同之處:

這裏寫圖片描述

這裏寫圖片描述

1、本地增加分支
圖中 Git 本地和服務器端結構都很靈活,所有版本都存儲在一個目錄中,你只需要進行分支的切換即可達到在某個分支工作的效果

而SVN則完全不同,如果你需要在本地試驗一些自己的代碼,只能本地維護多個不同的拷貝,每個拷貝對應一個 SVN 服務器地址

舉一個實際的例子:使用 SVN 作爲版本控制工具,當正在試圖增強一個模塊,工作做到一半,由於會改變原模塊的行爲導致代碼服務器上許多測試的失敗,所以並沒有提交代碼。

這時候假如現在有一個很緊急的 BUG 需要處理,必須在兩個小時內完成。我只好將本地的所有修改 diff,並輸出成爲一個 patch 文件,然後回滾有關當前任務的所有代碼,再開始修改 BUG 的任務,等到修改好後,再將 patch 應用回來。前前後後要完成多個繁瑣的步驟,這還不計中間代碼發生衝突所要進行的工作量。

可是如果使用 Git,我們只需要開一個分支或者轉回到主分支上,就可以隨時開始 BUG 修改的任務,完成之後,只要切換到原來的分支就可以優雅的繼續以前的任務。只要你願意,每一個新的任務都可以開一個分支,完成後,再將它合併到主分支上,輕鬆而優雅。

2、分佈式提交

Git 可以本地提交代碼,所以在上面的圖中,Git 有利於將一個大任務分解,進行本地的多次提交,而 SVN 只能在本地進行大量的一次性更改,導致將來合併到主幹上造成巨大的風險。

3、日誌查看

Git的代碼日誌是在本地的,可以隨時查看

SVN的日誌在服務器上,每次查看日誌需要先從服務器上下載下來。

例如:代碼服務器在美國,當每次查看幾年前所做的工作時,日誌下載可能需要十分鐘,這不能不說是一個痛苦。但是如果遷移到 Git 上,利用 Git 日誌在本地的特性,查看某個具體任務的所有代碼歷史,每次只需要幾秒鐘,大大方便了工作,提高了效率。

當然分佈式並不是說用了 Git 就不需要一個代碼中心服務器,如果你工作在一個團隊裏,還是需要一個服務器來保存所有的代碼的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章