Git 簡介
Git是什么,借用繆雪峰先生的一句話羡蛾,Git是目前世界上最先進的分布式版本控制系統(tǒng)(沒有之一)蒋情。
我們熟悉的svn是集中式的版本控制系統(tǒng),那與git所屬的分布式版本控制系統(tǒng)究竟有什么不同呢筷凤。
集中式必須聯(lián)網(wǎng)昭殉,依靠
“中央服務器”
,即自己先從“中央服務器”
獲取最新代碼藐守,工作完成之后挪丢,再提交到“中央服務器”
。分布式不需要聯(lián)網(wǎng)卢厂,也不需要“中央服務器”
乾蓬。它的理念是每一臺電腦都是一個完整的版本庫。聯(lián)網(wǎng)慎恒,只是多人協(xié)作時“交流”
更方便一點任内。從安全性上來說,分布式版本控制系統(tǒng)更安全一點融柬。由于其每一臺電腦都保存有完整的版本死嗦,即使有一臺損壞,直接從另一臺copy一份出來即可粒氧。但若是集中式的
“中央服務器”
掛掉了越除,那整個系統(tǒng)也就over了。
下面是集中式版本控制系統(tǒng)
和分布式版本控制系統(tǒng)
的圖示外盯。
Attention:現(xiàn)在git有一些圖形化界面軟件廊敌,例如sourceTree,做的都十分友好,開源免費门怪。
很多人認為有了SourceTree這樣友好的軟件骡澈,我們完全可以不用去學什么繁雜的命令行,難記掷空。對此我不能茍同肋殴。命令行是根。軟件也只是對這些命令行的封裝坦弟。在掌握Git用法之后护锤,去看看其背后所對應的命令,是非常有必要的酿傍。
下面就開始一起來看看都有哪些命令分別針對哪些場景烙懦。
git tag 相關(guān)
查看本地所有的標簽列表
$ git tag
切換到某個tag下代碼
$ git checkout < tagName >
創(chuàng)建一個新的標簽
$ git tag < tagName >
eg: git tag release_1.1.2 創(chuàng)建一個release分支1.1.2版本的標簽
可以創(chuàng)建一個帶有說明的標簽
$ git tag -a < tagName > -m "description"
eg : git tag -a release_1.1.2 -m "release version 1.1.2 submit to appStore"
查看上述信息 可以用 git show < tagName >
$ git show < tagName >
eg : git show release_1.1.2
這些只是在你的本地創(chuàng)建了標簽,并未推送到遠程赤炒。如果想推送到遠程氯析,普通的git push等是不具有這樣的功能的亏较。你需要執(zhí)行
$ git push origin < tagName >
eg : git push origin release_1.1.2
刪除本地標簽
$ git tag -d < tagName >
刪除遠程標簽。(先刪除本地標簽掩缓,然后執(zhí)行下面)
$ git push origin :refs/tags/< tagName >
eg: git push origin :refs/tags/release_1.1.2
如果別人上傳了一個標簽雪情,你需要查看這個標簽的源碼
$ git fetch origin tag < tagName >
git clone 相關(guān)
場景設(shè)定:你現(xiàn)在在github或者OSChina上已經(jīng)有了一個倉庫,地址為:https://github.com/oscarwuer/YHRepository.git
你辣,有兩個分支巡通,master
和develop
,默認的是master
分支舍哄。
現(xiàn)在先將項目拷貝到本地宴凉,cd 到相應目錄,執(zhí)行
$ git clone <url>
eg: git clone https://github.com/oscarwuer/YHRepository.git
上面的命令克隆下來的是默認的分支表悬。如果你想直接克隆develop
分支弥锄,用下面的命令
$ git clone -b <branchName> <url>
eg: git clone -b develop
如果是想克隆某個tag的項目,是如下的命令
$ git clone <tagName> <url>
eg: git clone 20151108 https://github.com/oscarwuer/YHRepository.git
git branch 相關(guān)
列舉本地所有的分支
$ git branch
列舉遠程所有的分支
$ git branch -r
列舉本地和遠程的所有分支
$ git branch -a
切換本地分支
$ git checkout <branchName>
新建本地分支(注意不能與當前已有分支重名)
$ git branch -b <branchName>
切換到一個新的分支
$ git checkout -b <branchName>
刪除當前一個分支
$ git branch -d <branchName>
強制刪除當前一個分支(當你的工作區(qū)有修改時签孔,這時候你又不想要整個分支了叉讥,普通刪除是無法執(zhí)行的)
$ git branch -D <branchName>
指定本地分支與遠程分支的鏈接
$ git branch --set-upstream <localBranch> origin/<remoteBranch>
eg: git branch --set-upstream develop origin/develop
git push 相關(guān)
將本地分支推到遠程
$ git push origin <localBranchName>:<remoteBranchName>
簡約來寫(會自動對應本地分支與遠程分支)
$ git push
刪除遠程分支(即省略本地分支名,將一個空的提交到遠程分支即刪除)(這個一定注意饥追,為了防止誤操作图仓,一般公司會禁用刪除操作)
$ git push origin :<remoteBranchName>
常用的應用場景
$ git status 查看當前工作區(qū)的狀態(tài)
$ git add . 或者 $ git add -A 將所有的改動添加到暫存區(qū)
$ git commit -m "提交內(nèi)容簡介"
$ git pull 推送之前先拉取最新的
$ git push 推送到遠程分支上
以上是一次常規(guī)的git操作。
如果開發(fā)完畢但绕,發(fā)現(xiàn)有bug救崔。一般是如下操作:
$ git checkout -b issue_12 切換到新建bug分支issue_12上。
fix bug operation...
completion...
$ git add .
$ git commit -m "fix bug 12"
$ git checkout master 重新切換到主干分支
$ git merge --no-ff -m "merge with fix issue_12" issue_12 將bug分支合并到主分支
$ git push 記得要推送到遠程分支上捏顺。
$ git branch -d issue-12 刪除剛剛新建的分支六孵。
如果你發(fā)現(xiàn)了bug,恰巧你在develop分支上已經(jīng)在開發(fā)新的需求幅骄,進行到一半劫窒。即工作區(qū)有內(nèi)容。這時候你是無法切換分支的拆座。如何來應對這樣的場景呢主巍。
$ git stash 將工作現(xiàn)場的內(nèi)容暫存起來
Attention:
1\. $ git stash list 可以查看你暫存起來的工作現(xiàn)場的內(nèi)容
2\. $ git status 常用此命令查看當前工作區(qū)是否干凈。只有干凈時才能切換分支挪凑,否則會丟失你修改的內(nèi)容孕索。
$ git checkout -b issue-22
fix bug operation...
completion...
$ git add .
$ git commit -m "fix bug 22"
$ git checkout develop
$ git merge --no-ff -m "merge with fix bug 22" issue-22
$ git push
$ git branch -d issue-22
完成上述之后,bug修復了躏碳,那接下來要恢復我們之前工作的內(nèi)容搞旭。
$ git stash pop 恢復之前工作現(xiàn)場的內(nèi)容