http://www.zhihu.com/question/20070065 git相关问题的收集

Git 是 Linux 之父 Linus Trovalds,为管理 Linux 内核代码而建立的,被认为是分布式版本控制工具中的顶级水准。智能、友好、强健、高效。

HEAD代表当前的工作树。

SHA1代表项目文件的对象名。有40位。

tag为对象标签。

在git的概念里总共有四种对象:tree、blob、commit、tag。其关系如下图:

一个重要的概念是:git与其他版本控制系统不一样的是,其它管理系统如svn采用的事增量文件系统。而git则是将每一次提交的全部内容都保存下来。这虽然占用了系统空间。但是在如今这个时代,容量已不是问题。这样做显然可以提高速度。这也是git快捷高效的一个原因。

注:一个blob就是一个内容块。它没有文件名。可能多个对象指向同一个blob。

Git 工作流程

—————————-
1、使用中央服务器辅助协作;

2、每人在服务器拥有一个以自己 id 为名称的分支;

3、各人只许推送更新到自己的分支,不允许推送到别人的分支或者 master;

4、master 由专人管理,在合适时 merge 其它分支(开发初期每日自动 merge 各人分支,生产化后则由人工 merge 经过 review 的分支);

5、代码修改 merge 到 master 后,将同步到所有终端。

Git 常用命令

——————————

1、查看blob对象内容

$ git show SHA1-BLOB

2、查看tree对象内容

$ git ls-tree SHA1-TREE(亦可以用git show)

