一直以來,咱們都是使用 svn 做爲版本管理工具,對於它的分支管理用得不是很順,不得不手動管理。
最近發現一本神書 -- 《Pro.Git》,介紹的是 git 版本管理工具,忍不住拜讀了前半部分能看懂的。故記錄一下。git
因爲我用的是 windows ,故接下來一切的前提都是在 windows 環境下github
msysGit
項目主頁下載: http://msysgit.github.com/安裝後通常會有一個 Git Bash
和 Git GUI
,我通常用命令行的 Git Bash
,我的感受命令行能讓我更清楚地知道本身的操做,對全局有把控的感受。shell
在 git 工做目錄下的文件,只有兩種狀態: 已跟蹤
和 未跟蹤
。已跟蹤 的文件就是已經被歸入版本管理,反之未跟蹤就是還沒有歸入版本管理的文件。初次使用 git clone
克隆下來的文件都屬性已跟蹤狀態,初次使用 git init
初始化的目錄下全部文件都屬於未跟蹤狀態。
已跟蹤 後的文件若是有修改則狀態更新爲 已修改
,git add 已修改的文件將把文件放入 暫存區域
,此時的狀態更新爲 已暫存
。提交後文件的狀態將回歸 已跟蹤未修改
狀態。
以下圖,更清晰:
[此處輸入圖片的描述][http://images.cnblogs.com/cnblogs_com/littledu/619156/o_4.jpg]windows
初次運行 git 須要先配置一下,就跟無論裝什麼軟件同樣,剛裝完的時候按咱們本身的行爲習慣設置一下,如字體,顏色等。git 的配置主要保存咱們用戶的信息和設置一些默認調用的編輯器等。app
git 提供了 git config
命令來完成此操做。編輯器
$ git config --global user.name "littledu" $ git config --global user.email 410491325@qq.com
可輸入 git config --list
查看全部的配置,更多配置相關點擊以下連接瞭解:
初次運行 Git 前的配置svn
當配置完後,咱們就要開始使用 Git 來工做了。常規的操做有 初始化新倉庫、克隆倉庫、添加文件歸入版本控制和提交等。工具
git init
: 初始化新倉庫git add
: 添加新文件歸入版本控制並放入暫存區域(選擇所有爲 git add . 或 git add --all)git commit -m [說明]
: 提交已暫存的更新git commit -a -m [說明]
: 提交所有更新git commit --amend
: 修正最後一次提交git reset HEAD <file>
: 取消已經暫存的文件git checkout -- <file>
: 撤消文件的修改git status
: 檢查當前文件狀態git diff
: 比較當前文件和暫存區域快照之間的差別git diff --cached
: 暫存起來的文件和上一次提交時快照之間的差別git diff --staged
: 暫存起來的文件和上一次提交時快照之間的差別(Git 1.6.1以上)git log
: 查看提交歷史(查看了後按 q 退出)gitk
: 使用圖形化工具查閱提交歷史git rm
: 從暫存區移除文件,工做目錄下的文件也會被刪除git rm --cached
: 從暫存區移除文件,保留工做目錄下的文件目前基於 git 的遠程倉庫遍地開花,最有名的如 github
,在上面存放咱們的開源代碼,能必定程度上提升 逼格
。字體
git clone [url]
: 克隆現有的倉庫git fetch [remote-name]
: 從遠程倉庫抓取數據到本地,不會自動合併git pull [remote-name]
: 從遠程倉庫抓取數據到本地,自動合併git push [remote-name] [branch-name]
: 推送數據到遠程倉庫(加上最後的分支名branch-name能夠推送到遠程相應分支)git remote
: 查看當前遠程倉庫的名字git remote -v
: 查看當前遠程倉庫的詳細信息git remote add [shortname] [url]
: 添加遠程倉庫git remote rename [oldname] [newname]
: 遠程倉庫重命名git remote rm [remote-name]
: 刪除遠程倉庫(僅移除本地對應的倉庫)git 做爲版本管理系統,必不可少的要支持 分支
。
爲了理解 git 分支的實現方式,咱們回顧一下 git 是如何存儲數據的。。。。此處省略 1000 字,總之,git 分支是版本控制工具裏面最好的。fetch
git branch [branch-name]
: 建立分支(不加參數則爲列出全部分支名單)git checkout [branch-name]
: 切換分支git checkout -b [branch-name]
: 建立並切換分支git merge [branch-name]
: 合併分支git mergetool
: 調用可視化合並工具幫忙解決衝突(在遇到衝突時,能夠輸入此命令,在後續中將本身電腦上裝有的 diff 工具如 BC 路徑填上,會自動調用其爲咱們解決衝突)git branch -d [branch-name]
: 刪除分支git checkout --track origin/branch-name
: 獲取遠程分支(默認狀況下咱們 git clone 都是獲取遠程 master 分支,若是要獲取遠程 其餘分支,則可使用這個命令,需 git 1.6.2 以上版本)git checkout -b [new branch-name] origin/[branch-name]
: 一樣是獲取遠程分支,但能夠改分支名git push origin :[branch-name]
: 刪除遠程分支(不能刪除 master 分支)時不時的,咱們想回到較早前的提交內容(commit),咱們可使用 git reset --hard [commit id]
來回退。
commit id
能夠經過 git log
來查看,以下圖那一長串的 SHA 字符:
但這樣回退,是不會有歷史記錄的,也就是回退了後再執行 git log
將看到在此記錄前的記錄全沒了,若有以下記錄:
$ git log --pretty=oneline ab1afef80fac8e34258ff41fc1b867c702daa24b modified repo a bit 484a59275031909e19aadb7c92262719cfcdf19a added repo.rb 1a410efbd13591db07496601ebc7a059dd55cfe9 third commit cac0cab538b970a37ea1e769cbbde608743bc96d second commit fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commit
我將回退到中間的 third commit
$ git reset --hard 1a410efbd13591db07496601ebc7a059dd55cfe9 HEAD is now at 1a410ef third commit $ git log --pretty=oneline 1a410efbd13591db07496601ebc7a059dd55cfe9 third commit cac0cab538b970a37ea1e769cbbde608743bc96d second commit fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commit
會是如上的結果,丟失了兩次被跨越的 commit。
因此,不要輕易的跨版本回退(若是能不回退那世界將很美好),但作了想找回也有辦法,git 提供了一個 git reflog
命令,能夠看到歷史上全部的 commit ,也就是能夠找回丟失的 commit id
了。
git reset --hard 1a410e....
不須要輸入那麼長的 id,只須要前幾個便可。另外,強烈推薦詳細閱讀 《Pro.Git》第三章開頭介紹的 git 數據存儲原理,將對你理解 git 的分支和版本回退有很是大的幫助。
在開發的過程當中,總會遇到有一些文件咱們不想歸入版本管理,如相關說明文檔或日誌等。
能夠建立一個 .gitignore
文件,列出要忽略的文件或模式,以下例子:
# 此爲註釋– 將被Git 忽略 *.a # 忽略全部.a 結尾的文件 !lib.a # 但lib.a 除外 /TODO # 僅僅忽略項目根目錄下的TODO 文件,不包括subdir/TODO build/ # 忽略build/ 目錄下的全部文件 doc/*.txt # 會忽略doc/notes.txt 但不包括doc/server/arch.txt
注:如何在 windows 下建立一個沒有名字的文件請參考:Windows下建立沒有名字的文件(.htaccess)最簡單的方法
git fetch [remote-name] git pull [remote-name]
fetch
和pull
都是從遠程倉庫抓取數據到本地,他們的區別就是 fetch 不會自動合併,而 pull 會自動與本地數據進行合併。
當你使用了 git fetch 後,想查看一下它在哪裏時,可使用:
git branch --all
當你使用了 git fetch 後,想合併它時,可使用:
git log -p master..origin/master git merge origin/master
事實上,我我的傾向於直接使用 git pull ,直接了當。
git
經常使用的命令基本就這些了,這裏忽略了 git tag
和 git rebase
命令。1 是由於比較少用,或許是我我的比較少用;2 是由於有另外一種方式能夠實現相同功能,如 git rebase
能夠婉轉的用 git merge
代替。
最後,感謝 toobug 大大忍受住了我時不時的騷擾,爲我解惑各類 git 疑難雜症。有空給個面子讓我請你去喝星巴克最貴的咖啡吧。