1. fast-forward和non fast-forward分别代表什么概念?

2. 在git中文件index是个什么概念?

3. stage/index/cache三者有什么关系?

4. git hard/soft/mix是什么概念?

5. HEAD

6. HEAD~和HEAD^

1. fast-forward和non fast-forward分别代表什么概念

fast forward是指可以通过HEAD指针的简单移动就可以达到合并的效果,而后者则反之。比如master分支上新建了一个dev指针,并且在master和dev上都有提交,但是二者并不是涉及同一行,也即没有conflict,这样在master分支上合并dev或者dev分支上合并master都会提示为此次的merge为fast forward, 只是HEAD指针的简单前移。

non-fast forward则可以理解为A和B同时从server更新了同一份代码,而A更改某个文件后提交,随后B也更改了该文件,当执行git push的时候,则会提示non fast forward, 这个时候需要git pull更新,然后提交。

2. 在git中文件index是个什么概念?

索引文件index:http://www.360doc.com/content/12/0419/17/1016783_204960412.shtml

理解下来,git add会把“工作目录”中的改变写到“index file”中,而git commit会把“index file”中的改变写到“git 仓库”。commit -a会直接把“工作目录”的改动写到“index file”和“git 仓库”.

git diff其实就是workcopy本地的内容和index文件比较,而不是和提交的HEAD比较,所以当本地执行完git add后,再git diff会是空的。如果想和HEAD比较,需要git diff HEAD.

那这个index文件存在哪呢?.git/index中二进制文件就是。下图可以看三者的关系:  

3. stage/index/cache三者有什么关系?

git术语解释:http://blogread.cn/it/article/7581

可以理解为index是文件提交的暂存区名称,而暂存区的这些文件前缀都是"cache", 所以现在用cached来形容的命令,表示要操作的文件是存在于index中,而不是workcopy中。而staged和cached更像是同义词,也是git后面版本使用的名词。

4. git hard/soft/mix是什么概念?

首先,hard/soft/mix这三个名词只是用在git reset下;其次,reset的作用是重置HEAD指针到另外一个commit。比如git reset HEAD那什么事情也不会发生。

--soft, 只是将HEAD指针变更,而之前的original HEAD和current HEAD之间的变更内容都放在stage(index)中。

--hard, HEAD指针变更,同样重置index和workcopy,使得三者完全匹配,这是比较危险的,因为这会使得你丢掉work tree.

--mixed(default), 如果git reset不跟参数,那这个是默认,新的HEAD和index匹配,但是workcopy不会被修改,而是把original HEAD和current HEAD之间的变更保存到working copy中作为本地未提交、为stage的内容,用户可以重新修改,然后做commit。

5. HEAD

HEAD:当前分支的最近一次提交;

6. HEAD~和HEAD^

看上去挺复杂:http://mux.alimama.com/posts/799

[git]问题list的更多相关文章

  1. Git 子模块 - submodule

    有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你 独立开发的,用于多个父项目的库. 现在问题来了:你想要把它们当做两个独立的项目,同时又想在 一个项目中使用另 ...

  2. Git 在团队中的最佳实践--如何正确使用Git Flow

    我们已经从SVN 切换到Git很多年了,现在几乎所有的项目都在使用Github管理, 本篇文章讲一下为什么使用Git, 以及如何在团队中正确使用. Git的优点 Git的优点很多,但是这里只列出我认为 ...

  3. Git与Repo入门

    版本控制 版本控制是什么已不用在说了,就是记录我们对文件.目录或工程等的修改历史,方便查看更改历史,备份以便恢复以前的版本,多人协作... 一.原始版本控制 最原始的版本控制是纯手工的版本控制:修改文 ...

  4. Git Bash的一些命令和配置

    查看git版本号: git --version 如果是第一次使用Git,你需要设置署名和邮箱: $ git config --global user.name "用户名" $ gi ...

  5. 在Ubuntu 16.10 安装 git 并上传代码至 git.oschina.net

    1. 注册一个账号和创建项目 先在git.oschina.net上注册一个账号和新建一个project ,如project name 是"myTest". 2.安装git sudo ...

  6. 史上最详细git教程

    题外话 虽然这个标题很惊悚,不过还是把你骗进来了,哈哈-各位看官不要着急,耐心往下看 Git是什么 Git是目前世界上最先进的分布式版本控制系统. SVN与Git的最主要的区别 SVN是集中式版本控制 ...

  7. [版本控制之道] Git 常用的命令总结(欢迎收藏备用)

    坚持每天学习,坚持每天复习,技术永远学不完,自己永远要前进 总结日常开发生产中常用的Git版本控制命令 ------------------------------main-------------- ...

  8. 【解决方案】Myeclipse 10 安装 GIT 插件 集成 步骤 图解

    工程开发中,往往要使用到集成GIT ,那么下面说说插件安装步骤 PS:以Myeclipse 10 为例,讲解集成安装步骤. ----------------------main------------ ...

  9. git 命令

    切换仓库地址: git remote set-url origin xxx.git切换分支:git checkout name撤销修改:git checkout -- file删除文件:git rm  ...

  10. git亲测命令

    一.Git新建本地分支与远程分支关联问题 git checkout -b branch_name origin/branch_name 或者 git branch --set-upstream bra ...

随机推荐

  1. mysql多种备份方式比较及实现

    Mysql备份 MySQL的备份和还原: 备份:存放为副本-->数据备份 RAID1,RAID10:保证硬件损坏而不会业务中止,不能保证逻辑上的损害 例如:DROP TABLE mydb.tb1 ...

  2. Winscp sftp远程linux服务器需要预设密码,怎么解决

    需要在root账户下修改/etc/ssh/sshd_config 文件中PermitEmptyPasswords no改成yes

  3. Telnet

    http://blog.sina.com.cn/s/blog_607072980102uy06.html

  4. css技巧收集

    1. 使用 :not() 为导航添加/取消边框 传统的方法为导航栏添加边框: /* add border */ .nav li { border-right: 1px solid #666; } /* ...

  5. Nginx Debug Log

    //检查nginx.conf时(sudo ./nginx -t),输出数据到检测结果 //ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "配置解析处理&q ...

  6. IOS照片颠倒分析及移动/页面端的处理策略和思路

    前言: 前几天, 写了一篇关于IOS手机上传照片颠倒的技术分析文章: IOS照片颠倒分析及PHP服务端的处理. 不过其思路是从服务器来进行处理的, 这种做法相当普遍. 今天来讲述下, 如何从移动端/页 ...

  7. 解决1130 Host 'localhost' is not allowed to connect to this MySQL server

  8. Java笔记10-Object包装类型字符串

    提纲: 1.java.lang.0bject中常用方法介绍 2.基本类型对应的包装类型的介绍 以及基本类型和包装类型之间的相互转换 3.java.lang.String 字符串处理类 java.lan ...

  9. 关于Kendo的Grid 单元格样式

    <!DOCTYPE html><html style="height: 100%;"><head><meta http-equiv=&qu ...

  10. boolalpha的用法和作用

    #include <iostream> using namespace std; int main() { bool b=true; cout << "b=" ...