git是分佈式版本控制系統,這麼一來,任何一處協同工做用的服務器發生故障,過後均可以用任何一個鏡像出來的本地倉庫恢復。 由於每一次的克隆操做,實際上都是一次對代碼倉庫的完整備份。
git
每次你提交更新,或在 Git 中保存項目狀態時,它主要對當時的所有文件製做一個快照並保存這個快照的索引。 爲了高效,若是文件沒有修改,Git 再也不從新存儲該文件,而是隻保留一個連接指向以前存儲的文件。服務器
Git 中全部數據在存儲前都計算校驗和,而後以校驗和來引用。
編輯器
git config
$ git config --global user.name "John Doe" $ git config --global user.email johndoe@example.com $ git config --global core.editor emacs //配置文本編輯器,可選 $ git config --list // 查看
當你想針對特定項目使用不一樣的用戶名稱與郵件地址時,能夠在那個項目目錄下運行沒有 --global
選項的命令來配置。分佈式
$ git init $ git add 文件名|. $ git commit 這種方式會啓動文本編輯器以便輸入本次提交的說明 $ git commit -m 'message' $ git commit -a -m 'added new benchmarks' 跳過使用暫存區域的方式 $ git clone url [name] $ git status
git diff
$ git diff 比較的是工做目錄中當前文件和暫存區域快照之間的差別, 也就是修改以後尚未暫存起來的變化內容。 $ git diff --cached 查看已經暫存起來的變化
git rm
、重命名$ git rm [filename] 從 Git 倉庫中刪除 並從工做目錄中刪除指定的文件 $ git rm -f [filename] 刪除以前修改過而且已經放到暫存區域的文件,從 Git 倉庫中刪除 並從工做目錄中刪除指定的文件 $ git rm --cached [filename] 把文件從 Git 倉庫中刪除 ,但保留在當前工做目錄中 $ git mv file_from file_to 重命名
git log
$ git log --pretty=format 以指定格式輸出
format
以下:fetch
選項 說明 %H 提交對象(commit)的完整哈希字串 %h 提交對象的簡短哈希字串 %T 樹對象(tree)的完整哈希字串 %t 樹對象的簡短哈希字串 %P 父對象(parent)的完整哈希字串 %p 父對象的簡短哈希字串 %an 做者(author)的名字 %ae 做者的電子郵件地址 %ad 做者修訂日期(能夠用 --date= 選項定製格式) %ar 做者修訂日期,按多久之前的方式顯示 %cn 提交者(committer)的名字 %ce 提交者的電子郵件地址 %cd 提交日期 %cr 提交日期,按多久之前的方式顯示 %s 提交說明
其餘選項以下:url
-p 用來顯示每次提交的內容差別 --stat 每次提交的簡略的統計信息 --graph 顯示 ASCII 圖形表示的分支合併歷史。 --pretty=xxx 使用其餘格式顯示歷史提交信息。可用的選項包括 oneline,short,full,fuller 和 format(後跟指定格式)。
amend、reset、checkout
$ git commit --amend 本次修改事後的不生成新的 commit,而是合併到前一次 commit 中 $ git push -f remote 通常在使用了前面的命令以後,要提交,須要使用這個命令 $ git reset HEAD <file> 取消暫存 $ git checkout -- [file] 撤消對文件的修改
git remote
, fetch、pull、push
$ git remote 查看遠程倉庫 $ git remote -v 查看遠程倉庫 $ git remote show [remote-name] 查看遠程倉庫 $ git remote add <shortname> <url> 添加遠程倉庫 $ git remote rename 舊名 新名 重命名遠程倉庫 $ git remote rm [remote-name] 刪除遠程倉庫 $ git ls-remote [remote] 某個遠程引用的完整列表 $ git fetch [remote-name] 同步遠程倉庫全部修改 - 它並不會自動合併或修改你當前的工做 $ git pull 抓取數據並自動嘗試合併到當前所在的分支。 $ git push [remote-name] [branch-name] 推送到遠程倉庫,只有當你有所克隆服務器的寫入權限,而且以前沒有人推送過期,這條命令才能生效
git tag
$ git tag 列出已有的標籤 $ git tag -a 標籤 -m 備註 打附註標籤 $ git show 標籤 查看標籤的信息 $ git push origin 標籤 將標籤推送到遠程倉庫服務器上 $ git push origin --tags 將全部的標籤推送到遠程倉庫 $ git tag -d 標籤 刪除本地標籤 $ git push <remote> :refs/tags/<tagname> 刪除遠程標籤
git branch
,merge
Git 保存的不是文件的變化或者差別,而是一系列不一樣時刻的文件快照spa
$ git branch [branch-name] 這會在當前所在的提交對象上建立一個指針(分支)。 $ git branch -d [branch-name] 刪除指定分支 $ git branch -D [branch-name] 強制刪除 $ git branch -v 查看每個分支的最後一次提交 $ git checkout [branch-name] 切換分支 $ git checkout -b [branch-name] [basic-branch] 基於某個分支建立一個分支 $ git checkout -b [branch-name] 建立並切換分支 $ git log --oneline --decorate --graph --all 輸出提交歷史、各個分支以及項目的分支分叉狀況 $ git merge [branch-name] 合併指定分支到當前分支,當你試圖合併兩個分支時,若是順着一個分支走下去可以到達另外一個分支,那麼 Git 在合併二者的時候,只會簡單的將指針向前推動(指針右移),由於這種狀況下的合併操做沒有須要解決的分歧——這就叫作 「快進(fast-forward)」。若是有分叉,出現這種狀況的時候,Git 會使用兩個分支的末端所指的快照(C4 和 C5)以及這兩個分支的工做祖先(C2),作一個新的快照而且自動建立一個新的提交指向它。 這個被稱做一次合併提交,它的特別之處在於他有不止一個父提交。
假設如今有一個工做目錄,裏面包含了三個將要被暫存和提交的文件,暫存操做(git add
)會爲每個文件計算校驗和,而後會把當前版本的文件快照保存到 Git 倉庫中(Git 使用 blob 對象來保存它們),最終將校驗和加入到暫存區域等待提交。版本控制
當使用 git commit 進行提交操做時,Git 會先計算每個子目錄(本例中只有項目根目錄)的校驗和,而後在 Git 倉庫中這些校驗和保存爲樹對象。 隨後,Git 便會建立一個提交對象,它除了包含上面提到的那些信息外,還包含指向這個樹對象(項目根目錄)的指針。如此一來,Git 就能夠在須要的時候重現這次保存的快照。指針
如今,Git 倉庫中有五個對象:三個 blob 對象(保存着文件快照)、一個樹對象(記錄着目錄結構和 blob 對象索引)以及一個提交對象(包含着指向前述樹對象的指針和全部提交信息)。
作些修改後再次提交,那麼此次產生的提交對象會包含一個指向上次提交對象(父對象)的指針。
Git 的分支,其實本質上僅僅是指向提交對象的可變指針
它有一個名爲 HEAD 的特殊指針,指向當前所在的本地分支code
看一個例子:
首先建立並切換到testing
分支
在testing
分支上進行修改, 並提交
接着切換回master
分支, 並修改提交
合併的例子:
合併後以下
合併它們的時候產生合併衝突, Git 會暫停下來,等待你去解決合併產生的衝突。 你能夠在合併衝突後的任意時刻使用 git status 命令來查看那些因包含合併衝突而處於未合併(unmerged)狀態的文件, 在你解決了全部文件裏的衝突以後,對每一個文件使用 git add
命令來將其標記爲衝突已解決。 一旦暫存這些本來有衝突的文件,Git 就會將它們標記爲衝突已解決。這時你能夠輸入 git commit
來完成合並提交
跟蹤
、查看跟蹤遠程引用是對遠程倉庫的引用(指針),包括分支、標籤等等
$ git checkout -b [branch] [remote-ranch] 建立並跟蹤分支 $ git branch -u|--set-upstream-to 遠程分支 將已有分支跟蹤到指定的遠程分支 $ git branch -vv 查看已有的全部跟蹤分支 $ git branch -a 列出全部本地分支和遠程分支 $ git push [remote] --delete [branch] 刪除遠程分支
若是有人對遠程倉庫進行了修改,你也對你本地倉庫進行了修改,此時進行fetch
在 Git 中整合來自不一樣分支的修改主要有兩種方法:merge
以及 rebase
它會把兩個分支的最新快照(C3 和 C4)以及兩者最近的共同祖先(C2)進行三方合併,合併的結果是生成一個新的快照(並提交)。
合併以後
你可使用 rebase 命令將提交到某一分支上的全部修改都移至另外一分支上,就好像「從新播放」同樣。
$ git rebase [branch] 將當前分支的修改提取,並移動到[branch]上 $ git rebase 被提取的分支 目標分支 將被提取分支的修改移動到目標分支 $ git rebase -i Head^n(n表明前幾回提交) | commitid 合併從這裏開始後面的 commit。 $ git merge [branch] 通常在變基後,須要進行一次快進合併 $ git pull --rebase 將當前分支的修改提取,併合併到目標分支, 等同於執行git fetch origin/branch而後再執行git rebase origin/branch
提取修改:
合併後:
不要對在你的倉庫外有副本的分支執行變基。 如你已經將提交推送至某個倉庫,而其餘人也已經從該倉庫拉取提交併進行了後續工做