3、查看commit对象(配合--pretty=raw可以查看详细的commit的内容

$ git show -s --pretty=raw SHA1-COMMIT

或$ git log -s --pretty=raw SHA1-COMMIT

4、一个标签对象包括一个对象名(译者注:就是SHA1签名), 对象类型, 标签名, 标签创建人的名字("tagger"), 还有一

条可能包含有签名(signature)的消息. 你可以用git cat-file 命令来查看这些信息:

  1. $ git cat-file tag v1.5.0
  2. object 437b1b20df4b356c9342dac8d38849f24ef44f27
  3. type commit
  4. tag v1.5.0
  5. tagger Junio C Hamano <junkio@cox.net> 1171411200 +0000
  6. GIT 1.5.0
  7. -----BEGIN PGP SIGNATURE-----
  8. Version: GnuPG v1.4.6 (GNU/Linux)
  9. iD8DBQBF0lGqwMbZpPMRm5oRAuRiAJ9ohBLd7s2kqjkKlq1qqC57SbnmzQCdG4ui
  10. nLE/L9aUXdWeTFPron96DLA=
  11. =2E+0
  12. -----END PGP SIGNATURE-----

5、查看索引:所谓的索引一个在你的工作目录和项目仓库间的暂存区(staging area). 有了它,
你可以把许多内容的修改一起提交(commit). 如果你创建了一个提交(commit), 那么提交的是当前索引(index)里的内容,
而不是工作目录中的内容.

$ git status

该命令可以看到哪些文件被暂存了,哪些文件被修改了但没有被暂存。哪些文件没有没有被跟踪。

6、仓库的建立:

  • git clone 其支持三种协议

    git clone git://url
    git clone http://url
    git clone name@ssh

  • mkdir temp
    cd temp
    git init-db 初始化自己一个仓库。
  • 可以通过git pull来更新仓库。
  • 使用仓库前一定要敲入一下命令
    git config --global user.name "your name"
    git config --global user.email "your email"
7、提交:
$ git commit -a -m "your blabla"
如果有新添加的文件要被跟踪需要敲 git add filepath 或者git add .
8、移动和重命名:
$ git mv oldfilename newfilename
9、删除文件:
$ git rm file
10、字符串查找:
$ git grep "your word" (其相比于grep 可以实现跨分支查找)
11、比较不同的commit:
git diff commit1 commit2
如果只有一个commit则缺省与当前HEAD进行比较。
也可以比较不同commit的同一文件
git diff tag1:file tag2:file 比较一个文件在两个tag之间的不同。

12、查看日志:

git log 选项:-p 显示具体内容 --name-only 只显示更改的文件名称

13、显示文件:

git ls-files 选项: -m 显示修改过的

14、推送的服务器:

将自上次 push 以来的,本地历次 commit,推送到服务器。结合我们的实际,应该这样写:

$ git push origin master:your-id

其中,master 是本地的分支名;your-id 填你在服务器上的 id,服务器的版本库里会有以你的id 为名称的分支。

15、创建显示分支:

$ git branch mybranch [commit-SHA1,分支状态(git show-branch 的标识),远程分支]

$ git checkout mybranch

如此便可以得到某次commit的内容分支或者跟随某一个远程分支。

单独的git branch可以用来查看分支

git branch -a可以将远程分支也显示出来。

git branch -d branch用以删除已经合并的分支

git branch -D branch强制删除分支

16、显示提交状态:

$ git show-branch

17、迁出文件:

恢复某个已修改的文件(撤销未提交的修改)

$ git checkout file-name
切换到另外的分支,进行开发:$ git checkout branch-name
18、撤销提交:
$ git revert commit-SHA1(可能会产生冲突)
19、删除提交:
$ git reset --soft commit-SHA1(只是删除提交信息,除此,其他东西都还在)
$ git reset --harf commit-SHA1 全部删除
20、修改最近一个次提交:
此种情况是为了如果在提交后发现有个文件没有添加跟踪或者要修改注释时可以在分别作了相应处理后敲入git commit -amend
21、STASH先将未提交的修改暂存起来,接着清除所有改动,
使之与没修改时一样。若你正在开发功能 A,又需立即去开发功能 B。A 的代码正改到一半,未认真整理,你不想立即提交。此时……请呼叫 stash ~。
它会使你所有未提交的修改瞬间不见了:$ git stash
它会使刚刚不见了的修改,瞬间又回来了:$ git stash pop
22、git send-email
可以配置gitconfig文件sendemail选项来确定发送的邮件格式。
如果不需要经过邮件服务器只是发送的本机的信箱那么就不需要配置smtp选项。而在sendemil.to上加上
接受人的系统上的名字即可git send-email可以发送生成的patch文件但是要发给本机的话一般机上commit号或者commitid即可。
 
23、其他:

  

git ls-tree HEAD file 显示file在HEAD中的SHA1值。
git cat-file -t SHA1 显示一个SHA1的类型。 
git cat-file type SHA1 显示一个SHA1的内容。type是blob、tree、commit、tag之一。

patch: 
git format-patch -1 生成最后一个提交对应的patch文件。 
git am < patch 把一个patch文件加入git仓库中。 
git am --resolved 如果有冲突,在解决冲突后执行。 
git am --skip 放弃当前git am所引入的patch。

clean: 
git clean -dxf 用于清除未跟踪文件。
git clean -dnf 可以显示需要删除的文件,但不包括被.gitignore忽略的。
git reset --hard HEAD 用于清除跟踪文件的修改。

pro git 使用积累的更多相关文章

  1. Pro Git 第一章 起步 读书笔记

    Pro Git 笔记 第1章 起步 1.文件的三种状态. 已提交:文件已经保存在本地数据库中了.(commit) 已修改:修改了某个文件,但还没有提交保存.(vim) 已暂存:已经把已修改的文件放在下 ...

  2. 《Pro Git》阅读随想

    之前做版本管理,我使用最多的是SVN,而且也只是在用一些最常用的操作.最近公司里很多项目都开始上Git,借这个机会,我计划好好学习一下Git的操作和原理,以及蕴含在其中的设计思想.同事推荐了一本< ...

  3. Pro Git(中文版)

    Pro Git(中文版) 返回 Git @ OSC 目录 1.起步 1.1 关于版本控制 1.2 Git 简史 1.3 Git 基础 1.4 安装 Git 1.5 初次运行 Git 前的配置 1.6 ...

  4. 《Pro Git》笔记3:分支基本操作

    <Pro Git>笔记3:Git分支基本操作 分支使多线开发和合并非常容易.Git的分支就是一个指向提交对象的可变指针,极其轻量.Git的默认分支为master. 1.Git数据存储结构和 ...

  5. 【Tools】Pro Git 一二章读书笔记

    记得知乎以前有个问题说:如果用一天的时间学习一门技能,选什么好?里面有个说学会Git是个很不错选择,今天就抽时间感受下Git的魅力吧.   Pro Git (Scott Chacon) 读书笔记:   ...

  6. Pro Git CN Plus

    Git — The stupid content tracker, 傻瓜内容跟踪器.Linus 是这样给我们介绍 Git 的. Git 是用于 Linux 内核开发的版本控制工具.与常用的版本控制工具 ...

  7. 《Pro git》

    可以通过阅读 CODING 工程师参与翻译的 <Pro Git> 进一步掌握 Git 版本控制系统. https://git-scm.com/book/zh/v2

  8. 《Pro Git》轻松学习版本控制

    转自 https://kindlefere.com/post/333.html 什么是“版本控制”?我为什么要关心它呢?版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.在 ...

  9. [Git00] Pro Git 一二章读书笔记

    记得知乎以前有个问题说:如果用一天的时间学习一门技能,选什么好?里面有个说学会Git是个很不错选择,今天就抽时间感受下Git的魅力吧.   Pro Git (Scott Chacon) 读书笔记:   ...

随机推荐

  1. 第十四章:Annotation(注释)

    一:注解 1.当成是一种修饰符吧,修饰类及类的所有成员. 代码里的特殊标记,这些标记可以在编译.类加载.运行时被读取. 2.@Override:强制子类覆盖(重写)父类的方法. @Deprecated ...

  2. 转:Oracle中merge into的使用

    最近项目上使用Oracle的Merge,所以找来一下资料学习了解. 该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和I ...

  3. poj3237 树链剖分 暴力

    NEGATE a,b 将a b间的线段取反,这题应该用线段树+成段更新.我成段更新写的挫了,试了暴力修改过了(数据水). 也是简单的题目.不过要注意点和边的区别. #include<queue& ...

  4. 只用js 实现的简约聊天框

    之前看到别人的网页打开后都有个聊天框,可以与同时在网上的网友聊点简单话题,于是便找了个最简单的方法 使用js,客户端 打开页面,不断的给服务器发送请求来得到 新的消息 用JavaScript实现的轮询 ...

  5. Java设计模式-桥接模式(Bridge)

    桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化.桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时 ...

  6. shell--题目

    1.有一个文件,里面有二列,第一列ip地址,第二列是时间,同一个ip可能出现多次,但时间不同. 文件类似下面的样子: 192.168.1.2              13:10 192.127.12 ...

  7. 【bzoj1857】 Scoi2010—传送带

    http://www.lydsy.com/JudgeOnline/problem.php?id=1857 (题目链接) 题意 给出两条线段AB和CD,在AB上的速度为P,在CD上的速度为Q,在AB,C ...

  8. angularjs-$interval使用

    1. 简单使用 var app = angular.module("app",[]); app.controller("AppCtrl", function($ ...

  9. JSON前端页面解析

    JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言 * JSON 具有自我描述性,更 ...

  10. view的绘制原理

    转:http://blog.csdn.net/berber78/article/details/42069301 自定义UI控件,需继承 View类或View的子类,并重载View类中的一些方法,不必 ...