git基础及分支
关于版本控制
git是一种分布版本控制系统,每一主机都保存了完整副本。必杀技是分支。
在Windows可安装git客户端msysgit。
git基础
第一次看progit觉得有点不懂,不懂版本控制,一条条命令写的觉得很麻烦没头绪。这次在看了向导guides.github.com之后,文章避免了一些细枝末节的命令,而是介绍工作流程,懂了一点工作大概流程再开始使用命令比较合适。
三种状态
工作目录、暂存区域、git目录
工作目录就是你打开文件夹看到可见目录。暂存区域含有添加(add)之后的文件。git目录是已被提交的一些文件的仓库。
比如我从仓库里检出(checkout)一个自行车,准备补个胎,刚弄了一半要吃饭了,显然不能放到(commit)仓库里,需要暂存(stage)在一个地方。
取得仓库
从一个目录开始初始化一个git仓库,或者从已有的仓库开始。
前者使用命令 git init
已有的仓库则是 git clone …… 从一个远程仓库中克隆一个。
记录每次更新
git add 跟踪新的文件(把东西放入仓库货单里)/暂存修改过的文件,可以使用通配符。忽略文件的配置放在.gitignore文件下。
git status 查看状态(查看仓库状态)
git diff 查看暂存的与仓库中的区别
git commit 提交更新,跳过暂存步骤直接更新,git commit –a
git rm 从仓库中删除文件,解除被跟踪的状态,不删除文件,git rm --cache。
git mv 改名
查看历史记录
git log
撤销操作
修改最后一次提交:commit之后发现有几个文件没加,git add 暂存之后,再git commit --amend 。
取消已暂存文件: git reset HEAD
取消文件的修改: git checkout --
git远程仓库
打标签
自动完成与别名
git分支
每次提交之后,就会保存一个commit对象,这个对象里头包含了关于这个仓库里货物的所有信息,就是一个快照,如果不是第一次commit,还有一个指向之前祖先的指针。具体包含什么没搞太清楚,反正拥可以代表仓库的快照。
分支本质就是一个指针,内容为所指对象校验和(40 个字符长度 SHA-1 字串),默认的分支为master,每次提交之后,分支自动往前移动。
git branch develop-edtion 添加一个开发板分支,就新建了一个开发板分支。head指针向正在工作的目录
master(head)
+
|
v
[1st commit]<--[2st commit]<--[3ed commit]
+
|
v
develop-edition
如果要切换正在工作的分支使用git check 分支名来切换。
基本分支与合并
分支
你正在愉快的工作,一个个版本地更新。现在开始第三版的一个问题,是issue51反馈来的,于是新建了一个分支issue51(git brach issue51)开始工作,一切如常。
issue51的问题还没完成呢,突然来了个电话,需要修改网站页脚的一个号码,马上将修改过的文件提交,不然切换不了分支(好像也有别的方法)。得到了干净的工作区域和暂存区域之后,开始切换分支git checkout master 回到master分支工作。
新建一个hotfix分支,编辑index.html文件,修改电话号码,提交。测试了一下,确认修补是成功的。可以将hotfix与master合并了,git merge hotfix合并了两个分支。hotfix可以直接移动到达master分支与之合并,没有什么分歧,称之为fast forward。
然后分支hotfix已经没什么用了git branch -d hotfix 删除掉hotfix,回到issue51继续工作git checkout issue51 继续工作。
合并
这时hotfix修补的内容并没有到issue51里。可以将master的分支合并到issue51里,git merge master。
在#51的工作完成了,需要合并到master中,先回到master分支 git checkout master,然后合并git merge issue51。这次合并和上次不一样,不能直接右移指针。通过和共同祖先分别对比之后合并。
合并时遇到冲突
比如同一个位置,两个分支都做了不同的修改,git会在这个位置加入冲突的标记。需要手工定位解决,修改完文件为需要的样子之后,git add 暂存文件,即表示已经解决冲突,git status 查看状态是否解决,如解决提交即可。(git mergetool 可以调用可视化的工具解决冲突,没试过。)
分支管理
git branch 查看分支,加个参数-a,查看本地及远程分支。
git branch -v 查看最后一次提交状态
git branch -d 删除分支,大写D强制删除,因为如果修改了没合并的分支不能直接删除。
git branch --no-merged 查看未合并的分支。
分支工作流程
长期分支,多个分支比如稳定版、开发版,随着进度推移,不断地将开发版合并入为稳定版,然后往前开发开发版。
特性分支,短期内实现某种工作的分支,比如之前的issue51和hotfox分支。这种临时性的分支务必作为临时分支。
远程分支
远程分支无在本地是无法变化的,只有git有网络活动才会更新。远程分支的名称 origin/分支名 表示。你克隆一个仓库后,本地主分支默认和远程分支一个位置,可以本地master可以继续工作。当别人在推送给远程分支内容时,本地分支没有变化,需要git fetch origin连接网络进行更新。
多个远程分支,一个仓库可有有多个远程分支。比如一个git.ourcompany.com 共用的,一个供team1小组使用的,git.team1.ourcompany.com,team1内部处理好的工作,最后才能提交合并到共用服务器上。比如我属于这个公司的team1团队,就需要添加一个团队的远程分支git remote add team1 git://git.ourcompany.com 。
推送到远程分支,当需要和别人协作完成一个分支时,就需要把分支推送到远程仓库成为远程分支。比如将我本地的serverfix分支推送到远程仓库并将分支命名为awesomebrank,执行 git push origin serverfix:awesomebranch。推送成功后,协作者需要更新本地仓库 git fetch origin,就得到了awesomebranch这个分支了,也许用一样的名字更好,那就push origin serverfix:serverfix。如果从我的修改开始工作,就git checkout -b serverfix origin/serverfix 将本来不可移动的远程分支检出到本地,并跟踪远程(track )分支,“跟踪”表示这个本地分支是和远程的这个分支有联系的,提交到远程服务器的时候就知道要更新远程的这个分支喽。或者这个家伙已经完成了一些自己的工作了,那直接合并git merge origin/serverfix,似乎合并后也就自动跟踪了。
跟踪分支,本地master默认跟踪origin的master。如果要将本地的一个分支跟踪远程的分支git checkout -b [分支名] [远程名]/[分支名] ,如果本地和远程的分支名一样的都是serverfix,可以直接git checkout --track origin/serverfix (1.6.2 以上版本的 Git)。
删除远程分支,git push origin :serverfix ,将一个空的本地分支推送(push)到serverfix的远程分支,这样远程分支就没了。
衍合
衍合(rebase)能够得到一个更简洁的提交(commit)记录。完成了一个名为exper分支,需要和master合并,比如 a 产生 b (exper分支)和 c (master分支)合并得到 d (master)。记录会保存每一次快照 a b c d。
如果使用衍合,之前的曾经exper分支上的b提交就像没发生过一样。记录只是这样:a -- b -- d 或者 a -- c -- d。
git checkout exper 到exper分支工作
git rebase master 衍合到master分支
git checkout master 到master工作
git merge exper 将master合并到exper,直接就是一个快进(fast forword)
区别就是提交记录不一样。衍合的工作原理就是将两者的共同祖先的区别放在一个区别文件,一次执行。
有趣的衍合,图3.31 3.32
衍合的风险,千万不要已经推送到公共仓库的更新。因为你衍合之后消失了本来在公共仓库的分支,公共仓库的分支消失了,还产生了新的提交记录快照(sha-1值变了),再推送到公共仓库的时候,别人很可能在这个消失的分支上工作了,合并过记录。当他再次同步仓库的时候,消失的分支仍然在。最后还要和你新的提交记录快照(sha-1值变了)再次合并。这样会产生重复的提交commit message,这是因为之前已经合并过了。他将数据再次推送到服务器之后还会继续迷惑其他人。
所以只能衍合非公共的分支,切记。
---
windows下msysgit很慢。
诊断方法:https://github.com/msysgit/msysgit/wiki/Diagnosing-why-Git-is-so-slow
自动补全很慢,配置文件系统缓存,配置方法:git config core.fscache true 。
git pull 和 fetch 有什么区别: http://stackoverflow.com/questions/292357/what-are-the-differences-between-git-pull-and-git-fetch
git基础及分支的更多相关文章
- ###Git 基础图解、分支图解、全面教程、常用命令###
一.Git 基础图解 转自:http://www.cnblogs.com/yaozhongxiao/p/3811130.html Git 图解剖析 git中文件内容并没有真正存储在索引(.git/in ...
- 1、git基础介绍及远程/本地仓库、分支
1. Git基础介绍 基于Git进行开发时,首先需要将远程仓库代码clone到本地,即为本地仓库.后续大部分时间都是基于本地仓库上的分支进行编码,最后将本地仓库的代码合入远程仓库. 1.1. 远程仓库 ...
- Git Pro - (2)分支
Git 保存的不是文件差异或者变化量,而只是一系列文件快照. 在 Git中提交时,会保存一个提交(commit)对象,它包含一个指向暂存内容快照的指针,作者和相关附属信息,以及一定数量(也可能没有)指 ...
- [转] Git 基础 - 打标签
2.6 Git 基础 - 打标签 打标签 同大多数 VCS 一样,Git 也可以对某一时间点上的版本打上标签.人们在发布某个软件版本(比如 v1.0 等等)的时候,经常这么做.本节我们一起来学习如何列 ...
- Git基础操作
配置秘钥 1.检查本机有没有秘钥 检查~/.ssh看看是否有名为d_rsa.pub和id_dsa.pub的2个文件. $ ~/.sshbash: /c/Users/lenovo/.ssh: Is a ...
- 《Pro Git》笔记2:Git基础操作
第二章 Git基础 Git基础包括:版本库的创建和获取,文件添加修改提交等基本操作,状态查询,远程版本库管理和同步,打标签. 1.取得项目的Git版本库 基于Git的工作流要以Git版本库为基础,即可 ...
- Git详解之二 Git基础
Git 基础 读完本章你就能上手使用 Git 了.本章将介绍几个最基本的,也是最常用的 Git 命令,以后绝大多数时间里用到的也就是这几个命令.读完本章,你就能初始化一个新的代码仓库,做一些适当配置: ...
- 2.4 Git 基础 - 撤消操作
2.4 Git 基础 - 撤消操作 撤消操作 任何时候,你都有可能需要撤消刚才所做的某些操作.接下来,我们会介绍一些基本的撤消操作相关的命令.请注意,有些撤销操作是不可逆的,所以请务必谨慎小心,一旦失 ...
- Git基础教程(二)
继续上篇Git基础教程(一),在开篇之前,先回顾一下上篇中的基本命令. 配置命令:git config --global * 版本库初始化:git init 向版本库添加文件:git add * 提交 ...
随机推荐
- CSS对字体单位的总结
国内的设计师大都喜欢用px,而国外的网站大都喜欢用em和rem,那么三者有什么区别,又各自有什么优劣呢? PX特点 1. IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能够调整的 ...
- Diablo3
1.装备 主手:元素弓 副手:精细箭袋 头: 胸:燃火外套 手:娜塔亚的手感 护腕:稳击护腕 戒指:罗盘玫瑰+布尔凯索的婚戒 颈部:旅者之誓 腰:科雷姆的强力腰带(速度加25%) 腿:深渊挖掘裤 脚: ...
- ping 有端口的ip
使用工具 tcping 使用方法,将此工具放在C:/Windows/System32 目录下, 在cmd 中: tcping 127.0.0.1 8080
- C++拷贝构造函数(深拷贝,浅拷贝)
http://www.cnblogs.com/BlueTzar/articles/1223313.html 对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; ...
- css局部概念的理解:
1.DIV-Padding理解:一直以来对div中的padding属性,一直不理解,使用最多的也就是margin,padding是div的内空间的相对距离,margin是div的外部相对位置,如果用一 ...
- hdu 1242:Rescue(BFS广搜 + 优先队列)
Rescue Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- jquery+php实现用户输入搜索内容时自动提示
index.html <html> <head> <meta charset=;} #search_auto li a:hover{background:#D8D ...
- 我对序列化(Serializable)的理解
转自:http://blog.tianya.cn/blogger/post_show.asp?BlogID=764&PostID=3231409 序列化是把一个对象的状态写入一个字节流的过程. ...
- vs2010如何生成EXE文件如何更改EXE程序图标
vs2010如何生成EXE文件 F5启动调试后,进入下面路径查找: 我的文档\Visual Studio 2010\Projects\项目名称\项目名称\bin\Debug 如何更改EXE程序图标 其 ...
- Hark的数据结构与算法练习之插入排序
算法说明: 先是拿语言进行一下描述: 假如是做降序排序,那么从头开始扫描每个数字,使每个数字与它前面的若干数字进行比较,直接找到小于当前数字a(当前数字以a代替)的数字b(小于a的数字以b代替). 然 ...