git 經常使用命令

分佈式

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 的特殊指針
它有一個名爲 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

merge

它會把兩個分支的最新快照(C3 和 C4)以及兩者最近的共同祖先(C2)進行三方合併,合併的結果是生成一個新的快照(並提交)。
在這裏插入圖片描述
合併以後
在這裏插入圖片描述

rebase

你可使用 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

提取修改:
在這裏插入圖片描述
合併後:
在這裏插入圖片描述
不要對在你的倉庫外有副本的分支執行變基。 如你已經將提交推送至某個倉庫,而其餘人也已經從該倉庫拉取提交併進行了後續工做

相關文章
相關標籤/搜索