標籤(空格分隔): 版本控制
Git
javascript
本文是我的對Git版本控制系統的學習,Git相關知識的學習。介紹Git的基本知識,經常使用操做等等。java
VCS:Version Control System
版本控制系統是記錄文件的內容變化,以便在任什麼時候候能夠查看文件在特定版本修訂狀況的系統。它能夠對任何文件進行版本控制,無論是代碼文件、圖片文件、文檔文件等等。因此有了VCS以後咱們能夠將某個文件回退到以前的某一個狀態,甚至能夠將整個項目都回退到過去某個時間點的狀態。
固然經過VCS能夠比較文件具體的變化細節:git
+ var a = 5 - var a = 3
- console.log(JSON.stringify(data)) - console.log('isVcardUsing====', self.freeUse) - console.log(typeof self.freeUse) + // console.log(JSON.stringify(data)) + // console.log('isVcardUsing====', self.freeUse) + // console.log(typeof self.freeUse)
這樣在出現一些bugs的時候咱們能夠去分析出最後是誰修改了哪一個地方,從而發現致使bugs的緣由,從而能夠快速修復問題。經過VCS的目的並非說要去追蹤是誰致使出現問題的人,而是幫助咱們快速的去解決問題。
不過目前不少公司有着一套版本發佈或持續集成系統,若是發佈上線以後發現有問題出現,能夠快速的回退到上一個指定沒有問題的版本,而後在經過分析致使bugs的緣由從新上線。
另外假設再開發過程當中不當心把項目中的文件改的改刪的刪,咱們也能夠輕鬆的恢復到原來的狀態。github
版本控制系統歷史分類:算法
Linux內核開源項目有不少的參與者,可是絕大多數的Linux內核維護工做都花在提交補丁和保存歸檔的繁雜事務上面(1991-2002),到 2002 年,整個項目組開始啓用分佈式版本控制系統 BitKeeper 來管理和維護代碼。到了2005年,開發 BitKeeper 的商業公司同 Linux 內核開源社區的合做關係結束,他們收回了無償使用 BitKeeper 的權力。自此Git分佈式版本控制系統就誕生了。數據庫
Git當初設定的目標:api
理解Git的思想和基本工做原理,用起來就會知其因此然,遊刃有餘。安全
Git管理項目時,文件流的三個工做區域:Git工做目錄,暫存區域,本地倉庫(Git目錄.git)。服務器
若是用了 --global 選項,那麼更改的配置文件就是位於你係統用戶主目錄下的那個(~/.gitconfig),之後你全部的項目都會默認使用這裏配置的用戶信息。若是要在某個特定的項目中使用其餘名字或者電郵,只要去掉 --global 選項從新配置便可,新的設定保存在當前項目的 .git/config 文件裏。
網絡
有兩種取得 Git 項目倉庫的方法:
第一種是在現存的目錄下,經過導入全部文件來建立新的 Git 倉庫;
第二種是從已有的 Git 倉庫克隆出一個新的鏡像倉庫來;
第一種:
name
建立目錄爲name的git倉庫第二種
https://github.com/donnyqi/Html.git
拷貝遠程git倉庫,目錄爲Htmlhttps://github.com/donnyqi/Html.git HtmlTest
拷貝遠程git倉庫,目錄爲自定義的HtmlTest文件的狀態變化週期:
工做目錄下的全部文件都不外乎兩種狀態:已跟蹤 、 未跟蹤已跟蹤的文件是指原本就被歸入版本控制管理的文件,在上次快照中有它們的記錄,工做一段時間後,它們的狀態多是未更新,已修改或者已放入暫存區。而全部其餘文件都屬於未跟蹤文件。它們既沒有上次更新時的快照,也不在當前的暫存區域。初次克隆某個倉庫時,工做目錄中的全部文件都屬於已跟蹤文件,且狀態爲未修改。
文件狀態變化週期:
狀態的提示語:
Untracked files,未跟蹤文件
未作任何修改
Changes not staged for commit,已修改文件
Changes to be committed,已暫存文件
基本的 Git 工做流程以下:
1.在工做目錄新加了文件--->Untracked files(工做目錄新加文件)
2.在工做目錄中修改某些文件--->modified:Changes not staged for commit(工做目錄修改了文件)
3.對新加的文件、修改後的文件進行快照(git add操做),而後保存到暫存區域--->staged:Changes to be committed(修改的文件保存到暫存區域)
4.提交更新(git commit操做),將保存在暫存區域的文件快照永久轉儲到Git目錄中--->commited(暫存區域的文件提交到本地倉庫)
bogon:static vivo$ git status On branch branch_point_20180426_v3_2_1 Your branch is up-to-date with 'origin/branch_point_20180426_v3_2_1'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: src/api/test.js Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: src/api/index.js modified: src/router/index.js Untracked files: (use "git add <file>..." to include in what will be committed) src/views/Test/
filename
|| 目錄
跟蹤新文件,已跟蹤文件&未跟蹤文件放到暫存區(譯註:其實 git add 的潛臺詞就是把目標文件快照放入暫存區域,也就是 add file into staged area,同時不曾跟蹤過的文件標記爲須要跟蹤。這樣就好理解後續 add 操做的實際意義了。)cached || --staged
) 查看已暫存文件或未暫存文件與暫存區域快照之間的更新git commit --amend 進入Vim修改最後一次提交的提交信息。此操做提交的文件快照和以前是同樣的,只是從新編輯提交說明並覆蓋。若是剛纔提交時忘了暫存某些修改,能夠先補上暫存操做,而後再運行 --amend 提交:
git commit -m "message" git add 'filename' git commit --amend 上面三條命令最終只會產生一個提交,以第二個提交命令的提交信息爲準
old_filename
new_filename
重命名文件path/old_filename
path/new_filename
移動文件而且重命名文件filename
取消已經暫存的文件(放棄工做目錄中當前暫存的文件到未暫存或未追蹤)filename
取消對文件的修改(放棄工做目錄中當前修改的文件),注:可是取消對文件的修改操做執行時候全部對文件的修改就都沒有了,是有風險的,全部在執行此操做前確保真的再也不須要保留剛纔的修改 注:若是在新跟蹤了某個untracked文件或者在跟蹤了某個已修改後的文件,添加到staged區域(Changes to be committed)以後,再次對該跟蹤的文件進行了修改,這個時候若是如今提交,那麼提交的是以前add的版本,而非當前工做目錄中的版本。因此,運行了 git add 以後又做了修訂的文件,須要從新運行 git add 把最新版本從新暫存起來
shortname
url
添加遠程倉庫:git remote add pb git://github.com/paulboone/ticgit.git
remote-name
從遠程倉庫抓取數據remote-name
branch-name
本地倉庫中的數據推送到遠程倉庫remote-name
查看遠程倉庫信息old-remote-name
new-remote-name
修改某個遠程倉庫在本地的簡稱remote-name
移除對應的遠端倉庫Git 使用的標籤有兩種類型:輕量級的(lightweight)和含附註的(annotated)。輕量級標籤就像是個不會變化的分支,實際上它就是個指向特定提交對象的引用。而含附註標籤,其實是存儲在倉庫中的一個獨立對象,它有自身的校驗和信息,包含着標籤的名字,電子郵件地址和日期,以及標籤說明,標籤自己也容許使用 GNU Privacy Guard (GPG) 來簽署或驗證。通常咱們都建議使用含附註型的標籤,以便保留相關信息;固然,若是隻是臨時性加註標籤,或者不須要旁註額外信息,用輕量級標籤也沒問題。
v1.7*
列出全部包含v1.7標籤tag-name
建立一個輕量級tagtag-name
-m annotated
建立一個含附註的標籤(-m 選項則指定了對應的標籤說明,Git 會將此說明一同保存在標籤對象中。若是沒有給出該選項,Git 就會啓動文本編輯軟件供你輸入標籤說明。相似commit -m)tag-name
commitid
後期加註標籤,在後期對早先的某次提交加註標籤tag-name
查看相應標籤的版本信息,並連同顯示打標籤時的提交對象tag-name
刪除tagtagname
推送tag到遠端服務器Git 的分支可謂是難以置信的輕量級,它的新建操做幾乎能夠在瞬間完成,而且在不一樣分支間切換起來也差很少同樣快。和許多其餘版本控制系統不一樣,Git 鼓勵在工做流程中頻繁使用分支與合併,哪怕一天以內進行許屢次都沒有關係。理解分支的概念並熟練運用後,你纔會意識到爲何 Git 是一個如此強大而獨特的工具,並今後真正改變你的開發方式。
爲了理解 Git 分支的實現方式,咱們須要回顧一下 Git 是如何儲存數據的:Git 保存的不是文件差別或者變化量,而只是一系列文件快照。
**Git 中的分支,其實本質上僅僅是個指向 commit 對象的可變指針(分支其實就是從某個提交對象往回看的歷史)。**
Git 是如何知道你當前在哪一個分支上工做的呢?Git保存着一個名爲 HEAD 的特別指針,它是一個指向你正在工做中的本地分支的指針(注:將 HEAD 想象爲當前分支的別名。
)
這和大多數版本控制系統造成了鮮明對比,它們管理分支大多采起備份全部項目文件到特定目錄的方式,因此根據項目文件數量和大小不一樣,可能花費的時間也會有至關大的差異,快則幾秒,慢則數分鐘。而 Git 的實現與項目複雜度無關,它永遠能夠在幾毫秒的時間內完成分支的建立和切換。同時,由於每次提交時都記錄了祖先信息(譯註:即 parent 對象),未來要合併分支時,尋找恰當的合併基礎(譯註:即共同祖先)的工做其實已經天然而然地擺在那裏了,因此實現起來很是容易。Git 鼓勵開發者頻繁使用分支,正是由於有着這些特性做保障。
branch-name
新建一個分支branch-name
切換到輸入的分支上,HEAD就會指向checkout的分支branch-name
新建一個分支而且切換到該分支上,至關於上面兩步的合併branch-name
將輸入的分支合併到當前分支branch-name
刪除分支branch-name
強制刪除分支遠程分支(remote branch)是對遠程倉庫中的分支的索引。它們是一些沒法移動的本地分支;只有在 Git 進行網絡交互時纔會更新。遠程分支就像是書籤,提醒着你上次鏈接遠程倉庫時上面各分支的位置。
咱們用 遠程倉庫名
/分支名
這樣的形式表示遠程分支。
origin
同步遠程服務器上的數據到本地,origin爲遠程倉庫的簡短名字(默認爲origin)遠程倉庫名
分支名
推送分支git push 遠程倉庫名
本地分支名
:遠程分支名
git push origin master git push origin master:master git push origin master:refs/heads/master git push origin refs/heads/master:refs/heads/master 上面四條命令的效果是同樣的 你也能夠把本地分支推送到某個命名不一樣的遠程分支:若想把遠程分支叫做 anotherbranch,能夠用: git push origin `branch-name`:`anotherbranch-name` 來推送數據
遠程分支名
刪除遠程分支遠程倉庫名
/遠程分支名
遠程分支名
git checkout -b 分支名
遠程倉庫名
/遠程分支名
git checkout --track origin/test git checkout test 上面兩個命令效果相同 要爲本地分支設定不一樣於遠程分支的名字:git checkout -b test-alias origin/test
把一個分支中的修改整合到另外一個分支的辦法有兩種:merge(合併) 和 rebase(衍合)
最容易的整合分支的方法是 merge 命令,它會把兩個分支最新的快照(C3 和 C4)以及兩者最新的共同祖先(C2)進行三方合併,合併的結果是產生一個新的提交對象(C5)
rebase 命令:把在一個分支裏提交的改變移到另外一個分支裏重放一遍
衍合的原理是回到兩個分支最近的共同祖先,根據當前分支(也就是要進行衍合的分支)後續的歷次提交對象(這裏只有一個 C3),生成一系列文件補丁,而後以基底分支(也就是主幹分支 master)最後一個提交對象(C4)爲新的出發點,逐個應用以前準備好的補丁文件,最後會生成一個新的合併提交對象(C3'),從而改寫 experiment 的提交歷史,使它成爲 master 分支的直接下游,以下圖所示:其實衍合和普通的三方合併(merge),對應的快照內容如出一轍了。雖然最後整合獲得的結果沒有任何區別,但衍合能產生一個更爲整潔的提交歷史。若是視察一個衍合過的分支的歷史記錄,看起來會更清楚:彷彿全部修改都是在一根線上前後進行的,儘管實際上它們本來是同時並行發生的。
請注意,合併結果中最後一次提交所指向的快照,不管是經過衍合,仍是三方合併,都會獲得相同的快照內容,只不過提交歷史不一樣罷了。衍合是按照每行的修改次序重演一遍修改,而合併是把最終結果合在一塊兒。