玩转git分支

搞个代码的管理工具,居然不弄上分支啥的东西。这简直太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@{0}

大象装冰箱分的是三部。到这里我们的代码还是没有处理完毕的。真正的问题才浮出水面。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命令同时执行了这两个命令。

 

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 330987132 | Go:217696290 | Python:336880185 | 做人要厚道,转载请注明出处!http://www.cnblogs.com/sunshine-anycall/p/4342520.html

时间: 2024-09-20 00:05:29

玩转git分支的相关文章

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

最近事情比较多,一眨眼,已经半个月没有写博客了~不得不感慨光阴似箭啊!当然,2015年有很多让我们期待的事情,比如win10正式版..NET开源.VS2015等等.想想都让人兴奋啊~~ 为了迎接VS2015正式版的到来,我们要更加努力的学习.今天,我们来说一下在VS2013中如何使用Git来管理项目,你不会Git命令也没关系,有了VS2013这个神器,我们即使不会Git命令也可以完美的使用Git来完成项目的管理和发布.    一.将VS2013项目托管到Git   现在的开源项目越来越多,我们会

git分支原理命令图文解析

本地分支解析 git 通过可变指针来实现对提交数据的历史版本的控制,每当我们提交新的更新,当前分支(设为master)则指向最后一个提交更新A,而最后一个提交对象则存在一个指针指向前一次的提交更新Q.如果我们创建一个新的分支,child,它和master共同指向A,这时,如果我们向child分支提交更新B,我们会发现child指向B,而master依然指向A.无论我们在child分支进行了任何开发,只要回到master分支,就能恢复到更新A的数据状态了. 在图片里,我们还注意到有一个head指针

Git分支本地操作详解

引言 在上一节中我们对Git的常用本地操作的命令进行详解,而本节要讲解的是Git的分支, 在讲解之前补充两点概念性的东西: 第一个: 第一节中一个读者提出的疑问,Git和SVN在版本控制中存储方式版本信息的差异. 答:Git关心文件的整体是否发生变化,而SVN则关心的是文件内容的具体差异! SVN每次记录的是有哪些文件进行了修改,以及修改了哪些行的哪些内容: 如上图,比如版本2中记录的是文件A以及文件C的变化,而版本3中仅仅记录文件C 的变化这样,以此类推:而Git并不保存这些前后变化的差异数据

git 分支的创建、合并、删除

 基本概念与命令 分支(branch):每次提交,Git都把提交的内容串成一条时间线,这条时间线就是一个分支 .   git 分支的创建 git branch branchName git 分支的切换 git checkout  branchName git 分支的创建和切换:git checkout -b branchName gt 分支的合并 git merge git分支的删除  git branch -d branchName git分支的查看  git branch      具体步骤

Git学习--&amp;gt;关于Jenkins编译时候,如何获取Git分支的当前分支名?

一.背景 因为代码都迁移到了Gitlab,所以Jenkins编译的时候我们都需要将之前的SVN信息换成现在的Git信息.最近编译一个Lib库的时候,因为团队规定上传Release版本的AAR到Maven的话,必须需要在Jenkins上编译而且Git Branch 必须是master分支才能够上传到Maven. 因此我们就需要在Gradle脚本中,获取Git Branch ,Git Commit等相关信息.但是在获取Git Branch的时候出现了问题,在本地Android Studio编译的时候

git学习------&amp;gt;Git 分支管理最佳实践

ps:本文转载于 : https://www.ibm.com/developerworks/cn/java/j-lo-git-mange/index.html Git 是目前最流行的源代码管理工具.大量的软件项目由 GitHub.Bitbucket 和 GitLab 这样的云服务平台或是私有的 Git 仓库来管理.在使用 Git 时通常会遇到的一个问题是采用何种分支管理实践,即如何管理仓库中作用不同的各类分支.和软件开发中的其他实践一样,Git 分支管理并没有普遍适用的最佳做法,而只有对每个团队

手把手教你玩转Git分布式版本控制系统!

目录  Git诞生历史  Git环境准备 Git安装部署 Git常用命令 Git基本操作 Git管理分支结构 Git管理标签 GitLab安装部署 GitHub托管服务 Git客户端工具   1  Git诞生历史   我想大家还记得Linus torvalds在1991年时发布了Linux操作系统吧,从那以后Linux系统变不断发展壮大,因为Linux系统开源的特性,所以一直接受着来自全球Linux技术爱好者的贡献,志愿者们通过邮件向Linus发送着自己编写的源代码文件,然后由Linus本人通过

Git详解之三:Git分支

原文链接:http://blog.jobbole.com/25877/ 原文:<Pro Git> Git 分支 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的完整副本,对大型项目来说会花费很长时间.(伯乐在线注:如果你对Git还不了解,建议从本Git系列第一篇文章开始阅读) 有人把 Git 的分支模型称为"必杀技特性",而正是因为它,将

tortoisegit git分支的学习笔记

做自己的产品,分支还是很重要的.例如,我发布了一个app,但是有bug,又想做新功能,怎么办呢?如果只在一个git上开发的话,bug会越来越多,原来bug没改完,新功能开发,又会产生新的bug.这样的话,bug永远改不完,版本发布会一拖再拖.   正确的做法,主分支,开发新功能,创建的分支改bug,定期的将分支合并到主分支,对外发布的版本都新分支,改bug的版本,属于稳定版的.发版本成阶梯状.下面介绍一下用tortoisegit创建git分支的方法,个人觉得比较简单.   1,clone二个版本