創建併合並分支
git每次的提交都會把它們串成一條線,這條時間線就是一個分支。master分支這條目前僅有的時間線,叫主分支,HEAD嚴格來說不是指向提交,而是指向master,master纔是指向提交的,所以HEAD指向的就是當前分支。
起初,master分支時一條線,GIt用master指向最新的提交,再用HEAD指向master,就能確定當前分支,以及當前分支的提交點。
每次提交,master分支都會向前一步,隨着不斷的提交,master分支的線會越來越長。
當我們創建新的分支,例如dev,Git新建了一個指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上。
之後,對工作區的修改就是針對dev分支了,比如新提交一次後,dev指針往前移動一步,而master指針不變
如果我們的工作完成,就可以合併到master上。直接把master指向dev的當前提交。
合併完分支後,可以刪除dev分支。刪除dev分支就是刪除dev的指針。
演練步驟:
1.創建dev分支,然後切換到dev分支
git checkout -b dev
git checkout -b表示創建並切換(相當於 git branch dev 和 git checkout dev)
2.用git branch 查看當前分支
git branch
(git branch 命令會列出所有分支,當前分支前面會標有一個*號)
3.修改readme.txt的文件,再進行提交
vi readme.txt
git add readme.txt
git commit -m “branch test”
4.切換回到master分支
git checkout master
這是會發現readme.txt原先的修改不見了
5.再將dev分支的工作合併到master分支上
git merge dev
Updating b32ce9f..e55c3c7
Fast-forward
readme.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
Fast-forward信息,Git告訴我們,這次合併是“快進模式”,也就是直接把master指向dev的當前提交,所以合併速度非常快。
當然,也不是每次合併都能Fast-forward
6.再刪除dev分支。
git branch -d dev
再次查看分支
$ git branch
* master
解決衝突
1.創建分支
git checkout -b f1
修改readme.txt內容
2.在f1分支上提交
git add readme.txt
git commit -m “modify by f1”
3.切換到master分支
git checkout master
再修改readme.txt內容
再提交git add readme.txt
git commit -m “modify by master”
現在分支圖:
4.試圖合併
git merge f1
Auto-merging readme.txtCONFLICT (content):
Merge conflict in readme.txtAutomatic merge failed;
fix conflicts and then commit the result.
提示無法合併成功。
5.查看readme.txt內容
Git is a new version control system.
Git is free software under the GPL.
XXXX.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> f1
修改內容爲:
Git is a new version control system.
Git is free software under the GPL.
XXXX.
Creating a new branch is quick & simple.
6.再次提交
git add readme.txt
git commit -m “confict solved”
7.使用git log --graph查看分支合併情況
git log --graph --pretty=oneline --abbrev-commit
b7ce8e1 (HEAD -> master) slove conflict
|\
| * e7aec25 from f1 commit
* | 43d00f5 modify from matser
|/
* e55c3c7 branch test
* b32ce9f (origin/master) 4
* a857d16 第三次修改
* 1662df4 test stage
* ed5f4bd append GPL
* 52d72d3 add new
* cf4de49 wrote a readme file
8.刪除分支
git branch -d f1
分支管理策略
合併分支,Git會用Fast forward 模式,但這種模式下,刪除分支後,會丟掉分支信息。
如果強制禁用Fast forward模式,Git 就會在merge時生成一個新的commit。這樣,從分支歷史上就可以看出分支信息。
git checkout -b dev
vi readme.txt
git add readme.txt
git commit -m “add merge”
git checkout master
git merge --no-ff -m “merge wih no-ff” dev;
git log --graph --pretty=oneline --abbrev-commit
* d92224a (HEAD -> master) merge with no-ff
|\
| * a99cec5 (dev) add merge
|/
* b7ce8e1 slove conflict
|\
| * e7aec25 from f1 commit
* | 43d00f5 modify from matser
|/
* e55c3c7 branch test
* b32ce9f (origin/master) 4
* a857d16 第三次修改
* 1662df4 test stage
* ed5f4bd append GPL
* 52d72d3 add new
* cf4de49 wrote a readme file
Bug分支
當需要及時修改一個101 的bug,但是當前dev分支的工作沒做完,還未提交,這時又想創建一個分支issue-101的分支去修復這個bug
git提供了一個隱藏現場的功能,等恢復現場後繼續工作
git stash
1.首先切換dev分支,git checkout dev
然後修改文件readme.txt
Git is a new version control system.
Git is free software under the GPL.
XXXX.
create a new branch is simple and interest.
new branch dev
the 5 line hsd
git bash
2.git status 查看工作區間
$ git status
On branch master
Your branch is ahead of 'origin/master' by 10 commits.
(use "git push" to publish your local commits)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
3.git stash 保存工作區間
Saved working directory and index state WIP on master: ff0d4d0 merge bug 101
再次使用git status查看On branch master
Your branch is ahead of 'origin/master' by 10 commits.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
4.切換到master,然後創建101分支
git checkout -b isues-101
解決bug修改readme.txt
git add readme.txt
git commit -m “fix bug 101”
5.合併分支git merge --no-ff -m “merge bug” issue-101
6.刪除分支 git branch -d issue-101
7.切換回dev,然後恢復原先的工作區
git checkout dev git stash pop
如果要丟棄一個沒有被合併的分支,可以通過git branch -D <name>強行刪除
多人協作
從遠程倉庫克隆,git會將本地的master分支和遠程分支對應起來
git remote 查看遠程庫信息
git remote -v 查看遠程庫詳細信息
git push origin master 推送master分支的本地提交到遠程庫
從遠程庫抓取分支
創建一個新的目錄例如 g:git002
遠程克隆:
git clone [email protected]:2018xsm/git001
Cloning into 'git001'...
remote: Counting objects: 66, done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 66 (delta 23), reused 66 (delta 23), pack-reused 0
Receiving objects: 100% (66/66), 5.51 KiB | 513.00 KiB/s, done.
Resolving deltas: 100% (23/23), done.
查看分支:
git branch
$ git branch
* master
創建遠程origin 的dev分支到本地
git checkout -b dev origin/dev
提交dev的本地修改並推送到遠程庫的分支
vi dev.txt
git add env.txt
git commit -m “dev”
git push origin dev
再回到原先的git本地庫g:git
修改dev.txt再提交
推送失敗:
git pull 把最新的提交抓取下來,git pull也失敗,沒有指定本地dev分支與遠程origin/dev分支的鏈接,設置dev和origin dev的鏈接
git branch --set-upstream-to=origin/dev dev
再次抓取git pull,修改衝突,提交併推送即可