文檔:https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%AE%80%E4%BB%8Bgit
分支理解shell
master分支是項目在建立時候的默認分支,除此以外,它並無更多的含義。vim
剩下的 「開發分支」,「灰度分支」, 「預發佈分支」, 「需求分支」,「測試分支」 都是根據項目和需求約定的。它們本質上只是一個分支而已。ide
http://10.2.16.183/zhiheng/myprojectgitlab
這是我局域網搭建的gitlab,咱們就以這個項目爲例。測試
> git clone http://10.2.16.183/zhiheng/myproject Cloning into 'myproject'... warning: redirecting to http://10.2.16.183/zhiheng/myproject.git/ remote: Enumerating objects: 3, done. remote: Counting objects: 100% (3/3), done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. 切換到項目: > cd myproject
> git status On branch master Your branch is up to date with 'origin/master'. Untracked files: (use "git add <file>..." to include in what will be committed) .idea/ a.py nothing added to commit but untracked files present (use "git add" to track)
> git add a.py > git commit -m "first file" > git push origin master
爲何要使用分支?idea
一、你在開發項目裏面一個很大的模塊,這個模塊須要連續開發一個月,你能夠選擇一個月提交一次,但一個月的開發代碼都存在你的本地電腦是很危險的。萬一電腦丟失,代碼被誤刪,損失很大!code
二、大家團隊的項目有十幾我的在維護,天天會有N屢次的提交,一旦你拉取和提交的間隙,被別人提交了代碼,當你在提交的時候別人就須要解決衝突。每次解決和提交衝突是很浪費時間的。開發
分支的使用rem
> git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/master
> git branch -a * master
> git branch dev
> git checkout dev
當你當前分支有未提交的文件時,不容許你提交分支。
建立 dev_a.py 文件
dev> git status On branch dev Untracked files: (use "git add <file>..." to include in what will be committed) .idea/ dev_a.py nothing added to commit but untracked files present (use "git add" to track) dev> git add dev_a.py dev> git commit -m "dev a file" [dev ace2539] dev a file 1 file changed, 1 insertion(+) create mode 100644 dev_a.py
dev
分支, 但遠程是沒有的。dev> git branch -a * dev master remotes/origin/HEAD -> origin/master remotes/origin/master
git push origin dev warning: redirecting to http://10.2.16.183/zhiheng/myproject.git/ Counting objects: 3, done. Delta compression using up to 8 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 320 bytes | 320.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0) remote: remote: To create a merge request for dev, visit: remote: http://10.2.16.183/zhiheng/myproject/merge_requests/new?merge_request%5Bsource_branch%5D=dev remote: To http://10.2.16.183/zhiheng/myproject * [new branch] dev -> dev
dev
dev> git branch -a * dev master remotes/origin/HEAD -> origin/master remotes/origin/dev remotes/origin/master
## dev 分支 dev> ls README.md a.py dev_a.py ## master分支 master> ls README.md a.py
假設A 和 B 在一個分支上開發
一、A 拉取 common.py 文件,修改。
二、B 拉取 common.py 文件,修改。
三、B 提交了 common.py 文件的修改。
四、A 在提交 common.py 文件時就會遇到衝突, A 應該怎麼作?
git pull origin master warning: redirecting to http://10.2.16.183/zhiheng/myproject.git/ remote: Enumerating objects: 5, done. remote: Counting objects: 100% (5/5), done. remote: Compressing objects: 100% (3/3), done. remote: Total 3 (delta 1), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From http://10.2.16.183/zhiheng/myproject * branch master -> FETCH_HEAD ed59b2e..c166f93 master -> origin/master Updating ed59b2e..c166f93 error: Your local changes to the following files would be overwritten by merge: common.py Please commit your changes or stash them before you merge. Aborting
這個時候發現代碼被 B 修改了,由於我本地也作了更新,因此不容許拉取。
> git add common.py > git commit -m "A 也修改了文件" > git pull origin master warning: redirecting to http://10.2.16.183/zhiheng/myproject.git/ From http://10.2.16.183/zhiheng/myproject * branch master -> FETCH_HEAD Auto-merging common.py CONFLICT (content): Merge conflict in common.py Automatic merge failed; fix conflicts and then commit the result.
vim common.py
# 這是一個公共文件 def common(a, b): <<<<<<< HEAD c = a + b return c ======= return a + b >>>>>>> c166f934de72779168cd00ef40bb96ff65e09ab5
開發的過程儘可能避免多人改一個方法,像這樣的衝突就比較解決了。 A和B須要坐到一塊兒,這個衝突解決。
> git add common.py > git commit -m "合併衝突" [master 485cfaa] 合併衝突 > git push origin master
若是多個開發同時在一個分支上開發,上面的衝突天天要發生不少次。這將嚴重影響開發效率。 每一個開發都在本身的分支上面開發。
dev
分支。git branch master * dev test> ls README.md a.py dev1.py dev2.py dev_a.py
test
分支。git branch master * test test> ls a.py common.py README.md test1.py test2.py
此時,兩個分支的上的代碼出現了較大的不一樣。
將test
和dev
合併到master
一、 在A電腦上有本地只有 master 和 dev ,能夠直接合並。
> git merge dev Merge made by the 'recursive' strategy. dev_a.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 dev_a.py
二、B電腦本地只有 master 和 test 分支。
git add . > git commit -m "test分支代碼" [test 14032ea] test分支代碼 2 files changed, 2 insertions(+) create mode 100644 test1.py create mode 100644 test2.py > git push origin test
> git branch test > git checkout test Switched to branch 'test' > git pull
> git merge test Updating 34fa4b3..7677952 Fast-forward test1.py | 1 + test2.py | 1 + 2 files changed, 2 insertions(+) create mode 100644 test1.py create mode 100644 test2.py > ls README.md a.py common.py dev1.py dev2.py dev_a.py test1.py test2.py
master 分支就擁有了全部分支的代碼。 在這個過程當中,
一、在代碼分支合併的過程當中若是出現衝突,就要解決衝突。 二、咱們在分支開發的過程當中,也能夠時長拉取master分支的內容,通常合併到master的代碼都是相對完整的。這樣能夠避免master合併的時候出現過多的衝突。