該文章有部分參考某大神的文章攒菠,具體也忘了出處了亚情,如果有發(fā)現(xiàn)跟哪個文章類似摊腋,麻煩留言下沸版,我好注明出處。 當然的看清楚對方文章的發(fā)表時間必須早于2017年10月兴蒸。
Git 是什么
目前最先進的分布式 版本控制系統(tǒng)视粮。
為什么要版本控制系統(tǒng)
如果你正在寫一份報告,你可能需要修改N多次橙凳,每一次的修改你都擔心可能后面會改回原樣蕾殴,但又擔心忘了自己修改的點,這時你就不得不每修改一次岛啸,保存一次報告钓觉,這樣你可能一份報告會有非常多份的備份文件。 時間長了坚踩,你真想回看某個修改點原來樣子荡灾,你又忘了是哪個備份時做了這個修改,你又不得不一個一個文件打開跟現(xiàn)在文件對比堕虹,這些找,對比芬首,備份都是非常麻煩的事情赴捞。 那么版本控制系統(tǒng)就可以輕松替你解決這些頭痛點。
分布式和集中式的區(qū)別
集中式
SVN CVS都屬于集中式的版本控制系統(tǒng)郁稍。集中式版本控制系統(tǒng)赦政,版本庫是集中存放在中央服務器的,而干活的時候耀怜,用的都是自己的電腦恢着,所以要先從中央服務器取得最新的版本,然后開始干活财破,干完活了掰派,再把自己的活推送給中央服務器。中央服務器就好比是一個圖書館左痢,你要改一本書靡羡,必須先從圖書館借出來,然后回到家自己改俊性,改完了略步,再放回圖書館。
集中式版本控制系統(tǒng)看起來解決我們要的版本管理最大毛病定页,必須聯(lián)網才能工作趟薄,局域網內帶寬夠大,才避免提交或者check out 一個文件等待時間非常長問題
分布式
分布式版本控制系統(tǒng)沒有“中央服務器”的概念典徊,每個人的電腦都是一份完整的版本庫杭煎,這樣工作時可以不需要聯(lián)網恩够,因為版本庫就這自己電腦上。 那么如果多人協(xié)作呢岔帽?比方你修改了本地電腦A玫鸟,你同事也在他本地修改了A文件,這是你們倆之間只需要把各自的修改推送給對方犀勒,就可以互相看到對方的修改了屎飘。比起集中式分布式版本控制系統(tǒng)更加安全,每個人本地都有一份完整的版本庫贾费,不擔心集中式的中央服務器出問題了钦购,而所有人都沒法工作。
Git基本概念
三種狀態(tài)
Git 有三種狀態(tài)褂萧,你的文件可能處
于其中之一:已提交(committed)押桃、已修改(modified)和已暫存(staged)
。已提交表示數據已經安全的
保存在本地數據庫中导犹。已修改表示修改了文件唱凯,但還沒保存到數據庫中。已暫存表示對一個已修改文件的當前版本做了標記谎痢,使之包含在下次提交的快照中磕昼。
三個工作區(qū)
由此引入 Git 項目的三個工作區(qū)域的概念:Git 倉庫、工作目錄以及暫存區(qū)域节猿。
Git 倉庫目錄是 Git 用來保存項目的元數據和對象數據庫的地方票从。這是 Git 中最重要的部分,從其它計算機克隆
倉庫時滨嘱,拷貝的就是這里的數據峰鄙。
工作目錄是對項目的某個版本獨立提取出來的內容。這些從 Git 倉庫的壓縮數據庫中提取出來的文件太雨,放在磁盤
上供你使用或修改吟榴。
暫存區(qū)域是一個文件,保存了下次將提交的文件列表信息囊扳,一般在 Git 倉庫目錄中煤墙。有時候也被稱作`‘索
引’',不過一般說法還是叫暫存區(qū)域宪拥。
Git 基本工作流程:
- 在工作目錄中修改文件仿野。
- 暫存文件,將文件的快照放入暫存區(qū)域她君。
- 提交更新脚作,找到暫存區(qū)域的文件,將快照永久性存儲到 Git 倉庫目錄。
Git 安裝
Win 版本
下載地址:https://git-scm.com/download/win
Git GUI客戶端(可選)
https://git-scm.com/download/gui/windows 推薦用SourceTree
Git 常用命令介紹
查看默認全局配置
$ git config --list
修改/添加用戶信息
當安裝完 Git 應該做的第一件事就是設置你的用戶名稱與郵件地址球涛。這么做很重要,因為每一個 Git 的提交都會使用這些信息亿扁,并且它會寫入到你的每一次提交:
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
設置完后我們可以再次用 git config --list 查看詳細配置捺典。
獲取幫助
$ git help config
初始化倉庫
$ mkdir gitDemo // 創(chuàng)建gitDemo 文件夾
$ git init // 初始化git倉庫
創(chuàng)建文件,并添加到暫存區(qū)
$ touch readme.txt // 創(chuàng)建 readme.txt 文件
$ git add readme.txt // 添加文件到暫存區(qū)
提交到本地倉庫
$ git commit -m "這個是提交說明" // 提交文件到本地倉庫
查看狀態(tài)
$ git status // 詳細狀態(tài)
$ git status -s // 簡短狀態(tài)
對比
要查看尚未暫存的文件更新了哪些部分:
$ git diff
查看已暫存的將要添加到下次提交里的內容:
$ git diff --staged
查看提交歷史
查看提交歷史
按提交時間从祝,列出所有更新:
$ git log
查看每次提交的內容差異
查看最新3次提交的具體情況:
$ git log -p -3
查看每次提交的簡短統(tǒng)計信息
$ git log --stat
版本回退
回到當前分支的上一個版本:
$ git reset --hard HEAD^
回退到當前分支的上上個版本:
$ git reset --hard HEAD^^
回退到當前分支的前100個版本:
$ git reset --hard HEAD~100
通過以下方式回退到某個詳細版本襟己,先通過git log/reflog拿到需要回退版本的一個hash值的頭部,比如通過git log獲取到3628164...牍陌,回退到3628164...版本:
$ git reset --hard 3628164
刪除文件
刪除工作區(qū)的文件
$ rm test.txt
刪除版本庫文件
$ git rm test.txt
另外一種情況是刪錯了擎浴,因為版本庫里還有呢,所以可以很輕松地把誤刪的文件恢復到最新版本, git checkout其實是用版本庫里的版本替換工作區(qū)的版本毒涧,無論工作區(qū)是修改還是刪除贮预,都可以“一鍵還原”:
$ git checkout -- test.txt
添加到遠程倉庫
-
第一次使用要先鏈接到遠程倉
通常使用origin作為默認名,后面跟上你遠程倉庫地址$ git remote add origin https://github.com/MeYoungTester/GitTest.git
提交到遠程倉
用origin 賬號提交到master分支
$ git push -u origin master
如果第一次提交通常還會讓你輸入遠程倉訪問的賬號密碼:
從遠程倉克隆
$ git clone https://github.com/MeYoungTester/GitTest.git
更新遠程倉代碼到本地
$ git pull
分支管理
創(chuàng)建分支
$ git branch dev
$ git checkout dev
上面兩行命令創(chuàng)建創(chuàng)建一個dev分支契讲,并切換仿吞,相當于下面一個命令:
$ git checkout -b dev
創(chuàng)建一個dev分支, git checkout命令加上-b參數表?示創(chuàng)建并切換。
如果這時想切換會master分支:
$ git checkout master
切換回主分支后捡偏,我們可以把dev分支合并過來:
$ git merge dev
合并后如果想刪除dev分支:
$ git branch -d qa
命令匯總:
- 查看分支:git branch
- 創(chuàng)建分支:git branch name
- 切換分支:git checkout name
- 創(chuàng)建+切換分支:git checkout -b name
- 合并某分支到當前分?支:git merge name
- 刪除分支:git branch -d name
解決沖突
建議直接上GUI工具唤冈,例如IDEA,后面講IDEA演示時講解霹琼。
分支策略
詳細方案可以參考:http://blog.jobbole.com/109466/
簡單來個例子:
master分支應該是非常穩(wěn)定的分支, 主要用來發(fā)布, 平時絕對不能在上邊干活
dev分支是不穩(wěn)定的分支, 可以在上邊做開發(fā), 然后待穩(wěn)定了,合并到master去
然后可以考慮每個功能團隊拉一個分支,進行自己的研發(fā), 如下圖:
bug 臨時分支:
當你接到一個修復一個代號101的bug的任務時务傲,很自然地凉当,你想創(chuàng)建一個分支issue -101來修復它枣申,但是,等等看杭,當前正在dev上進行的工作還沒有提交(沒有git add), 不是我不想提交, 而是這個功能需要12個小時才能完成, 這會兒提交上去連編譯都過不了, 會block 項目的daily build. 這時候怎么辦?
git stash 使用這個命令把現(xiàn)場保留并"存儲"下來, 等bug解決了以后再恢復現(xiàn)場重新寫碼.
在使用了git stash保留了現(xiàn)場之后,使用git status來查看工作區(qū), 就是干凈的. 此時可以使用命令 git checkout -b issue_101 拉一個issue_101臨時分支來解決bug, 然后再合并到master去
合并之后使用命令 git checkout dev 切換回dev分支,繼續(xù)剛才的工作
但是使用git status,發(fā)現(xiàn)工作區(qū)是干凈的, 怎么回到剛才的工作現(xiàn)場?
使用 git stash list 來查看有多少個現(xiàn)場被保留了
然后使用git stash pop 來回到最近的一個現(xiàn)場, 如果現(xiàn)場很多, 可以使用以下命令恢復:
git stash apply stash@{0}
feature 分支
現(xiàn)在接到了一個新任務:開發(fā)代號為Vulcan的新功能, 于是先建一個branch: **git checkout -b feature-Vulcan ** 然后花了一些時間完成了vulcan.java 你就使用add和commit提交到了這個vulcan的branch上
但是主管告訴你說,這個功能突然被砍掉了,不做了
雖然白干了,但是還是要把這個分支刪除, 然后使用命令:
git branch -d feature-Vulcan 發(fā)現(xiàn)刪除不掉
原因是feature-vulcan分支還沒有被合并,如果刪除,會丟失修改, 只能用-D刪除, 于是使用命令:
git branch -D feature-Vulcan 刪除成功
Tips:
每個新功能建議都開個新分支, 如果要丟棄新分支, git branch -D可以使用
標簽管理(tag)
發(fā)布一個版本時忠藤,我們通常先在版本庫中打一個標簽(tag),這樣楼雹,就唯一確定了打標簽時刻的版
本模孩。將來無論什么時候,取某個標簽的版本贮缅,就是把那個打標簽的時刻的歷史版本取出來榨咐。所以,標簽也是版本庫的一個快照
使用命令git tag v1.0就可以打上一個標簽
可以用命令git tag查看所有標簽
默認情況下使用git tag 是給最近的一次commit打上標簽,但是如果需要給之前的commit打上標要怎么辦呢?
方法是找到歷史提交的commit, 然后打上就好了.
git log --pretty=oneline --abbrev-commit 找到某個commit 歷史, 例如找到 fix bug 101這個commit, 而這個commit的id是12345678,那么通過命令:
git tag v0.9 12345678 就給這個fix bug 101的commit打上了v0.9的tag
如果你想要查看v0.9這個tag的信息,可以使用命令 **git show v0.9 **查看
在打標簽的時候, 你當然希望可以自己指定版本號和說明,那么就使用-a和-m參數: git tag -a v0.1 -m "version 0.1 released" 3628164