GIT儲存的是不是檔案差異或者變化量,而隻是一系列檔案快照
在Git 中送出時,會儲存一個送出(commit)對象,該對象包含一個指向暫存内容快照的指針,包含本次送出的作者等相關附屬資訊,包含零個或多個指向該送出對象的父對象指針:首次送出是沒有直接祖先的,普通送出有一個祖先,由兩個或多個分支合并産生的送出則有多個祖先。
暫存操作會對每一個檔案計算校驗和(即第一章中提到的SHA-1 哈希字串),然後把目前版本的檔案快照儲存到Git 倉庫中(Git 使用blob 類型的對象存儲這些快照),并将校驗和加入暫存區域
當使用git commit 建立一個送出對象前,Git 會先計算每一個子目錄(本例中就是項目根目錄)的校驗和,然後在Git 倉庫中将這些目錄儲存為樹(tree)對象。之後Git 建立的送出對象,除了包含相關送出資訊以外,還包含着指向這個樹對象(項目根目錄)的指針,如此它就可以在将來需要的時候,重制此次快照的内容了。
現在,Git 倉庫中有三種對象:表示檔案快照内容的blob 對象一個檔案一個對象;一個記錄着目錄樹内容及其中各個檔案對應blob 對象索引的tree 對象;以及一個包含指向tree 對象(根目錄)的索引和其他送出資訊中繼資料的commit 對象。
它儲存着一個名為HEAD的特别指針,git通過該指針知道你目前在哪個分支上工作
初始化一個本地目錄為git倉庫
git init
配置git的一些常用參數,如:user.name, user.email等等
git config
從遠端克隆一個倉庫
git clone
檢視目前倉庫狀态
git status
配置遠端位址或者其他一些設定
git remote
想本地倉庫添加檔案
git add
git倉庫忽略某些檔案不納入git倉庫的管理,不上傳到倉庫。編輯.gitignore添加檔案類型
*.[oa] 忽略以.o或.a結尾的檔案
*~ 忽略所有以~結尾的檔案。
.gitignore的格式規範如下:
所有空行或者以注視符号#開頭的行都會被git忽略。
可以使用标準的glob模式比對。
glob模式是指shell所使用的簡化了的正則,*比對0或多個任意字元;[abc]比對任何一個列在方括号中的字元;?隻比對一個任意字元;[0-9] 比對所有0到9的數字,[a-z]a到z的所有小寫字母
比對模式最後跟\說明要忽略的是目錄。
要忽略指定模式以外的檔案或目錄,可以在模式前加上!取反。
從遠端倉庫更新倉庫内容
git pull
從把修改送出到本地倉庫
git commit
git commit --amend ---- 修改最後一次送出的資訊,在送出完後發現漏掉了檔案沒有加,送出資訊寫錯了,要想撤銷剛才送出的操作,用該參數重新送出。
從本地倉庫的更改送出到遠端倉庫
git push
從其他分支比如說dev分支合并到目前所在的分支,如:git merge origin/dev (加入目前分支在master)把dev分支的内容合并到master分支下。
git merge
檢視送出資訊, 其中的參數-p 展開顯示每次送出的内容差異,-2僅顯示最近的兩次更新
git log
目前做的哪些更新沒add到倉庫,哪些更新已經add準備送出的
git diff
此指令比較的是工作目錄中目前檔案和暫存區域快照之間的差異,也就是修改之後還沒有暫存起來的變化内容。
如果要看已經添加起來的檔案和上次送出時的快照之間的差異,用git diff --cached或者git diff --staged。
git rm
從倉庫中删除檔案,并且不不再納入版本管理。
移動檔案
git mv
git并不跟蹤檔案移動操作,對檔案的改名。用其他工具進行批處理改名的話,要在送出前删除老的我呢簡明,再添加新的檔案名。
取消已經暫存的檔案,取消工作目錄中已修改的檔案。可使用git status 檢視當中的提示
git reset HEAD <file>
檢視目前的遠端倉庫
git remote -v
添加遠端倉庫
git remote add remote-name URL
從遠端倉庫抓取資料
git fetch [remote-name]
推送本地資料到遠端倉庫
git push remote-name branch-name
檢視遠端倉庫資訊
git remote show [remote-name]
遠端倉庫的删除和重命名
git remote rename remote-name remote-name-2
git remote rm remote-name
顯示已有的标簽
git tag
建立标簽
輕量級的:就像是一個不會變化的分支,實際上它就是個指向特定送出對象的引用,儲存着對應送出對象的校驗和資訊的檔案。
含附注标簽:存儲在倉庫中的一個獨立對象,它有自身的校驗和資訊,包含着标簽的名字,電子郵件和日志,及标簽說明,标簽本身也允許使用GNU Privacy Guard(GPG)來簽署或驗證。
建立一個含附注的标簽
git tag -a v1.1 -m "my version 1.1" -a 指定标簽名,-m指定了對應的标簽說明。
檢視标簽的版本新,并聯通顯示打标簽時的送出對象。
git show v1.1
簽署标簽 使用-s選項,前提是要有自己的私鑰
git tag -s v1.2 -m "my signed version 1.2 tag"
輕量級标簽 啥選項都不用。
git tag v1.3
分享标簽 -- 預設情況,git push不會把标簽推到remote上,隻有通過顯式指令才能分享标簽到remote
git push origin [tagname]
GIT BRANCH
建立一個分支,并建立檔案,送出到倉庫,合并新分支到master
git checkout -b hotfix
touch filename
git add filename
git commit -a -m "commit a filename"
git checkout master
git merge hotfix 把hotfix分支合并到master分支
該種合并方式稱為(Fast forward 快進)
遇到沖突時的分支合并
在不同的分支中都修改了同一個檔案的同一部分,就隻能有人來解決。可以使用
git status
來檢視
任何包含未解決沖突的檔案都會以未合并(unmerged)的狀态列出。Git 會在有沖突的檔案裡加入标準的沖突解決标記,可以通過它們來手工定位并解決這些沖突。
分支的管理
git branch
分支前的* 字元:它表示目前所在的分支
檢視各個分支最後一個送出對象的資訊
git branch -v
從該清單中篩選出你已經(或尚未)與目前分支合并的分支,可以用--merged 和--no-merged 選項
git branch --no-merged
檢視尚未合并的工作
本地分支和遠端倉庫分支的協同
首先從遠端克隆一個分支到本地,然後在本地有更改的時候需要向遠端送出的時候需要先在本地執行
git fetch origin
先同步遠端資料到本地再送出到遠端
分支的衍合
一個分支中的修改整合到另一個分支中有兩種辦法:merge和rebase
本文轉自ting2junshui51CTO部落格,原文連結: http://blog.51cto.com/ting2junshui/1982292,如需轉載請自行聯系原作者