Git備忘

前言

一直以來,咱們都是使用 svn 做爲版本管理工具,對於它的分支管理用得不是很順,不得不手動管理。
最近發現一本神書 -- 《Pro.Git》,介紹的是 git 版本管理工具,忍不住拜讀了前半部分能看懂的。故記錄一下。git

git 安裝

因爲我用的是 windows ,故接下來一切的前提都是在 windows 環境下github

  • 直接上官網下載: http://git-scm.com/downloads
  • msysGit 項目主頁下載: http://msysgit.github.com/

安裝後通常會有一個 Git BashGit GUI ,我通常用命令行的 Git Bash ,我的感受命令行能讓我更清楚地知道本身的操做,對全局有把控的感受。shell

Git文件狀態

在 git 工做目錄下的文件,只有兩種狀態: 已跟蹤未跟蹤 。已跟蹤 的文件就是已經被歸入版本管理,反之未跟蹤就是還沒有歸入版本管理的文件。初次使用 git clone 克隆下來的文件都屬性已跟蹤狀態,初次使用 git init 初始化的目錄下全部文件都屬於未跟蹤狀態。
已跟蹤 後的文件若是有修改則狀態更新爲 已修改,git add 已修改的文件將把文件放入 暫存區域 ,此時的狀態更新爲 已暫存。提交後文件的狀態將回歸 已跟蹤未修改 狀態。
以下圖,更清晰:
[此處輸入圖片的描述][http://images.cnblogs.com/cnblogs_com/littledu/619156/o_4.jpg]windows

git 配置

初次運行 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 來工做了。常規的操做有 初始化新倉庫、克隆倉庫、添加文件歸入版本控制和提交等。工具

  • 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 遠程倉庫相關命令

目前基於 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 分支的實現方式,咱們回顧一下 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 分支)

git 版本回退

時不時的,咱們想回到較早前的提交內容(commit),咱們可使用 git reset --hard [commit id] 來回退。
commit id 能夠經過 git log 來查看,以下圖那一長串的 SHA 字符:
Alt text

但這樣回退,是不會有歷史記錄的,也就是回退了後再執行 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 的分支和版本回退有很是大的幫助。

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)最簡單的方法

fetch 和 pull 的區別

git fetch [remote-name]
git pull [remote-name]

fetchpull 都是從遠程倉庫抓取數據到本地,他們的區別就是 fetch 不會自動合併,而 pull 會自動與本地數據進行合併。

當你使用了 git fetch 後,想查看一下它在哪裏時,可使用:

git branch --all

當你使用了 git fetch 後,想合併它時,可使用:

git log -p master..origin/master
git merge origin/master

事實上,我我的傾向於直接使用 git pull ,直接了當。


尾聲

git 經常使用的命令基本就這些了,這裏忽略了 git taggit rebase 命令。1 是由於比較少用,或許是我我的比較少用;2 是由於有另外一種方式能夠實現相同功能,如 git rebase 能夠婉轉的用 git merge 代替。

最後,感謝 toobug 大大忍受住了我時不時的騷擾,爲我解惑各類 git 疑難雜症。有空給個面子讓我請你去喝星巴克最貴的咖啡吧。

參考文檔

相關文章
相關標籤/搜索