git 移动分支指针_git 分支( branch ) 的基本使用
分支( branches ) 是指在開發(fā)主線中分離出來,做進一步開發(fā)而不影響到原來主線。
Git 存儲的不是一系列的更改集( changeset ),而是一系列快照。當你執(zhí)行一次 commit 時, Git 存儲一個 commit 對象,它包含一個指針指向你當前需要提交的內(nèi)容的快照。
Git 中的 master 分支的功能,和其他分支一樣。master 在 git 項目中常見到,是因為 git init 命令運行時默認創(chuàng)建一個分支,并命名為 master。
創(chuàng)建一個新的分支,就是創(chuàng)建一個新的指針,用來在快照間移動。Git 通過 HEAD 指針,指向當前工作的本地分支。
$ git branch testing使用 git checkcout 命令,可以切換分支。
$ git checkout testing修改文件并 commit 代碼后,會移動分支的指針
$ vim test.rb $ git commit -a -m 'update test.rb'通過 checkout 可以切換回去 master 分支。下面的命令做了兩件事,一是把 HEAD 指針指向了 master 分支,二是當前工作目錄的文件恢復到了 master 所指向的快照版本。也就是說 87ab2 提交的變動,在切換到 master 分支時被移除。
$ git checkout master再做一些變更和 commit 。注意,此時歷史記錄開始出現(xiàn)分叉。
$ vim test.rb $ git commit -a -m 'make other changes'Git 中的分支,實際上是一個簡單的包含 40 個字符的文件,這 40 個字符是一次提交所產(chǎn)生的 SHA-1 checksum。所以,在 Git 中創(chuàng)建和銷毀一個分支的成本非常低。這個和其他大多數(shù)版本管理系統(tǒng)比起來,Git 無需拷貝整個項目的文件,是一個巨大的不同點。
基本的分支與合并
下面的例子是一個比較常見的場景,應用了分支與合并的功能。
這時,接收到另一個緊急的問題,需要立刻修復( hotfix )
4. 切換到生產(chǎn)環(huán)境分支
5. 創(chuàng)建一個新的分支 ( hotfix ),用于修復線上問題
6. 測試過后,把修復分支合并到主分支上,并推送到生產(chǎn)環(huán)境
7. 切換到原來的需求分支,繼續(xù)工作
最開始的狀態(tài)如下
通過 branch / checkout / commit 等操作,做到上面的第 5 步, 狀態(tài)如下
接下來,先合并 hotfix 分支,然后部署到線上環(huán)境。
$ git checkout master $ git merge hotfixUpdating f42c576..3a0874c Fast-forward index.html | 2 ++ 1 file changed, 2 insertions(+)上面的提示中,有 Fast-forward 字眼,表明 hotfix 分支指向的 c4 提交,是 master 分支指向的 c3 提交的祖先,因此,直接把 master 移動到 c4 即可。合并后效果關系如下
由于 hotfix 已經(jīng)合并到 master 分支,此時 master 和 hotfix 指向同一個地方,后續(xù)不在需要用到 hotfix 分支,所以可以刪除。
$ git branch -d hotfix下來了可以切換到 iss53 分支繼續(xù)工作,繼續(xù)修改,然后提交。當修改完畢后,關系大致如下
$ git checkout iss53Switched to branch "iss53" $ vim index.html $ git commit -a -m 'finished the new footer [issue 53]'[iss53 ad82d7a] finished the new footer [issue 53]1 file changed, 1 insertion(+)接下來開始合并。
$ git checkout masterSwitched to branch 'master' $ git merge iss53Merge made by the 'recursive' strategy.index.html | 1 +1 file changed, 1 insertion(+)這里合并沒有了 Fast-forward 字眼,因為不是簡單的移動分支指針。Git 采用三路合并( three-way merge ) 方式進行合并,創(chuàng)建了一個 commit ( c6 ),用于包含合并后的結(jié)果。三路合并方式,是指通過兩個分支的最新提交( c4 和 c5 ),以及他們的共同祖先 c2,來進行分支合并。c6 是一個合并提交記錄,特別之處是有兩個祖先。
此時,你已不在需要 iss53 分支,可以刪除它.
$ git branch -d iss53基本合并沖突處理
如果兩個分支修改同一個文件的同一個部分,例如同一行代碼,Git 不知道如何合并,認為這是一個沖突。例如你在 iss53 和 hotfix 分支都修改了 index.html 文件的同一個部分,合并 iss53 到已包含 hotfix 的 master 分支時,效果如下
$ git merge iss53Auto-merging index.htmlCONFLICT (content): Merge conflict in index.htmlAutomatic merge failed; fix conflicts and then commit the result.此時,自動合并暫停,需要手動合并。 git status 顯示沖突了的文件
$ git statusOn branch masterYou have unmerged paths.(fix conflicts and run "git commit")Unmerged paths:(use "git add <file>..." to mark resolution)both modified: index.htmlno changes added to commit (use "git add" and/or "git commit -a")Git 在沖突的文件中添加標準的沖突解決標識。
<<<<<<< HEAD:index.html <div id="footer">contact : email.support@github.com</div> ======= <div id="footer"> please contact us at support@github.com </div> >>>>>>> iss53:index.html這個表明,HEAD 版本的代碼是 ======= 以上部分,iss53 的版本是 ======= 以下部分。
開打 index.html 文件,修改成自己想要的版本,并剔除 <<<<<<< ======= >>>>>>> 標識,然后用 git add 標識沖突已接近,然后git commit 提交解決沖突后的版本。
參考資料
3.1 Branches in a Nutshell, git-scm
3.2 Basic Branching and Merging, git-scm
總結(jié)
以上是生活随笔為你收集整理的git 移动分支指针_git 分支( branch ) 的基本使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 以太网口差分电平_以太网接口学习笔记
- 下一篇: mybatisplus 结果_sprin