git入门-分支
1. git分支簡介
使用分支可以讓你從開發主線上分離開來,然后在新的分支上解決特定問題,同時不會影響主線。像其它的一些版本控制系統,創建分支需要創建整個源代碼目錄的副本。而Git 的分支是很輕量級的,因為Git保存的不是文件差異,而是一系列文件快照。在Git提交時,會保存一個commit對象,該對象包含一個指向暫存內容快照的指針,Git 會先計算每一個子目錄的校驗和( SHA-1 哈希字串),然后在 Git 倉庫中將這些目錄保存為樹(tree)對象。之后 Git 創建的提交對象,除了包含相關提交信息以外,還包含著指向這個樹對象的指針,如此它就可以在將來需要的時候,重現此次快照的內容了。Git 中的分支,其實本質上是個指向 commit 對象的可變指針,Git 會使用 master 作為分支的默認名字,
它在每次提交的時候都會自動移動,指向最后一次提交對象。Git使用一個名為HEAD的指針,指向你正在工作的本地分支,這樣你就可以知道當前在哪個分支下面工作。
2. 創建分支
| 1 | git branch dev |
上面操作會在當前的commit對象上新建一個名為dev的分支指針,但是僅僅是創建了該分支,并沒有切換到dev分支,此時你還在master分支。
3. 切換分支
| 1 | git checkout dev |
此時切換到了新建的dev分支,即HEAD指向了dev分支。
ps:可以加上-b參數
| 1 | git checkout -b dev |
相當于執行
| 1 2 | git branch dev git checkout dev |
現在我們在當前目錄下進行下面的操作:
| 1 2 3 | vim?test.py git add?test.py git commit -m?"add test.py" |
我們在當前目錄下新建了test.py文件,并添加到本地倉庫,注意:現在dev分支移動了一格,而master分支還指向原來的commit對象,test.py文件只屬于dev分支,master分支并沒有該文件。
現在切換到master分支
| 1 | git checkout master |
可以看到當前目錄下是沒有test.py文件的。因為Git 會把工作目錄的內容恢復為檢出某分支時它所指向的那個提交對象的快照,它會自動添加、刪除和修改文件以確保目錄的內容和你當時提交時完全一樣。
4. 合并分支
使用dev分支完成一些需求后,需要回到開發主線把它合并到master分支。
| 1 | git merge dev |
ps:需切換到master分支
合并時出現了“Fast-forward”的提示,因為當前master分支所在的提交對象是要并入的分支dev的直接上游,換句話說,如果順著一個分支直走下去可以到達另一分支的話,合并兩者時不存在任何需要解決的分歧,只需簡單的移動指針,這種合并過程稱為“Fast-forward”。如果當前master分支所指向的提交對象不是dev分支的直接祖先,Git需要做一些額外處理,Git會用兩個分支的末端和它們的共同祖先進行一次簡單的三方合并,并做一個新的快照,自動創建一個指向它的提交對象。這個對象有兩個祖先,即之前兩個分支的末端。合并之后,dev分支和master分支指向同一位置,master分支指向的提交對象就是最新的修改了。
如果不同分支修改了同一文件,合并時可能會遇到沖突,此時Git做了合并,但是并沒有提交。使用git status查看哪些文件發生了沖突。解決了所有的沖突后,執行git add將它們添加到暫存區域,因為一旦暫存就表示沖突已解決,然后使用git commit完成這次合并的提交。
5. 刪除分支
| 1 | git branch -d dev |
6. 分支管理
6.1 列出當前所有分支的清單
| 1 2 3 4 | git branch dev * master |
master分支前的*字符:表示當前所在的分支。
6.2 查看各個分支最后一個提交對象的信息
| 1 2 3 4 | git branch -v dev [7e90b1 add helloworld.java * master c7e90b1 [ahead 1] add helloworld.java |
6.3 查看已經與當前分支合并的分支
| 1 2 3 4 | git branch --merged dev * master |
6.4 查看已經與當前分支未合并的分支
| 1 | git branch --no-merged |
7. 遠程分支
7.1 查看遠程分支
| 1 2 3 4 | git branch -r origin/HEAD -> origin/master origin/master |
7.2 創建遠程分支
即把本地分支推送到遠程
| 1 2 3 4 5 6 | git push origin dev git branch -r origin/HEAD -> origin/master origin/dev origin/master |
看到已把dev分支成功push到服務器上
7.3 同步遠程服務器上的數據到本地
| 1 | git fetch origin |
7.4 跟蹤遠程分支
從遠程拉取dev分支到本地,并切換到dev分支,ps:需要git1.6.2以上版本
| 1 | git checkout --track origin/dev |
從遠程拉取dev分支到本地,命名為develop,并切換到develop分支
| 1 | git checkout -b develop origin/dev |
7.5 提交本地分支數據到遠程服務器
git push origin local:remote
| 1 | git push origin dev:dev |
如果當前是在dev分支下工作,可直接git push
7.6 刪除遠程分支
| 1 | git push origin :dev |
8. 分支的衍合
把一個分支整合到另一個分支有兩種方法:merge和rebase(衍合)
前面已經介紹過,merge是把兩個分支最新的快照和二者最新的共同祖先進行三方合并,產生一個新的提交對象。rebase是回到兩個分支的共同祖先,根據要進行衍合的分支dev的歷次提交對象,生成一系列文件補丁,然后以主干分支master的最后一個提交對象為新的出發點,逐個應用dev分支準備好的補丁文件,生成一個新的提交對象,改寫dev的提交歷史,使dev成為master的直接下游。然后回到master分支,進行一次快進合并。這樣能夠保持更加清晰的提交記錄,就像沒有使用過分支一樣。
| 1 2 | git checkout dev git rebase master |
ps:可以把衍合當作一種在推送之前清理提交歷史的手段,如果分支中的提交對象已經發布到服務端,就千萬不要對該分支進行衍合。
轉載于:https://www.cnblogs.com/wanghuaijun/p/5623023.html
總結
- 上一篇: 使用ajax进行汽车详情表的查询
- 下一篇: 如何跟下属进行沟通?