搞个代码的管理工具,居然不弄上分支啥的东西。这简直太low了。尤其是在使用了传说中得很牛X的Git的时候,尤其显得low。拿着青龙偃月刀当烧火棍子使,关公知道了还不重反人间教育你!?

远程分支

要说分支就一定要从分支产生的最遥远的历史谈起。这一切开始于你用clone命令从远端把代码库的代码拉取到本地开始。这个时候,git自动把这个远端代码库命名为origin并自动创建一个origin/master分支。相对的在本地创建一个叫做master的本地分支。这个时候这两个分支的指针都是指向一个地方的(不同的push发生的时候,master的指针就会发生变化)。

要创建一个远程分支是非常必要的。也非常的简单。只需要先创建一个本地分支。

git branch 分支名

//如 git branch develop

这只是创建了一个叫做develop的分支。如果要使用这个分支,还需要切换到这个分支上:

git checkout 分支名
// 如 git checkout develop

还有一个更快的方式创建分支,并直接切换到这个分支上:

git checkout -b 分支名
// git checkout -b develop

一个命令就把上面的两个命令干得事全部搞定了。

说了半天都是折腾在本地分支(local branch)了。没有离题。远程分支就是本地分支push到远端以后生成的。也就是前面我们折腾出来的develop分支只要push到远端服务器上就可以了。

git push origin 分支名
// git push origin develop

但是,你还需要给你建立起来的远端的和本地的分支设定一个直接的联系。这个时候就需要把你本地的分支变成一个tracking branch。Tracking branch就是一个和远端的分支有直接联系的本地分支。如果你在一个tracking branch里使用git pull命令,那么git自动检测到从哪个代码库获取代码和哪个分支执行merge操作。创建tracking branch:

git checkout --track origin/分支名
// git checkout --track origin/develop

整个的命令是:

git checkout -b [本地分支名] [远端代码库名称]/[分支名]
//这时会创建一个本地分支名和远端分支名不一样的分支

上面的是一个简写的版本。

下面是要给谨慎使用的命令,删除远端分支。

$ git push origin --delete develop
To https://github.com/xxx/xxxx.git
- [deleted] develop

这个时候远端分支就被删除了。

日常工作

日常里使用Git的时候就是处理代码的pull,push和merge以及在这个时候遇到的各种问题。

既然有了这么多分支。也许是两个,但是使用Git创建分支的成本真的非常的低,所以有的时候可以是每一个大一点的issue就是一个分支。这时候就需要在多个分支之间切换:

git checkout [分支名称]
// git checkout develop

每天早晨一到公司首先要做的就是确保你在正确的分支上,然后从git repository上面把代码弄下来。这就要用到pull:

git pull [远端代码库名称] [分支名称]
// git pull origin develop

如果你在前一天的晚上忘记push代码或者有其他的人在你push之后push了代码了。那么就会遇到:“冲突”。git会告诉你:

error: Your local changes to "你修改过的文件" would be overwritten by merge. Aborting.

Please commit your changes or stash them before you can merge.

这种情况是编辑文件的冲突

这样的一个Aborting非常的郁闷。好的提示已经告诉我们该如何解决这个问题了。使用stash。

1. 使用stash命令把本地的代码先存起来。

git stash

这时,你本地的修改已经暂时存起来了。使用命令:git stash list可以看到保存的信息。

2. 然后使用我们上面说到的pull命令拉取远端库的代码。

git pull

3. 还原暂时保存的本地的修改

git stash pop stash@{}

大象装冰箱分的是三部。到这里我们的代码还是没有处理完毕的。真正的问题才浮出水面。ooxx这个时候就出现了。也就是在svn中常见的<<<<<<< ======什么的就出现在了你的代码里。手动的解决冲突吧。当你处理好这些冲突的代码之后。

git add [冲突文件名]

然后commit,之后:

当把代码同步的事情弄顺了以后就应该考虑要把本地文件提交到远端代码库了。

git push origin [本地分支名]:[远端分支名]

当然如果你的本地分支名和远端分支名是一样的,那么就只需要git push origin [分支名称]就可以了。

补充:

1. 有的时候即使你处理完成冲突之后再commit还是会有问题:

fatal: cannot do a partial commit during a merge.

这个时候:

git commit -i [冲突文件名]

来commit冲突的文件。

