git 是什么?
git是一個免費、開源的分布式版本控制系統,可以快速、高效地處理無論大或小的任意工程。
git 容易學習,體積小、性能快如閃電,以其低成本的本地分支,方便快捷的緩存區域,具有多個工作流的特點超越了諸如Subversion, CVS, Perforce, ClearCase等SCM工具。
充分了解git以及git工作的基本原理,對于高效使用git并提高工作效率十分有幫助。
git 的特點
- 快照,而非差異(Snapshots, not differents)
- 強大的分支管理
- 幾乎所有的操作都是基于本地的(Nearly every opertation is local)
- 數據的完整性(Git has integrity)
- git 通常只會添加數據 (Git generally only adds data)
- 三個狀態(The three states)
- 分布式
- 免費開源
以下著重理解兩點:
- 快照,而非差異(Snapshots, not differents)
git 與其他工具最大的區別就是它對于數據的思考方式。大部分工具基于一系列文件的變化存儲信息。記錄的是基于每個文件的每一次改動。
git 將數據看做一系列微型文件的快照(a set of snapshots of a miniature filesystems),你在本地的每一次提交或者暫存,git會將在那一刻的所有文件進行快照記錄,并保存一份對該快照的引用。為了高效起見,如果文件沒有發生改變,git 不會再次存儲文件,只是保存一個指向以前一模一樣的文件的鏈接。git 對待數據的方式更像是對待一個快照流。
用圖片來看一下二者的區別:
- 三個狀態(The three states)
駐留的文件在git看來有三種狀態:commited, modified, staged. 即提交、修改和緩存。這樣就形成了git工程的三個目錄:工作目錄,緩存區,git目錄。如下圖所示:
- git目錄是Git用來存放工程的元數據和對象數據庫的,是Git最重要的部分??寺it倉庫時,會拷貝此目錄。
- 工作目錄是工程的一個單一檢出版本。這些文件從git目錄的壓縮數據庫中拉取出來并放置到你的本地磁盤中。
- 緩存區是一個通常包含在Git目錄中的文件,保存你下一步要進行提交的信息。它有時被稱為'index'。
git 常用命令
git命令十分豐富,這里簡要地將常用的git命令分為四類:
- 本地倉庫相關
- 遠程倉庫相關
- 版本管理相關
- 分支管理相關
安裝好git以后,首先要進行一下全局的設置:
$ git config --global user.name "yuqy"
$ git config --global user.email "yuqingyang.sh@superjia.com"
*注:
$ git config -l //可以查看設置
$ git config --replace-all //可以替換舊的設置
本地倉庫相關命令
本地倉庫初始化操作:
$ mkdir git-share
$ cd git-share
$ git init
Initialized empty Git repository in /Users/yqy/git-share.git/
本地工作目錄添加至緩存:
$ git add iwjw.js
緩存區提交至本地Git倉庫:
$ git commit -m "add first file"
-m是注釋,用于添加對于此次提交的說明。
以上兩步將文件提交到了git倉庫,若想簡化步驟,可以使用:
$ git commit -ma "modify file"
檢查文件狀態:
$ git status
那么如何撤銷本地倉庫的相關操作呢?
撤銷本地工作目錄的修改:
$ git checkout iwjw.js
撤銷緩存區的修改:
$ git reset HEAD iwjw.js
撤銷git目錄的修改:
$ git revert iwjw.js
遠程倉庫相關命令:
可以在github上創建一個倉庫,例如,這里創建好了的一個倉庫,地址為:http://www.github.com/yuqy/git-share.git
首先,本地倉庫關聯至遠程倉庫:
$ git remote add orgin https://www.github.com/yuqy/git-share.git
本地倉庫推送至遠程倉庫:
$ git push -u origin master
從遠程倉庫克隆到本地:
$ git clone https://www.github.com/yuqy/git-share.git
查看遠程倉庫:
$ git remote -v
刪除遠程倉庫:
$ git remote rm origin
修改遠程倉庫:
$ git remote set-url xxx
從遠程倉庫拉取代碼:
$ git fetch
$ git merge orgin/master
可以用$ git pull
簡化以上兩條命令
本地倉庫推送到遠程倉庫:
$ git push origin master
本地倉庫的某分支提交到遠程倉庫的某分支:
$ git push localbranch:remotebranch
版本管理的相關命令:
查看歷史:
$ git log
$ git log --pretty=format:'%h %add | %s%d[%an] --graph --date=short '
獲得舊版本(版本回退):
$ git checkout 3b7e6fc
這是,3b7e6fc是哈希值前7位。
給版本打標簽:
git tag v1
移除標簽:
$ git tag -d v1
查看標簽:
$ git tag
分支管理相關命令:
查看分支:
$ git branch
查看遠程分支:
$ git branch -r
創建分支:
$ git branch br1
創建并切換分支:
$ git checkout -b br1
從某個提交處切換分支:
$ git checkout -b br2 5e6a24e
切換分支:
$ git checkout master
合并分支:
$ git merge master
解決沖突:
在合并分支的時候往往會遇到沖突,打開文件,常??梢钥吹?
<<<<<<< HEAD
alert(1)
=======
alert(2)
>>>>>> master
其中HEAD與=====
之間表示是當前版本的內容,====
與master之前表示是合并過來的分支的內容。解決沖突就是在兩個版本中選擇一個版本,刪除另外一個。
刪除分支:
$ git branch -d br1
$ git branch -D br1
-d,若分支沒有被合并,通常會提醒,因此刪除不了,-D是強制刪除,
刪除遠程分支:
$ git branch -d br1之后,git push origin :br1
衍合:
$ git rebase master
衍合與合并的區別:
衍合將重寫提交樹,(可能會影響他人的分支合并)
場合:希望得到精確的提交歷史線時可以使用衍合
有用的git技巧
- 別名:
$ git config --global alias.co checkout
或者修改.gitconfig文件
- 比較
$ git diff
- 修改上一次的提交:
$ git commit --amend -m "add one line"
- 儲藏未提交的修改:
$ git stash
- 查看所有的儲藏列表
$ git stash list
- 將某個儲藏應用到工作目錄
$ git stash apply stash@{0}
- 將最后一次儲藏應用到工作目錄
$ git stash pop
- 清空所有儲藏
$ git stash clear
- cherry-pick:
從不同的分支中檢出一個單獨的commit , 并把它和你當前的分支合并
類似于打補丁,例如,修復一個所有分支都有的bug這樣的場合可以適用。
$ git cherry-pick 8ea36d5
- git blame 查找問題的利器
$ git blame -L 2,+4 iwjw.js
-L: 從指定行開始
+4: 要顯示的行數
- git reflog 對commit的跟蹤
$ git reflog
新get:
git 未提交,切換分支
git clean -d -fx
x --刪除忽略文件已經對git來說不識別的文件
d --刪除未被添加到git的路徑中的文件
f --強制運行
通過git提交查看提交屬于哪個分支
git branch -r --contains CommitID
git GUI Clients
參考:
git-scm
推薦使用免費的,在windows,mac上都可使用的source tree軟件。
References
[1] www.git-scm.com
[2] git 教程--廖雪峰的官方網站