关于版本控制

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. Base Filtering Engine 拒绝访问解法

    基本筛选引擎(BFE)是一种管理防火墙和 Internet 协议安全(IPsec)策略以及实施用户模式筛选的服务.停止或禁用 BFE 服务将大大降低系统的安全.还将造成 IPsec 管理和防火墙应用程 ...

  2. 核电站问题(codevs 2618)

    题目描述 Description 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定的N和M,求不发生爆炸的放 ...

  3. Paths on a Grid(poj 1942)

    给定一个矩形网格的长m和高n,其中m和n都是unsigned int32类型,一格代表一个单位,就是一步,求从左下角到右上角有多少种走法,每步只能向上或者向右走. //注意循环的时候,要循环小的数,否 ...

  4. 【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

    上次挖了一个坑,今天终于填上了,还记得之前我们做的拉勾爬虫吗?那时我们实现了一页的爬取,今天让我们再接再厉,实现多页爬取,顺便实现职位和公司的关键词搜索功能. 之前的内容就不再介绍了,不熟悉的请一定要 ...

  5. dfs常见的配置文件中的value与description

    照抄于网络: name value description dfs.namenode.logging.level info The logging level for dfs namenode. Ot ...

  6. linux下php增加curl扩展,生成curl.so文件

    进入php源代码目录 cd /php5.6.9/ext/curl 执行生成so文件编译模式 /usr/local/php/bin/phpize 编译curl扩展 ./configure --with- ...

  7. hdu 1045:Fire Net(DFS经典题)

    Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  8. Ubuntu各版本下载地址

    Ubuntu各版本下载地址:     http://old-releases.ubuntu.com/releases/

  9. android中ADT和SDK的关系(转)

    ADT(Android Development Tools): 目前Android开发所用的开发工具是Eclipse,在Eclipse编译IDE环境中,安装ADT,为Android开发提供开发工具的升 ...

  10. 建模算法(十一)——目标规划

    求解多目标规划的思路 1.加权系数法 为每一个目标加一个权系数,把多目标模型转化成单一目标模型.但是困难时确定合理的权系数,以反映不同目标之间的重要程度. 2.优先等级法 将各目标按其重要程度分为不同 ...