2. 这里你还会用到别的命令:

git status // 看看git里的状态,是冲突的有哪些文件等
git show | head // 查看commit进去的是谁、日期等

3. 撤销对某个文件的修改:

git checkout -- [文件名]

如果是文件的删除冲突的话

这个时候只要使用git rm [文件名]删掉已经被删掉的文件就可以了。

commit之后用git show | head命令查看结果。

合并分支

要合并那个分支,比如要把develop的分支合并到master上。那么:

1. 转到master分支上:

git checkout master

2. 开始合并:

git merge develop

在这个命令执行之后就会把develop分支上的代码都合并到master上了。

如果遇到任何冲突

git diff //查看是什么冲突

按照以上提到的解决冲突的方法解决冲突就可以。

撤销一个合并

如果你发现你的本地代码简直是一团糟,需要回到合并之前的状态:

git reset --hard HEAD

本地代码回到合并之前的状态。

或者,你已经把合并后的代码提交,但还是想把它们撤销:

git reset --hard ORIG_HEAD

但是这个命令某些情况下会很危险,尤其是在你已经把合并后的分支删除之后再使用这个命令。。。

删除不存在对应于远程分支的本地分支

在删除之前首先需要查看一下远端代码库origin下得分支都是什么情况的:

$ git remote show origin
#* remote origin
# Fetch URL: git@github.com:xxx/xxx.git
# Push URL: git@github.com:xxx/xxx.git
# HEAD branch: master
# Remote branches:
# master tracked
# refs/remotes/origin/b1 stale (use 'git remote prune' to remove)
# Local branch configured for 'git pull':
# master merges with remote master
# Local ref configured for 'git push':
# master pushes to master (up to date)

这时候你会看到这个b1的分支还是stable的。使用git remote prune origin可以将其从本地代码库中去除。

还有一个更简单的方法:git fetch -p。会在fetch之后删除没有与远程分支对应的本地分支。

重命名远程分支

这个过程很墨迹。因为要先删除远程分支,然后重命名本地分支,然后再提交这个命名好的本地分支到远程分支。

现在有一个devel的分支,要把它重命名为develop。先用git branch -av命令查看分支的状况。这里最重要是确定好了,你要删除的不是默认分支!之后就可以删除了:

git push --delete origin devel
#To git@github.com:xxx/xxxxxxxx.git
# - [deleted] devel

重命名本地分支:

git branch -m devel develop

推送本地分支到远端:

$ git push origin develop
#Counting objects: 92, done.
#Delta compression using up to 4 threads.
#Compressing objects: 100% (48/48), done.
#Writing objects: 100% (58/58), 1.38 MiB, done.
#Total 58 (delta 34), reused 12 (delta 5)
#To git@github.com:xxx/xxx-xxxxxx-x.git
# * [new branch] develop -> develop

查看未推送

查看全部分支的已经commit但是没有push的:

git log --branches --not --remotes

查看全部分支的全部的最近的commit:

git log --branches --not --remotes --simplify-by-decoration --decorate --online

查看某文件的历史记录:

git log my/file.c     #全部历史
git log -n 1 -- my/file.c #查看最近历史修改

常见错误处理

1. non-fast-forward

如果有人比你先push代码到你所在的分支了,那么git就不允许你再嵌入代码到这代码库。

git push origin master
# To https://github.com/USERNAME/REPOSITORY.git
# ! [rejected] master -> master (non-fast-forward)
# error: failed to push some refs to 'https://github.com/USERNAME/REPOSITORY.git'
# To prevent you from losing history, non-fast-forward updates were rejected
# Merge the remote changes (e.g. 'git pull') before pushing again. See the
# 'Note about fast-forwards' section of 'git push --help' for details.

这时候使用fetch和merge的方法解决这个问题:

fetch:

git fetch origin [分支名称]  

merge:

git merge origin [分支名称]    

或者直接pull。pull命令同时执行了这两个命令。

