git分支确实是一个非常好的东西,先看一个截图吧:
这个图其实是很有讲究的,其中历史上的工作顺序是从C0->C1->C2->...->C13。
下面开始正式备忘一下git与分支有关的记录。
首先,需要明确的一个概念是无论是远程仓库还是本地仓库,git会自动将这个仓库命名成origin,默认会有一个主分支,叫master,所以引用origin仓库中master分支可以表示成origin/master。
1. 查看当前本地仓库有哪些分支的指令是:
git branch
zhangyuanlong ~/signal_sdk-master/signal_sdk$git branch
* 1.3.0
master
这里说明我们有两个分支,一个叫1.3.0,另外一个就是主分支master。其中以*标示的含义是当前的工作分支是哪一个,这里就是1.3.0。
2. 创建分支的指令是:
git branch branchname
例如,我要创建一个叫helloworld的分支,可以这么做:
zhangyuanlong ~/signal_sdk-master/signal_sdk$git branch helloworld
zhangyuanlong ~/signal_sdk-master/signal_sdk$git branch
* 1.3.0
helloworld
master
3. 切换分支
如果要切换到刚才创建的分支helloworld上,可以使用指令:
git checkout branchname
zhangyuanlong ~/signal_sdk-master/signal_sdk$git checkout helloworld
M prj_android/myapp1/.idea/misc.xml
M prj_android/myapp1/.idea/workspace.xml
M prj_android/myapp1/myapp1.iml
M prj_android/myapp1/project.properties
Switched to branch 'helloworld'
zhangyuanlong ~/signal_sdk-master/signal_sdk$git branch
1.3.0
* helloworld
master
4. 删除分支
如果要删除一个分支,可以使用:
git branch -d branchname
zhangyuanlong ~/signal_sdk-master/signal_sdk$git branch
1.3.0
* helloworld
master
zhangyuanlong ~/signal_sdk-master/signal_sdk$git branch -d helloworld
error: Cannot delete branch 'helloworld' checked out at '/Users/zhangyuanlong/signal_sdk-master/signal_sdk'
zhangyuanlong ~/signal_sdk-master/signal_sdk$git branch -D helloworld
error: Cannot delete branch 'helloworld' checked out at '/Users/zhangyuanlong/signal_sdk-master/signal_sdk'
zhangyuanlong ~/signal_sdk-master/signal_sdk$git checkout master
M prj_android/myapp1/.idea/misc.xml
M prj_android/myapp1/.idea/workspace.xml
M prj_android/myapp1/myapp1.iml
M prj_android/myapp1/project.properties
Switched to branch 'master'
Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
zhangyuanlong ~/signal_sdk-master/signal_sdk$git branch -d helloworld
error: The branch 'helloworld' is not fully merged.
If you are sure you want to delete it, run 'git branch -D helloworld'.
以上操作流程展示了删除分支需要注意以下两点:
- 如果你正在当前分支工作,你是不能删除该分支的,你必须切换到其他分支才能删除分支;
- 如果一个分支做了修改,但是还没有合并到其他分支上去,你使用git branch -d branchname是无法删除的,git会给出提示,如果你真的要强行删掉该分支,可以使用: git branch -D branchname
zhangyuanlong ~/signal_sdk-master/signal_sdk$git checkout helloworld
M prj_android/myapp1/.idea/misc.xml
M prj_android/myapp1/.idea/workspace.xml
M prj_android/myapp1/myapp1.iml
M prj_android/myapp1/project.properties
Switched to branch 'helloworld'
zhangyuanlong ~/signal_sdk-master/signal_sdk$git merge hahaha
Already up-to-date.
6. 如何将分支提交到本地仓库
这个其实就是先:
git add 本分支修改的东西
再:
git commit -m "提交修改信息"
7. 将分支提交到远程仓库
git push 远程仓库名 分支名
因为远程的仓库名也叫origin(上文介绍过),所以我们将helloworld这个分支推送到远程仓库就可以使用:
- git add modificationsUnderCurrentBranch(增加当前分支下的修改)
- git commit -m "提交本分支修改到本地仓库"
- git push origin helloworld
$ git fetch origin
remote: Counting objects: 36, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 36 (delta 28), reused 36 (delta 28), pack-reused 0
Unpacking objects: 100% (36/36), done.
From github.com:AgoraLab/signal_sdk
bbd9a3d..9d3402d master -> origin/master
db36abb..9d3402d 1.3.0 -> origin/1.3.0
* [new branch] helloworld -> origin/helloworld
这条语句相当于拉取远程仓库origin下的所有分支。一般都会有一个默认分支叫master,所以平常我们执行git fetch origin实际会拉取master分支。
如果希望再提交分支的时候,希望本地的分支名称提交到远程仓库是另外一个名字,可以使用如下指令:
git push origin localbranchname:remotebranchname
例如:提交helloworld分支到远程仓库上的名字是mytest,则可以执行:
git push origin helloworld:mytest
zhangyuanlong ~/signal_sdk-master/signal_sdk$git push origin helloworld:mytest
Total 0 (delta 0), reused 0 (delta 0)
To github.com:AgoraLab/signal_sdk.git
* [new branch] helloworld -> mytest
8. 跟踪远程分支
将本地分支与远程分支绑定在一起,即本地分支追踪远程某个分支,可以使用如下命令:
git checkout -b [本地分支名] [远程仓库名]/[远程分支名]
例如,本地的helloworld分支追踪远程的mytest分支,可以使用:
git checkout -b helloworld origin/mytest
由于默认远程和本地都有一个master分支,所以我们平常执行git push或者git pull实际上相当于:
git push origin master
git checkout -b master origin/master
9. 删除远程分支
git push [远程仓库名,例如origin] :[分支名]
例如删除远程服务器的helloworld分支:
zhangyuanlong ~/signal_sdk-master/signal_sdk$git push origin :helloworld
To github.com:AgoraLab/signal_sdk.git
- [deleted] helloworld
这个命令很奇怪,其实你可以理解相当于不指定本地分支的名字。