创建分支
$ git branch newBranch
Git有个名为 HEAD 的特殊指针,它的指向分支就是当前分支。
创建分支后它并不会移动到新分支,需要我们手动移动。或者加-b参数
$ git checkout newBranch
查看当前分支指向对象:
git log --oneline --decorate --graph --all
我们在newBranch分支新创建一个文件:
这时树变成了这样:
合并
如果我们想要合并后的分支为master分支:执行以下命令
git checkout master
git merge newBranch
以上图为例子的合并,master为newBranch的祖先,所以master只需往newBranch移动:
那如果没合并之前master分支也修改了内容呢:
同样命令合并后:(把3、4、5数据进行比对连接合并成6)
冲突
在上面最后一种合并的情况,很有可能master的修改和newBranch的修改都在同一个位置,这就会造成冲突,当我们在执行merge命令时Git就会暂停,让我们去解决冲突
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview/solution (master)
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
执行合并命令冲突后可以用git status
查看冲突内容:
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview/solution (master|MERGING)
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview/solution (master|MERGING)
这时候查看test.txt
可以看到差异
解决过程:
vim test.txt
- 然后去掉
<<<<<HEAD
=======
<<<<<newBranch
- 按自己想法修改
git add test.txt
git commit -m "merge complete!"
远程分支操作
为避免每次连接远程仓库都需要输入用户名密码,我们可以进行全局配置:git config --global credential.helper cache
,之后只需几分钟之内就可以为我们保存用户信息
克隆仓库:
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview (master)
$ git clone https://github.com/HLZ278/GitTest.git
进入克隆到的仓库目录下,查看分支:
我们发现有orgin/master
分支,这个分支就是远程仓库上的master分支,origin/没有特殊含义,Git的克隆会自动帮我们命名,只不过是为了区分远程仓库的master的分支,而且我们还发现,git还会自动创建本地master分支指向远程分支所指向的版本。而且我们当前也在master分支上。
那我们在本地提交个新文件试试:
我们发现只是移动了本地master分支,而对于远程的master分支并不会移动,也就是说,只要我们拉取或者克隆之后,本地仓库就是我们和远程仓库通信的最后状态。如果这时候有人在远程仓库修改了某些内容,我们也不会知道。除非你重新拉取远程仓库(拉取只会拉取不一样的数据)git fetch <remote>
,拉取后我们可以进行合并等操作。画个图:
上图表示我们克隆远程仓库后在本地提交更新一次
如果这时有人在远程仓库操作了
那我们是不会知道的
我们要fetch新数据下来:
那本地修改新数据后又怎么从新提交到远程仓库呢?
只需运行git push <remote> <branch>
变基
变基前:
执行git rebase master newBranch
变基后:
一句话:对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件, 然后将当前分支指向目标基底 C3, 最后依次将之前另存为临时文件的修改依序应用。
变基用法需要注意,看官方文档:https://www.git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%8F%98%E5%9F%BA
其他分支管理命令
查看当前分支以及版本位置:
git branch -v
查看已经合并分支
git branch --merged
查看未合并分支
git branch --no-merged
在某个分支位置创建分支
git checkout -b 新分支 已有分支
删除远程仓库上的分支:
git push <remote> --delete <远程分支>