版本控制是一種記錄一個或若干文件內容變化,以便未來查閱特定版本修訂狀況的系統git
文件有三種狀態:已提交(committed) 、已修改(modified)和已暫存(staged)github
由此引入Git項目的三個工做區域:Git倉庫、工做目錄、暫存區域。shell
Git倉庫目錄用來保存項目的元數據和對象數據庫的地方。這是Git最重要的部分,從其餘計算機克隆倉庫時,拷貝的就是這裏的數據。數據庫
工做目錄是對項目的某個版本提取出來的文件內容。這些從Git倉庫的壓縮數據庫中提取出來的文件,放在磁盤上供你使用或修改。安全
暫存區域是一個文件,保存了下次將提交的文件列表信息,通常在Git倉庫目錄中。(有時也被稱爲‘索引’)服務器
基本的Git工做流程:工具
Git自帶一個git config 的工具來幫助設置控制Git外觀和行爲的配置變量。fetch
安裝完Git後第一件事就是設置用戶名稱和郵件地址。這樣作很重要,由於每個Git提交都會使用這些信息,而且寫入到每一次提交中。url
$ git config --global user.name "xxx" $ git config --global user.email "xxx@example.com"
列出全部配置3d
$ git config --list
git config
$ git config user.name XXX
第一種實在現有項目或目錄下導入全部文件到Git中,第二種是從一個服務器克隆一個現有的Git倉庫。
進入到項目目錄中輸入如下指令:
$ git init
該命令將建立一個名爲 .git 的子目錄,這個子目錄含有你初始化的 Git 倉庫中全部的必須文件,這些文件是
Git 倉庫的骨幹 。此時,咱們僅僅只是進行了初始化,項目裏的文件尚未被跟蹤。
若是是在一個已經存在文件的文件夾中初始化Git倉庫進行版本控制的話,應該開始跟蹤這些文件並提交。能夠經過git add
命令來實現對指定文件的跟蹤,而後執行git commit
提交。
$ git add *.c $ git add LICENSE $ git commit -m 'initial project version'
Git克隆的是該Git倉庫服務器上的幾乎全部數據,而不是僅僅複製完成你的工做所需文件。當你執行git clone
命令的時候,默認配置下遠程Git倉庫中的每個文件的每個版本都將被拉去下來。
克隆倉庫的命令格式git clone [url]
$ git clone https://gitee.com/yacongliu/Gitee.git
git status
若是在克隆倉庫後當即使用此命令,會有如下輸出:
$ git status On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree clean
這說明你如今的工做目錄至關乾淨。換句話說,全部已跟蹤文件在上次提交後都未被更改過。 此外,上面的信
息還代表,當前目錄下沒有出現任何處於未跟蹤狀態的新文件,不然 Git 會在這裏列出來。 最後,該命令還顯示
了當前所在分支,並告訴你這個分支同遠程服務器上對應的分支沒有偏離。 如今,分支名是 「master」,這是默
認的分支名。
使用命令git add
開始跟蹤一個文件
$ git add test.md
此時在運行git status
命令,會看到test.md文件已經被跟蹤,並處於暫存狀態。
這個命令理解爲「添加內容到下一次提交中」而不是「將一個文件添加到項目中」要更加合適 。
$ git status On branch master Your branch is up to date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: test.md
只要在 Changes to be committed 這行下面的,就說明是已暫存狀態。 若是此時提交,那麼該文件此時此
刻的版本將被留存在歷史記錄中。 你可能會想起以前咱們使用 git init 後就運行了 git add (files) 命
令,開始跟蹤當前目錄下的文件。 git add 命令使用文件或目錄的路徑做爲參數;若是參數是目錄的路徑,該
命令將遞歸地跟蹤該目錄下的全部文件。
git status
命令輸出十分詳細,但其用於有些繁瑣。若是使用git status -s
或git status --short
命令,會獲得更爲精簡的輸出。
$ git status -s M README MM Rakefile A lib/git.rb M lib/simplegit.rb ?? LICENSE.txt
在提交更新前必定要確認還有什麼修改過的或新建的文件尚未git add
過,不然提交的時候不會記錄這些還沒暫存起來的變化。這些修改過的文件只保留在本地磁盤。 所
以,每次準備提交前,先用 git status 看下,是否是都已暫存起來了, 而後再運行提交命令 git commit
$ git commmit
命令:git commit -a -m 'xxx'
或 git commit -am 'xxx'
這種方式能夠不用再commit前進行git add xx
要從 Git 中移除某個文件,就必需要從已跟蹤文件清單中移除(確切地說,是從暫存區域移除),而後提交。
能夠用git rm
命令完成此項工做,並連帶從工做目錄中刪除指定的文件,這樣之後就不會出如今未跟蹤文件清
單中了。
另一種狀況是,咱們想把文件從 Git 倉庫中刪除(亦即從暫存區域移除),但仍然但願保留在當前工做目錄
中。 換句話說,你想讓文件保留在磁盤,可是並不想讓 Git 繼續跟蹤。 當你忘記添加 .gitignore 文件,不小
心把一個很大的日誌文件或一堆 .a 這樣的編譯生成文件添加到暫存區時,這一作法尤爲有用。 爲達到這一目
的,使用 --cached 選項
$ git rm --cached README
回顧提交歷史 git log
git log --oneline 顯示 ASCII 圖形表示的分支合併歷史 git log --graph 提交信息以一行進行顯示
有時候咱們提交完了才發現漏掉了幾個文件沒有添加,或者提交信息寫錯了。 此時,能夠運行帶有 --amend 選
項的提交命令嘗試從新提交:
$ git commit --amend
這個命令會將暫存區中的文件提交。 若是自上次提交以來你還未作任何修改(例如,在上次提交後立刻執行了
此命令),那麼快照會保持不變,而你所修改的只是提交信息。
git reset HEAD <file>
取消暫存
$ git reset HEAD Readme.md
git check out -- <file>
撤銷修改,還原成上次提交時的內容。(是一個危險的命令,對文件作的任何修改都會消失)
$ git check out -- a.md
git remote
列出指定的每個遠程服務器的縮寫。git remote -v
顯示名稱及地址
$ git remote origin $ git remote -v origin https://gitee.com/yacongliu/Gitee.git (fetch) origin https://gitee.com/yacongliu/Gitee.git (push)
origin 倉庫服務器的默認名字
git remote add <shortname> <url>
添加一個新的遠程倉庫,同時shortname指定一個輕鬆訪問url的簡寫
$ git remote origin $ git remote add pb https://github.com/paulboone $ git remote -v origin https://github.com/schacon/ticgit (fetch origin https://github.com/schacon/ticgit (push) pb https://github.com/paulboone/ticgit (fetch) pb https://github.com/paulboone/ticgit (push)
git fetch [remote-name]
這個命令會訪問遠程倉庫,從中拉取全部你尚未的數據。必須注意 git fetch 命令會將數據拉取到你的本地倉庫 - 它並不會自動合併或修改你當前的工做 。
git clone
命令會自動設置本地 master 分支跟蹤克隆的遠程倉庫的 master 分支(或不論是什麼名字的默
認分支)
運行 git pull
一般會從最初克隆的服務器上抓取數據並自動嘗試合併到當前所在的分支 。
git push [remote-name][branch-name]
只有當你有所克隆服務器的寫入權限,而且以前沒有人推送時,這條命令才能生效。
git remote rename [oldname] [newname]
修改遠程倉庫的簡寫名
$ git remote rename pb paul
git remote rm [name]
移除遠程倉庫
Git能夠給歷史中得某一個提交打上標籤,以示重要。
git tag
輕量標籤(lightweight)與附註標籤(annotated)
推薦附註標籤,記錄了詳細內容
$ git tag -a v1.0 -m 'version v1.0' $ git tag V1.0
-m 指定一條將會存儲再標籤中的信息
git show
命令能夠查看標籤信息與對應的提交信息
$ git show v1.0 tag V1.0 Tagger: yacongliu <2680505646@qq.com> Date: Mon Jan 28 15:48:45 2019 +0800 version 1.0 commit eb4d5ce8cd32b58c5a33deabf53455b8f72c2ffc (HEAD -> master, tag: V1.0, origin/master, origin/HEAD) Merge: 9cce9a5 fad7bf9 Author: yacongliu <2680505646@qq.com> Date: Mon Jan 28 13:39:44 2019 +0800 M:rge branch 'master' of https://gitee.com/yacongliu/Gitee
輸出顯示了打標籤者的信息、打標籤的日期時間、附註信息,而後顯示具體的提交信息。
輕量標籤本質上是將提交校驗和存儲到一個文件中 - 沒有保存任
何其餘信息。 建立輕量標籤,不須要使用 -a、-s 或 -m 選項,只須要提供標籤名字
$ git tag v1.4-lw $ git tag v0.1 v1.3 v1.4 v1.4-lw v1.5
這時,若是在標籤上運行 git show,你不會看到額外的標籤信息。 命令只會顯示出提交信息:
$ git show v1.4-lw commit ca82a6dff817ec66f44342007202690a93763949 Author: Scott Chacon <schacon@gee-mail.com> Date: Mon Mar 17 21:52:11 2008 -0700 changed the version number
Git支持對過去的提交打標籤
$ git log --pretty=oneline 9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile 964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo 8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
如今,假設在 v1.2 時你忘記給項目打標籤,也就是在 「updated rakefile」 提交。 你能夠在以後補上標籤。 要
在那個提交上打標籤,你須要在命令的末尾指定提交的校驗和(或部分校驗和 )。
$ git tag -a v1.2 9fceb02
git push
命令並不會傳送標籤到遠程倉庫服務器上。建立完標籤後須要顯式地推送標籤到共享服務器上。運行git push origin [tagname]
一次性推送不少標籤,使用帶有--tag
選項的 git push
命令 git push origin --tags
Git 倉庫中有五個對象:三個 blob 對象(保存着文件快照)、一個樹對象(記錄着目錄結構和 blob 對象
索引)以及一個提交對象(包含着指向前述樹對象的指針和全部提交信息)。
Git 的分支,其實本質上僅僅是指向提交對象的可變指針。 Git 的默認分支名字是 master。 在屢次提交操做之
後,你其實已經有一個指向最後那個提交對象的 master 分支。 它會在每次的提交操做中自動向前移動
Git 的 「master」 分支並非一個特殊分支。 它就跟其它分支徹底沒有區別。 之因此幾乎每
一個倉庫都有 master 分支,是由於 git init 命令默認建立它,而且大多數人都懶得去改動
它。
建立分支
$ git branch testing //testing 爲分支名稱
切換分支
$ git checkout testing
HEAD 指向的是當前分支。分支切換會改變工做目錄中的文件。
合併分支
$ git merge testing
若是合併的兩個分支同時修改了同一個文件的同一個位置內容。合併分支時會提示衝突。此時須要手工進行合併。而後從新git add
git commmit
刪除分支
$ git branch -d testing $ git branch -D testing //肯定再也不須要該分支時,可強制刪除
遠程倉庫名字 「origin」 與分支名字 「master」 同樣,在 Git 中並無任何特別的含義同樣。同時 「master」 是當你運行 git init 時默認的起始分支名字,緣由僅僅是它的普遍使用,「origin」 是當你運行 git clone 時默認的遠程倉庫名字。 若是你運行 git clone -o booyah,那麼你默認的遠程分支名字將會是 booyah/master
推送本地分支到遠程服務器
若是但願和別人一塊兒在名爲 testing的分支上工做 。git push (remote) (branch)
$ git push origin testing
git push --set-upstream origin develop
推送分支
git push -u origin developv2
自動爲拉取和推送設置上游。
拉取
當 git fetch
命令從服務器上抓取本地沒有的數據時,它並不會修改工做目錄中的內容。 它只會獲取數據然
後讓你本身合併。 然而,有一個命令叫做 git pull
在大多數狀況下它的含義是一個 git fetch
緊接着一個git merge
命令。 若是有一個像以前章節中演示的設置好的跟蹤分支,無論它是顯式地設置仍是經過 clone或 checkout 命令爲你建立的,git pull
都會查找當前分支所跟蹤的服務器與分支,從服務器上抓取數據而後嘗試合併入那個遠程分支。
因爲 git pull 的魔法常常使人困惑因此一般單獨顯式地使用 fetch 與 merge 命令會更好一些。
刪除遠程分支
若是再遠程分支上已經完成了全部工做後,能夠刪除遠程分支。
$ git push origin --delete testing // testing 爲遠程分支名稱