Git使用方法教程&Git與SVN區別
工作到現在一直使用的版本控制管理器都是SVN,最近開始接觸學習Git,下面是筆者根據教程,整理出的一些實用性比較強的簡單命令。在文章的後面附上Git與SVN的一些區別。
一、Git使用教程 1. git四大域git四大域:工作目錄,暫存區,倉庫,遠端倉庫。git對檔案的操作都是在四大域上進行的,檔案可以在四大域內與四大域間進行各種操作。(有一個例外,進行“git stash”系列操作時,檔案可能被儲存到四大域外的堆疊中)
git四大域 2. git常用命令 git常用命令1. 設定 1).config命令
git config --global user.name lavor:配置全域性使用者名稱,若不要“--global”或者將“global”改為“local”則表示配置區域性使用者名稱
:配置全域性電子郵箱
git config --global alias.cm commit:配置別名,為git命令配置別名,還可以配置複合操作,比如git config --global alias.pom 'push origin master',注意複合操作中不可以帶-與""
git config --list:顯示所有配置資訊
2).help命令
git help:顯示幫助資訊,會顯示一些常見git命令及其意義
2. 建立專案 1).init命令
:在本地初始化一個git倉庫
2).clone命令
git clone [email protected]:lavor-zl/Github-Git.git:從遠端伺服器克隆一個倉庫到本地
3. 基本操作 1).add命令
git add README:新增工作目錄的檔案到暫存區
2).status命令
git status:顯示工作樹的狀態,一般有三種狀態Untracked files :未被跟蹤的檔案,表示是工作目錄新增加的檔案
Changes not staged for commit:工作目錄中修改了檔案,但是沒有被新增到暫存區
:新增到暫存區的檔案,等待提交
3).commit命令
git commit -m "提交訊息":提交暫存區的檔案,帶有提交訊息
git commit -a -m "提交訊息":跳過暫存區,直接提交工作目錄中所有改變的檔案,但是不能提交工作目錄中新增的檔案
git commit --author=lavor -m "提交訊息":提交暫存區的檔案,並重寫提交作者
git commit --date=06.13.2016T09:00:00 -m "提交訊息":提交暫存區的檔案,並重寫提交日期
git commit --amend -m "提交訊息":通過建立一個新的提交,以替換當前分支的前端。所代表的含義就是在最新一次提交的基礎上進行提交。比如我們完成了最新一次提交,並且這次提交完成後我們對工作目錄進行了一些修改,但是我們發現某個檔案忘了新增到暫存區並提交,我們可以先新增該檔案到暫存區,然後利用該命令進行提交。
4).reset命令
git reset:將暫存區的所有檔案重置到當前分支的HEAD
git reset <commit> files:將暫存區的指定檔案重置到指定的<commit>,<commit>既可以是commit的hash(或者hash前7位)也可以是HEAD及其祖先,HEAD~1 表示HEAD的父親,是HEAD的前一次提交,沒有<commit>時預設是HEAD 。
git reset [--hard|soft|mixed|merge|keep] [<commit>]:將當前的分支重設到指定的<commit>,並且根據mode有可能更新暫存區和工作目錄。mode的取值可以是hard、soft、mixed、merged、keep。
hard:重置暫存區與工作目錄到指定提交,刪除<commit>之後的所有提交併將HEAD指向該提交,此操作危險指數較大(應慎用) soft:暫存區與工作目錄不會變化,僅僅刪除<commit>之後的所有提交併將HEAD指向該提交 mixed:預設的,重置暫存區到指定提交,刪除<commit>之後的所有提交併將HEAD指向該提交 merge與keep用的比較少,暫時不討論HEAD 是指向當前分支引用的指標,該指標指向在該分支上的最後一個提交的指標。這意味著HEAD將是下一個建立的提交的父親。一般來說,把你的HEAD作為你最後一次提交的快照,是最簡單的。HEAD~1表示HEAD的前一次提交,HEAD~2表示HEAD的前兩次提交,以此類推
5).rm命令
git rm files:刪除工作目錄的檔案
git rm -f files:強制刪除工作目錄的檔案,不做更新檢查
git rm --cached files:刪除暫存區的檔案
6).mv命令
git mv oldfile newfile:為檔案重新命名
git mv files dir:移動檔案到指定目錄
git mv -f oldfile newfile:強制為檔案重新命名,即使目標檔案已存在
git mv -f files dir:強制移動檔案到指定目錄名,即使目標檔案已存在
4. 分支與合併 1).branch命令
git branch:檢視所有分支
git branch branchname:建立分支
git branch branchname <commit>:以特定提交為基建立分支
git branch -d branchname:刪除分支
git branch -D branchname:強制刪除分支
git branch -m [oldbranchname] newbranchname:移動或者刪除分支
git branch -M [oldbranchname] newbranchname:強制移動或者刪除分支
git branch -r:列出所有被跟蹤的遠端分支
git branch -r -d branchname:刪除被跟蹤的遠端分支
git branch -a:列出所有本地分支與被跟蹤的遠端分支
2).checkout命令
git checkout:檢查本地倉庫分支與遠端倉庫分支的差異
git checkout branchname|tagname:切換分支或切換到指定tag,同名時優先切換分支
git checkout tags/tagname:切換到指定tag
git checkout -b branchname:新建分支並切換到該分支上
git checkout -B branchname:強制新建分支並切換到該分支上
3).merge命令
git merge branchname:將指定分支合併到當前分支上(預設附帶提交操作),在merge後面使用-m <message>表示提交訊息
git merge <commit>:將指定提交合併到當前分支上
git merge oldbranchname newbranchname:將oldbranchname分支合併到newbranchname分支上
git merge --squash branchname:將指定分支上所有修改放入當前分支工作目錄與暫存區,不提交
git merge no--squash branchname:將指定分支上所有修改放入當前分支工作目錄與暫存區,並提交
4).mergetool命令
git mergetool:在“merge”命令執行之後出現衝突時執行該命令,用來解決合併的衝突,衝突解決完了不要忘了提交
5).stash命令
git stash:儲藏工作目錄與暫存區的狀態到堆疊中
git stash pop [[email protected]{id}]:恢復到指定儲藏的狀態(預設是最近一次儲藏的狀態),並從堆疊中移除該儲藏
git stash apply [[email protected]{id}]:恢復到指定儲藏的狀態(預設是最近一次儲藏的狀態)
git stash drop [[email protected]{id}]:並從堆疊中移除指定儲藏(預設是最近一次儲藏)
git stash list:顯示所有儲藏資訊
6).tag命令 同大多數 VCS 一樣,Git 也可以對某一時間點上的版本打上標籤。
git tag:列出所有標籤
git tag -l 'v1.*':列出符合一定條件的標籤
git tag tagname:新建標籤
5. 分享與更新專案 1).fetch命令
git fetch:下載遠端倉庫“origin”到本地
git fetch remoterepository:下載指定遠端倉庫到本地
git fetch remoterepository branchname:下載指定遠端倉庫指定分支到本地
2).pull命令
git pull remoterepository branchname[:localbranch]:拉取指定遠端倉庫指定分支到本地倉庫指定分支(預設是當前分支)
3).push命令
git push remoterepository localbranch[:remotebranch] [--tags]:推送本地倉庫指定分支到遠端倉庫指定分支(預設是與本地分支同名的遠端分支),預設是不推送標籤到遠端倉庫的,加上--tags就會推送標籤
4).remote命令
git remote:檢視所有與本地倉庫關聯的遠端倉庫
git remote -v:檢視所有與本地倉庫關聯的遠端倉庫,並顯示url
git remote add remote-name remote-url:新增與本地倉庫關聯的遠端倉庫
git remote rename oldname newname:為遠端倉庫重新命名
git remote remove remote-name:移除遠端倉庫
5).submodule命令
git submodule add repository-url dir:新增倉庫到指定目錄,使之成為本倉庫的子模組
git submodule init:初始化子模組
git submodule update:更新子模組
子模組是本倉庫依賴的另一個倉庫,但是我們不會對所依賴的倉庫(子模組)進行修改,只會在必要的時候進行更新操作。
6. 考察與比較 1).show命令
git show [-times]:顯示最近times次(預設是一次)提交的所有物件資訊
2).log命令
git log:檢視提交記錄
git log --all:檢視所有提交記錄
git log --oneline:檢視提交記錄,以oneline形式顯示,只顯示一行,顯示的內容時提交hash的前7位與提交訊息
git log -p -times:表示檢視最近times次提交改變的內容
git log -stat [-times]:檢視最近times次(預設是所有)提交記錄,並顯示檔案的差異分析
3).diff命令
git diff:檢視工作目錄與暫存區的差異
git diff --cached [<commit>]:檢視暫存區與指定提交(預設是HEAD)的差異
git diff <commit>:檢視工作目錄與指定提交的差異
git diff <commit>:檢視工作目錄與指定提交的差異
git diff <commit> <commit>:檢視兩次指定提交的差異
git diff branchname:檢視工作目錄與指定分支的差異
git diff branchname branchname:檢視兩個指定分支間的差異
上面的所有操作後面都可以加上-- dir,表示檢視該目錄下面的差異,在後面加上>patchname.patch表示將差異生成補丁,patchname是補丁的名字。
4).shortlog命令
git shortlog:顯示總提交次數與每次提交的提交訊息
5).describe命令
git describe [<commit>|<tag>]:檢視指定提交或者指定標籤(預設是最近一次提交)的註解標籤資訊
git desribe --tags [<commit>|<tag>]:檢視指定提交或者指定標籤(預設是最近一次提交)的標籤資訊
git desribe --all [<commit>|<tag>]:檢視指定提交或者指定標籤(預設是最近一次提交)的引用資訊
6).reflog命令
git reflog:顯示所有提交,下拉,推送,與切換分支操作
git reflog --all:顯示所有提交,下拉,推送操作
7. 修補 1).apply命令
git apply [--index|--cached] patchname.patch:在暫存區與工作目錄或者暫存區(預設是工作目錄)打補丁
git apply --reverse|-R patchname.patch:反向打補丁
git apply --reject patchname.patch:打補丁,將沒有衝突的檔案合併,將有衝突的檔案標記出來,並生成對應的.rej檔案
2).cherry-pick命令
git cherry-pick <commit>:將另一個分支上面的指定提交應用到當前分支上
git cherry-pick banchname:將指定分支上面的最後一次提交應用到當前分支上
3).rebase命令
git rebase branchname:將指定分支上所有修改應用到當前分支上
git rebase branchname branchname:將第一個指定分支上所有修改應用到第二個分支上
在rebase加上-i 會提供互動式的變基操作,在互動式操作中常用命令:
4).revert命令
git revert <commit>:恢復一個指定提交
8. 除錯 1).bisect命令 使用二分查詢,找到引入bug的提交
git bisect start:開始二分查詢
git bisect bad [<commit>]:設定指定提交(預設是當前分支)為bad
git bisect good [<commit>]:設定指定提交(預設是當前分支)為good
輸入了上面三個命令後就會自動開始二分查詢,我們之後只需要標記當前提交時bad還是good就行了,如果當前找的的提交時bad就輸入git bisect bad,否則輸入git bisect good直到找到有bug的提交。
2).blame命令 顯示修改和作者最後修改的檔案的每一行,這就是一個“問責”的命令,如果哪裡有問題,我們可以很快地找到該問題是誰導致的。
git blame filename:檢視指定檔案所有的操作者,看看是誰錯誤地修改了該檔案
3).grep命令
git grep keys:在工作目錄中所有檔案中搜索keys
git grep --cached keys:在暫存區中所有檔案中搜索keys
以上是筆者在學習Git的過程中,根據網上教程所整理出來的一些實用命令
Git與SVN區別1.Git是分散式的,SVN不是: 這是Git和其它非分散式的版本控制系統,例如SVN,CVS等,最核心的區別。Git跟SVN一樣有自己的集中式版本庫或伺服器。但Git更傾向於被使用於分散式模式,也就是每個開發人員從中心版本庫/伺服器上chect out程式碼後會在自己的機器上克隆一個自己的版本庫。可以這樣說,如果你被困在一個不能連線網路的地方時,就像在飛機上,地下室,電梯裡等,你仍然能夠提交檔案,檢視歷史版本記錄,建立專案分支等。
同樣,這種分散式的操作模式對於開源軟體社群的開發來說也是個巨大的恩賜,你不必再像以前那樣做出補丁包,通過email方式傳送出去,你只需要建立一個分支,向專案團隊傳送一個推請求。這能讓你的程式碼保持最新,而且不會在傳輸過程中丟失。GitHub.com就是一個這樣的優秀案例。
2.Git把內容按元資料方式儲存,而SVN是按檔案: 所有的資源控制系統都是把檔案的元資訊隱藏在一個類似.svn、.cvs等的資料夾裡。如果你把.git目錄的體積大小跟.svn比較,你會發現它們差距很大。因為.git目錄是處於你的機器上的一個克隆版的版本庫,它擁有中心版本庫上所有的東西,例如標籤,分支,版本記錄等。
3.Git分支和SVN的分支不同: 分支在SVN中一點不特別,就是版本庫中的另外的一個目錄。如果你想知道是否合併了一個分支,你需要手工執行像這樣的命令svn propget svn:mergeinfo來確認程式碼是否被合併。然而,處理Git的分支卻是相當的簡單和有趣。你可以從同一個工作目錄下快速的在幾個分支間切換。你很容易發現未被合併的分支,你能簡單而快捷的合併這些檔案。
4.Git沒有一個全域性的版本號,而SVN有: 目前為止這是跟SVN相比Git缺少的最大的一個特徵。你也知道,SVN的版本號實際是任何一個相應時間的原始碼快照。我認為它是從CVS進化到SVN的最大的一個突破。
5.Git的內容完整性要優於SVN: Git的內容儲存使用的是雜湊演算法。這能確保程式碼內容的完整性,確保在遇到磁碟故障和網路問題時降低對版本庫的破壞。
我是一個Fan 人,我有一顆不Fan 的心。