分支在實際中有什麼用呢?假設你準備開發乙個新功能,但是需要兩周才能完成,第一周你寫了50%的**,如果立刻提交,由於**還沒寫完,不完整的**庫會導致別人不能幹活了。如果等**全部寫完再一次提交,又存在丟失每天進度的巨大風險。
現在有了分支,就不用怕了。你建立了乙個屬於你自己的分支,別人看不到,還繼續在原來的分支上正常工作,而你在自己的分支上幹活,想提交就提交,直到開發完畢後,再一次性合併到原來的分支上,這樣,既安全,又不影響別人工作。
head嚴格來說不是指向提交,而是指向master,master才是指向提交的,所以,head指向的就是當前分支。
當我們建立新的分支,例如dev時,git新建了乙個指標叫dev,指向master相同的提交,再把head指向dev,就表示當前分支在dev上:
假如我們在dev上的工作完成了,就可以把dev合併到master上。git怎麼合併呢?最簡單的方法,就是直接把master指向dev的當前提交,就完成了合併:
案例:第一步:建立dev分支,然後切換到dev分支:
$ git checkout -b dev
等價於:$ git branch dev
$ git checkout dev
第二步:檢視當前分支:$ git branch
第三步:在當前dev分支上,編寫檔案test.txt,並提交到dev分支:$ git add test.txt
第四步:切換分支到master:$ git checkout master
此時,在master分支上並不能看到test.txt檔案
第五步:把dev分支的工作成果合併到master分支上:
$ git merge dev
第六步:刪除dev分支:$ git branch -d dev
第一步:建立新分支,並在此分支上修改test.txt檔案,然後提交:
$ git checkout -b feature1
修改test.txt檔案
$ git add test.txt -m "change text on feature1"
第二步:切換到master分支,修改test.txt檔案,然後提交:
$ git checkout master
修改test.txt檔案
$ git add text.txt -m "change text on master"
第三步:將feature1分支合併到master
$ git merge feature1
此時,由於衝突報錯了,現需要修改其中一分支下的檔案,然後重新提交,合併!
檢視分支合併情況:
$ git log --graph --pretty=oneline --abbrev-commit
$ git merge --no-ff -m "merge with no-ff" dev
合併分支時,加上--no-ff引數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併,而預設的fast forward合併就看不出來曾經做過合併。
當正在dev分支上開發新任務時,測試組給提了乙個線上的bug需及時修復,這是就需要在master分支上建立新分支來進行修復,但是開發的現場又需要儲存下來!
第一步:檢視當前分支資訊,當前分支dev上還有未完成待提交的檔案,並儲存現場:
$ git status
$ git stash
第二步:切換到master分支,並建立bug分支,進行bug修復:
$ git checkout master
$ git checkout -b issue-bug001
$ git add text.txt
$ git commit -m "resolve bug001"
第三步:切換到master分支,合併提交,然後刪除臨時分支:
$ git checkout master
$ git merge --no--ff -m "merge bug001" issue-bug001
$ git branch -d issue-bug001
第四步:切換到dev分支,恢復現場,繼續工作:
$ git checkout dev
$ git status
$ git stash list
$ git stash drop
恢復現場的兩種方式:
刪除現場:$ git stash drop
2. 恢復的同時刪除:$ git stash pop
沒有被合併的分支,刪除時會報錯:
$ git branch -d
使用-d進行強行刪除:
$ git branch -d
1. 當你從遠端倉庫轉殖時,實際上git自動把本地的master分支和遠端的master分支對應起來了,並且,遠端倉庫的預設名稱是origin
檢視遠端庫的資訊:git remote
檢視詳細遠端庫資訊:git remote -v
2. 推送分支,就是把該分支上的所有本地提交推送到遠端庫。推送時,要指定本地分支,這樣,git就會把該分支推送到遠端庫對應的遠端分支上
推送master分支:$ git push origin master
推送dev分支:$ git push origin dev
3. 抓取分支,
獲取遠端分支:$ git clone [email protected]:381510688/learninggit.git
建立遠端origin的dev分支到本地:$ git checkout -b dev origin/dev
把dev分支修改的檔案push到遠端:$ git commit -m "add modify file"
$ git push origin dev
如本地沒有與遠端dev建立連線,需建立連線:
把最新的提交從origin/dev抓下來:$ git pull
然後手動修改衝突,合併後再提交
git的標籤是版本庫的快照,其本質是指向某個commit的指標。
1. 建立標籤
切換到需要打標籤的分支上:$ git checkout master
打標籤:$ git tag v1.0
檢視所有標籤:$ git tag
2. 在歷史的commit id上打標籤
檢視歷史commit id:$ git log --pretty=oneline --abbrev-commit
指定commit id打標籤:$ git tag v1.1 6224966
帶說明的標籤:$ git tag -a v1.2 -m "version 1.2 released" 6224967
3. 檢視標籤資訊:$ git show v1.1
4. 用pgp簽名標籤:git tag -s -m "blablabla..."
5. 推送某個標籤到遠端:$ git push origin v1.0
推送全部標籤到遠端:$ git push origin --tags
6. 刪除本地標籤:$ git tag -d v1.2
刪除遠端標籤:$ git tag -d v1.1
$ gti push origin :refs/tags/v1.1
GIT分布式版本控制
git config global user.name your name git config global user.email email example.com git init初始化建立版本庫 git clone url從網路上轉殖repository,注意clone是複製了history...
Git(分布式版本控制)
git 分布式版本控制 git伺服器端 root web1 yum install y git 安裝git root web1 mkdir var git root web1 git init var git project bare 建立乙個空的git倉庫 初始化空的 git 版本庫於 var g...
分布式版本控制(二)
本篇介紹bazaar 我知道bazaar是從livid那裡看到的,他這篇介紹基本上就是翻譯bazaar官方的乙個快速入門文件,強烈推薦參考一下。bazaar 的缺點是速度太慢。它的慢倒不是像雲風所說的那樣,對大專案太慢,而是因為它是純python的程式,在windows下每次執行都要啟動python...