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
当需要及时修改一个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
(use "git checkout --
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
从远程仓库克隆,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,修改冲突,提交并推送即可