玩转git分支的更多相关文章

  1. 版本管理·玩转git(分支管理)

    在开发中,遇到这样的情况怎么办? 网站已有支付宝在线支付功能,要添加"微信支付",修改了两个文件,wechat.php.pay.php. 刚做到一半,突然有个紧急bug:支付宝支付 ...

  2. Git详解之三 Git分支

    相关文档 — 更多 Git 基础培训.ppt GIT 使用经验.ppt GIT 介绍.pptx GIT 分支管理是一门艺术.docx Eclipse上GIT插件EGIT使用手册.docx git/gi ...

  3. 2015继续任性——不会Git命令,照样玩转Git

    最近事情比较多,一眨眼,已经半个月没有写博客了~不得不感慨光阴似箭啊!当然,2015年有很多让我们期待的事情,比如win10正式版..NET开源.VS2015等等.想想都让人兴奋啊~~ 为了迎接VS2 ...

  4. 我教你怎么玩转git

    我教你怎么玩转git 1.想要练习解决冲突? 很好办.创建本地分支,a,b, a上面,这样改.b上面那样改. 然后你就解决冲突就可以了. 可以merge 或者cheerypick 2.想要玩一个不要历 ...

  5. Git 分支

    Git 保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照,某一次的提交指向这处时刻的文件快照,看起来就像每次提交都保存了当时的文件,连续的提交形成一条长链 分支 指向某一个特定的提交,不同的 ...

  6. Git分支管理

    一.Git分支的使用 查看分支: git branch 创建分支: git branch branch1 切换到branch1 git checkout branch1 再用git branch查看, ...

  7. Git分支的前世今生

    摘自Jack__CJ  CSDN博客,写得很好,保存一下. 导读 几乎所有的版本控制系统都以某种形式支持分支. 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线. 在很多版本控制系 ...

  8. GIT分支管理模型

    GIT分支管理模型 link: git-branching-model 主分支(Main branches) 项目两个常驻分支: master 主干分支(锁定),仅用于发布新版本,平时不能在上面干活, ...

  9. git初体验(三)git分支

    分支的理念就是分身,就像孙悟空拔出猴毛变出很多跟自己一模一样的猴子,然后每个猴子做自己的事情互不干涉,等到所有猴子做完之后,猴子集合来合并劳动成果,然后悟空就把那些猴子猴孙门统统收回了. 你创建了一个 ...

随机推荐

  1. 转:Linux设备驱动开发(1):内核基础概念

    一.linux设备驱动的作用 内核:用于管理软硬件资源,并提供运行环境.如分配4G虚拟空间等. linux设备驱动:是连接硬件和内核之间的桥梁. linux系统按个人理解可按下划分: 应用层:包括PO ...

  2. 列表中语句 python

    找到两个列表中相同元素: list1 = [1,2,3,4,5] list2 = [4,5,6,7,8] print ([l for l in list1 if l in list2]) 输出: [4 ...

  3. samtools 的应用

    1)sam转bam samtools view -bS in.sam > in.bam -b 意思使输出使BAM format -S 意思使输入使SAM,如果@SQ 缺剩, 要写-t

  4. Linux下tar.gz 安装

    将安装文件拷贝至你的目录中 如果是以root身份登录上的,就将软件拷贝至/root中. cp xxx.tar.gz /root 解压缩包 tar xvzf xxx.tar.gz 切换到安装目录下 cd ...

  5. 把Excel导入SQL server时出现错误

    在把Excel导入SQL server时出现“未在本地计算机上注册 Microsoft.ACE.OLEDB.12.0 ”该 错误信息:未在本地计算机上注册“microsoft.ACE.oledb.12 ...

  6. JPA报错, java.lang.NullPointerException

    java.lang.NullPointerException 我觉得这应该是一个很常见的错误, 数据库没取到数据嘛, 很正常, JPA没取到数据就是会抛出空指针异常, 但是就是这么简单的一个错误也让我 ...

  7. springmvc DispatchServlet初始化九大加载策略(三)

    7. initRequestToViewNameTranslator 请求视图名 它主要与视图解析有关,如果对ViewResolvers.ModelAndView.View等没有多大印象,可以先看第8 ...

  8. 带图标的input

    <style> .text{ border:solid 2px #ccc; width:400px; height:40px; background:url(http://d.lanren ...

  9. .NET中的文件IO操作实例

    1.写入文件代码: //1.1 生成文件名和设置文件物理路径 Random random = new Random(DateTime.Now.Millisecond); ); string Physi ...

  10. 蚁群算法(Java)tsp问题

      1.理论概述 1.1.TSP问题 旅行商问题,即TSP问题(旅行推销员问题.货郎担问题),是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只 ...