关于版本控制

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基础及分支的更多相关文章

  1. ###Git 基础图解、分支图解、全面教程、常用命令###

    一.Git 基础图解 转自:http://www.cnblogs.com/yaozhongxiao/p/3811130.html Git 图解剖析 git中文件内容并没有真正存储在索引(.git/in ...

  2. 1、git基础介绍及远程/本地仓库、分支

    1. Git基础介绍 基于Git进行开发时,首先需要将远程仓库代码clone到本地,即为本地仓库.后续大部分时间都是基于本地仓库上的分支进行编码,最后将本地仓库的代码合入远程仓库. 1.1. 远程仓库 ...

  3. Git Pro - (2)分支

    Git 保存的不是文件差异或者变化量,而只是一系列文件快照. 在 Git中提交时,会保存一个提交(commit)对象,它包含一个指向暂存内容快照的指针,作者和相关附属信息,以及一定数量(也可能没有)指 ...

  4. [转] Git 基础 - 打标签

    2.6 Git 基础 - 打标签 打标签 同大多数 VCS 一样,Git 也可以对某一时间点上的版本打上标签.人们在发布某个软件版本(比如 v1.0 等等)的时候,经常这么做.本节我们一起来学习如何列 ...

  5. Git基础操作

    配置秘钥 1.检查本机有没有秘钥 检查~/.ssh看看是否有名为d_rsa.pub和id_dsa.pub的2个文件. $ ~/.sshbash: /c/Users/lenovo/.ssh: Is a ...

  6. 《Pro Git》笔记2:Git基础操作

    第二章 Git基础 Git基础包括:版本库的创建和获取,文件添加修改提交等基本操作,状态查询,远程版本库管理和同步,打标签. 1.取得项目的Git版本库 基于Git的工作流要以Git版本库为基础,即可 ...

  7. Git详解之二 Git基础

    Git 基础 读完本章你就能上手使用 Git 了.本章将介绍几个最基本的,也是最常用的 Git 命令,以后绝大多数时间里用到的也就是这几个命令.读完本章,你就能初始化一个新的代码仓库,做一些适当配置: ...

  8. 2.4 Git 基础 - 撤消操作

    2.4 Git 基础 - 撤消操作 撤消操作 任何时候,你都有可能需要撤消刚才所做的某些操作.接下来,我们会介绍一些基本的撤消操作相关的命令.请注意,有些撤销操作是不可逆的,所以请务必谨慎小心,一旦失 ...

  9. Git基础教程(二)

    继续上篇Git基础教程(一),在开篇之前,先回顾一下上篇中的基本命令. 配置命令:git config --global * 版本库初始化:git init 向版本库添加文件:git add * 提交 ...

随机推荐

  1. 解决remove @override annotation(jdk1.5和jdk1.6)

    在@override注释在jdk1.5环境下只能用于对继承的类的方法的重写,而不能用于对实现的接口中的方法的实现. 解决方法: 删除 @override

  2. cjb

    输入216.194.70.6 ,进入到是cjb.net的主页,并不是shell.cjb.net ,进入主页后点击shell,就进不去了 分析:shell.cjb.net被DNS污染了 解法:hosts ...

  3. Redis适用于高并发的递增、递减功能

    递增指令:incr(默认从0开始) 递减指令:decr(默认从0开始,递减会出现负数,这点跟memcache不一样,mc到0) 如下: 附上shardedJedisPool和JedisCluster的 ...

  4. OC内存管理(MRC)

    首先说明一下几块存储区域: 栈区(局部变量.函数参数值) 堆区(对象.手动申请/释放内存) BSS区(未初始化的全局变量.未初始化的静态数据) 常量区(字符串常量以及初始化后的全局变量.初始化后的静态 ...

  5. 拷贝Java项目报错

    经常需要将一个项目,导出,然后发给同事,或者是自己用另一个Eclipse工具打开. 这时,导入项目后,就会出现各种各样的问题.大牛笔记:www.weixuehao.com 代码相同,环境不同,主要是修 ...

  6. SecureCRT乱码

    http://jingyan.baidu.com/article/948f59245be128d80ff5f9aa.html

  7. GridView实现一个图片加多个文本框

    GridView的使用是很简单的,API Demo中有例子,但是要实现复杂的GridView,就需要自定义了. 今天我们要实现如下的效果: 先说它的布局,它是由gridview和grid_item两部 ...

  8. 【HTML5】Canvas画布

    什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形.字符以 ...

  9. 【spring 区别】ClassXmlAplicationContext和FileSystemXmlApplicationContext的区别

    今天写一个简单的spring使用例子,遇到这个问题: 项目结构如下: 代码如下: package com.it.sxd; import java.nio.file.FileSystem; import ...

  10. [转]notepad++各种插件

    http://www.crifan.com/files/doc/docbook/rec_soft_npp/release/htmls/npp_common_plugins.html