`

git branch

 
阅读更多

http://f2e.us/wiki/git-branch.html#!/


理解分支

git在创建分支的时候,实际上是从整个提交历史里的某个起点开始(该起点被记录为分支的祖先,标识分支的起始位置),创建提交历史树的枝干。

由于git每次提交的时候均会记录当次提交的校检和,配合将数据打包存储,记录当前仓库相对于前一版本的变化。所以git的分支,实际上只是一串包含对象校检和(SHA-1)的文件。通过这个校检和,得出分支在提交历史树上的走向。

git里创建删除分支变得非常简单。这一点不像svn那样每创建一个分支就需要整个目录拷贝一份。在git上非常推荐频繁使用分支。

甚至可以一个issue(bug)一个分支,解决完切回主分支合并;没解决完就让分支继续走,主分支继续正常任务。

基本操作

创建和销毁

分支列表:

$: git branch
* master
  prepub
  product

创建分支:

$: git branch prepub

切换已有分支:

$: git checkout prepub
Switched to branch 'prepub'

创建并切换分支:

$: git checkout -b issue1234
Switched to branch 'issue1234'

删除分支:

$: git branch -d issue1234
Deleted branch issue1234 (was b904c07).

合并和冲突

合并前要先切回 要并入 的分支。

以下表示issue1234 分支合并入master 分支

$: git checkout master
$: git merge issue1234
Merge made by recursive.
 README |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

冲突的时候,git会报出哪些文件冲突,这时候需要手动解决完冲突方可提交。

$: git merge issue1234
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

通过git status 查看冲突文件。

$: git status
index.html: needs merge
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	unmerged:   index.html
#

打开index.html ,git会在冲突位置做上标示。

<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
  please contact us at support@github.com
</div>
>>>>>>> iss53:index.html

解决完冲突,这时候需要手动标识该冲突已经解决,类似svn的resolved

$: git add index.html
$: git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   index.html
#

这时候就可以提交了。

$: git commit -m "合并issue1234"
[master e3ece67] 合并issue1234
 1 files changed, 1 insertions(+), 0 deletions(-)

管理多个分支

前面提到,git非常推荐频繁使用分支,在大量分支的情况下,我们需要对分支做好管理(曾经一次上线,开了13个分支 = =

通过-v 可以看到最后一次提交日志。

$: git branch -v
* master          b904c07 把丘迟的产品搜改动合并一下
  p4popt          8b93380 p4p加上refpid,开发给出来的配置是 P4P_refpid
  prepub          a6cc66b P4P解析参数少一次替换,顺便解决\!失效的问题
  product         301ae4e rankbar图片换成data uri

通过--merged--no-merged 来查看分支是否已经合并完成。

$: git branch --merged
* master
  p4popt
$: git branch --no-merged
  prepub
  product

未合并的分支,在删除时会提示分支未合并。

$: git branch -d product
warning: deleting branch 'product' that has been merged to
         'refs/remotes/s/product', but it is not yet merged to HEAD.
Deleted branch product (was 301ae4e).

分支管理流程

一般情况下,分支可以划分为长分支和短分支两种。

长分支

  • 长期任务
    • prepub :上线前合并,根据上线列表,从各个分支中集中到该分支,统一部署提测
    • master :上线后合并,长期保留一个稳定可用的分支应付紧急任务
  • 项目
  • 较难解决的bug
  • 新特性试验田
  • 重构

长分支,经常会落后其他分支一大截,需要养成习惯,适时从其他重要分支进行合并, 尤其是项目分支

短分支

  • 临时需求
  • 小bug

分支可视化

git本身的log 提供--gragh 选项,可以提供字符界面的分支可视化视图。

$: git log --graph --pretty=oneline
| *   50cc7a78b7f2704a2014afa3667f6ac5b5b47374 merging refs/remotes/origin/prepub into HEAD
| |\  
| | * 8f685bd1be3757effe32d6ff37f86bd07dd2b549 又被无情地冲掉了代码
| * | 75a17b4ad610327a9b0e1eecfc6c4bf9cade7359 修改icon
| |/  
| *   146a0990de450c854b1a7d9995e12979fff2d537 merging refs/remotes/origin/prepub into HEAD
| |\  
| | *   93b379680796eb443961bb8c59008f8ae5678be4 Merge branch 'prepub' of search.ued.taobao.net:projects/search into prepub
| | |\  
| | * | 8b93380ccfb9020bf8f8e1e8a4a553601de3c788 p4p加上refpid,开发给出来的配置是 P4P_refpid
| * | | 08201de89834f6fecb195c2b7c3546b5cafccc85 秒杀折扣浮动层样式
| | |/  
| |/|   
| * | 0f4d1df17f79c7aa3ca3d36ab848c10b78029010 修改icon
| * | ae719fc29cc550321f284323db06a294b97c1398 p4p创意优化
| |/  
| * a6d4501e1456589d30ab1a5800b651876629c8ca 修改icon

git还有很多GUI工具,可以提供可视化地分支走势图,比如gitkqgitGitX 等等。

远程分支

至今为止,前面所有提到的概念都是直接本地操作的,并不需要任何网络连接。

而git本身是一个分布式代码管理工具(DVCS),所以分支管理上,存在本地分支和远程分支两种概念。

可以简单的理解,远程分支就是别人的本地分支push 到服务器上的时候产生的。比如master 就是一个最典型的远程分支(默认)。

$: git push origin master

除了master 之外,我们还可以随便创建分支,然后push 到服务器上去。

$: git push origin prepub
Counting objects: 27, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (15/15), 7.30 KiB, done.
Total 15 (delta 10), reused 0 (delta 0)
To git@search.ued.taobao.net:projects/search.git
   1b95a57..779dbe1  prepub -> prepub

远程分支的标识形式为{remote/branch} ,比如origin/product

$: git branch -a
  master
  p4popt
* prepub
  product
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/p4popt
  remotes/origin/prepub
  remotes/origin/product

远程分支和本地分支需要区分,所以,在从服务器上拉取特定分支的时候,需要指定本地分支名字。

$: git branch product origin/product
Branch product set up to track remote branch product from origin.

而1.6.2以上版本的git,可以通过--track 选项,简化这一过程。这也是为什么直接执行git clone 的时候,会自动创建本地master 分支的原因。(实际上,pull 操作相当于fetch +merge 。)

$: git checkout --track origin/product
Branch product set up to track remote branch refs/remotes/origin/product.
Switched to a new branch "product"

远程分支和本地分支是松散的结构,可以把任意远程分支合并到任意本地分支里;同样,也可以把任意本地分支push 到任意远程分支上。

# THIS WILL MESS UP YOUR REPO!!
$: git branch
  master
* prepub
  p4popt
  product
$: git pull origin product
$: git push origin master

同步本地远程分支。

$: git fetch origin

删除远程分支。

$: git push origin :p4popt
To git@search.ued.taobao.net:projects/search.git
 - [deleted]         p4popt

References

分享到:
评论
1 楼 fanlei77 2014-01-09  
很有用,谢谢

相关推荐

    tmux-git, 在Tmux状态栏中,显示当前 git branch的脚本.zip

    tmux-git, 在Tmux状态栏中,显示当前 git branch的脚本 Tmux中的 git-branch tmux-git 在 tmux 状态栏中显示当前目录的git repo 信息,如当前分支。dirtiness 。存储等等。概述在你的Linux终端提示符( 就像我在这里...

    git branch基本使用

    讲述了git分支的使用,创建分支,修改分支,删除分支,克隆分支

    git-directory-deploy, 将目录部署为 git branch.zip

    git-directory-deploy, 将目录部署为 git branch 这是用于部署文件到 git branch的脚本,例如在使用文书构建单个页面应用程序和部署到 GitHub页面的脚本。 不像 git方法,它不要求生成的文件被提交到源分支。 它在...

    git-when-merged, 确定特定提交合并到 git branch的时间.zip

    git-when-merged, 确定特定提交合并到 git branch的时间 git when-mergedgit when-merged 帮助你了解什么时候以及为何将提交合并到分支中。如果使用标准的Git工作流,则为你正在处理的每个特性创建一个特性分支。 当...

    vim-gitbranch:提供当前git存储库的分支名称

    vim-gitbranch:提供当前git存储库的分支名称

    Jenkins-Plugin-GitBranch-Column:Jenkins 插件,用于在 listvierw 中添加 git 分支名称

    Jenkins-Plugin-GitBranch-Column Jenkins 插件,用于在 listvierw 中添加 git 分支名称如何安装请访问,下载 hpi 文件并手动安装。

    git指令快速查询-代码管理工具

    git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支 git branch -r 查看远程所有分支 git commit -am "init" 提交并且加注释 git remote add origin git@192....

    git-branch-select:用于交互式分支列表,选择和签出的Git插件

    git-branch-select 存储库中的交互式(本地)分支选择。 通过安装 $ npm install --global git-branch-select 用法 $ git branch-select [options] [search] # Alias it in your .gitconfig for added convenience,...

    100个Git常用命令及用法-IT老卢.pdf

    git命令,部分如下: 创建与克隆 1.git init:在当前目录初始化 Git 仓库 2.git clone &lt;url&gt;:从远程 Git 仓库克隆一个本地副本 3.git remote add &lt;name&gt; &lt;url&gt;:给当前 Git...10.git branch -d &lt;branch&gt;:删除指定分支

    git 视频教程

    git视频教程.4.1.Git 命令 - git branch.mp4 git视频教程.4.2.Git 命令 - git branch.mp4 git视频教程.4.3.Git 命令 - git branch.mp4 git视频教程.4.4.Git 命令 - git checkout.mp4 git视频教程.4.5.Git 命令 - git...

    gitbranch-demo

    gitbranch-demo 演示gitbranch部分1v0.1标签

    linux系统安装git及git常用命令

    1 安装GIT 代码如下:$ sudo aptitude install git$ sudo aptitude install git-doc git-svn git-email git-gui gitk git软件包包含了大部分Git命令,是必装的软件包,第二行命令也是...(1)git branch 查看本地分支

    GitBranch

    GitBranch

    git常用命令

    git branch -a 查看当前分支 git checkout dev(test)切换分支 git push origin test推送更新到远程服务器,语法为 git push [远程名] [本地分支]:[远程分支] git status查看状态 git merge dev合并dev分支到当前分支 ...

    git-branch.md

    在Learn Git Branch上学习远程仓库的相关知识

    git 删除分支和回滚的实例详解

    git branch -D br 【git 删除远程分支】 git push origin :br (origin 后面有空格) git代码库回滚: 指的是将代码库某分支退回到以前的某个commit id 【本地代码库回滚】: git reset --hard commit-id :回滚到...

    git协作开发入门手册

    作为git的入门手册,看这个文档就够了。本是内部资料,不过都是git的内容,并不是商业机密信息,所有共享出来给需要的小伙伴们。...git branch git checkout git add git commit git push git pull git merge git log

    Git分支使用方法,详细方法

    git branch branch1 三、切换到新分支 创建分支后,使用以下命令切换到新创建的分支: git checkout &lt;分支名&gt; 或者,可以使用以下命令来创建并切换到新分支: git checkout -b &lt;分支名&gt; 例如,要切换到名为branch1...

    计算机专业面试可能会遇到的问题

    git branch 分支名 创建分支 git branch 查看本地分支 git checkout 分支名 切换分支名 git checkout -b 分支名 切换到新建分支 git merge 分支名称 合并分支(一般都是向master合并) git branch -d 删除分支 git ...

    git-branch-name:获取目录的git branchName

    git-branch-name 通过nodejs获取目录的git branchName,支持git子模块 安装 npm install git-branch-name --save 用 var getGitBranchName = require ( 'git-branch-name' ) ; var dirPath = path . resolve ( __...

Global site tag (gtag.js) - Google Analytics