常用 Git 命令清单(推荐)

作者: 阮一峰

日期: 2015年12月 9日

我每天使用 Git ,但是很多命令记不住。

一般来说,日常使用只要记住下图6个命令,就可以了。但是熟练使用,恐怕要记住60~100个命令。

下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。

  • Workspace:工作区
  • Index / Stage:暂存区
  • Repository:仓库区(或本地仓库)
  • Remote:远程仓库

Continue reading

基于SourceTree 下的 Git Flow 模型

gitflow 开发流程参考:http://blog.haohtml.com/archives/15317

git_flow
基于SourceTree 下的 Git Flow 模型

1. sourceTree  是一个开源的git 图形管理工具,可下载mac版本,windows版本

2. Git Flow 是一套使用Git进行源代码管理时的一套行为规范和简化部分Git操作的工具。

基本的操作流程

1. 先用sourceTree 创建本地git 项目,xxxProject,

2. 在项目里面先提交一次 commit 一下,默认提交在了 master分支;

3. 然后在 sourceTree工具 右上角,点击 GitFlow,开启git Flow 规范模型的开发

git-flow_1

如上图,在开启gitFlow 之后;

生产环境分支使用:master

开发分支使用:develop

当需要新增加功能,发布版本时,创建补丁修复bug时,分别有对应的 feature,release,hotfix前缀这样的分支 Continue reading

Git忽略文件权限

默认git会记录文件的权限信息,如果文件的权限信息被修改,那么git也作为一个差异保存。但是我们有时候是不需要这方面的差异的(例如在Windows下使用Cygwin),这时需要关闭文件权限的检查。

15122405_7vQg

git中可以加入忽略文件权限的配置,具体如下:

$ git config core.filemode false
$ git config --list

也可以使用以下命令查看是否生效。

cat .git/config

15122405_SsDD

还有一个小问题,在设置这个属性之前权限就混乱的话,是无法自动修复的。这时候,如果仅仅是权限混乱的话,直接git reset --hard恢复吧,git会将项目完全恢复到最近一次提交,包括权限。

git diff命令详解

diff里面a表示前面那个变量,b表示第二个变量

HEAD     commit版本
Index     staged版本

a、查看尚未暂存的文件更新了哪些部分,不加参数直接输入
git diff
此命令比较的是工作目录(Working tree)和暂存区域快照(index)之间的差异
也就是修改之后还没有暂存起来的变化内容。

b、查看已经暂存起来的文件(staged)和上次提交时的快照之间(HEAD)的差异
git diff --cached
git diff --staged
显示的是下一次commit时会提交到HEAD的内容(不带-a情况下)
Continue reading

写好 Git Commit 信息的 7 个建议

这里推荐:http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html
介绍: 为什么好的提交信息如此重要

当你随意浏览任一 git 仓库的日志,你很可能会发现其中的提交信息或多或少有点乱。举个例子,瞧一瞧我早先提交到 Spring 上的这些宝贝:

$ git log --oneline -5 --author cbeams --before "Fri Mar 26 2009"

e5f4b49 Re-adding ConfigurationPostProcessorTests after its brief removal in r814. @Ignore-ing the testCglibClassesAreLoadedJustInTimeForEnhancement() method as it turns out this was one of the culprits in the recent build breakage. The classloader hacking causes subtle downstream effects, breaking unrelated tests. The test method is still useful, but should only be run on a manual basis to ensure CGLIB is not prematurely classloaded, and should not be run as part of the automated build.

2db0f12 fixed two build-breaking issues: + reverted ClassMetadataReadingVisitor to revision 794 + eliminated ConfigurationPostProcessorTests until further investigation determines why it causes downstream tests to fail (such as the seemingly unrelated ClassPathXmlApplicationContextTests)

147709f Tweaks to package-info.java files

22b25e0 Consolidated Util and MutableAnnotationUtils classes into existing AsmUtils

7f96f57 polishing

狂吐吧!和最近提交到同一个仓库的信息比较一下:

$ git log --oneline -5 --author pwebb --before "Sat Aug 30 2014"

5ba3db6 Fix failing CompositePropertySourceTests

84564a0 Rework @PropertySource early parsing logic

e142fd1 Add tests for ImportSelector meta-data

887815f Update docbook dependency and generate epub

ac8326d Polish mockito usage

你更喜欢阅读哪一个?

前者长度和形式截然不同,后者则简洁一致。前者像是随意为之,而后者才是精心构思的。 Continue reading

git中 gitignore 文件的正确用法

使用 git 做代码管理工具时,设置 gitignore 是必不可少的流程,一些系统或者 IDE 会在目录下生成与项目不相关的文件,而这些文件我们不期望被提交到仓库之中。理解 gitignore 的 pattern 规则十分重要。

Pattern 规则

关于 Pattern 规则,可以查看 git 的相关文档:http://git-scm.com/docs/gitignore,大致有以下几点:

  1. 空行不匹配任何内容,所以可以作为块分隔符;
  2. # 开头表示注释,如果相匹配 #,可以在前面加一个反斜杠,即 \#
  3. 除非加了反斜杠,否则一连串的空格会被忽略;
  4. 如果在匹配的内容前面加上 !,则这些匹配过的部分将被移出,如果要匹配以 ! 开头的内容,需要加上反斜杠,如 \!important.txt
  5. 如果一个匹配 pattern 后面有一个斜杠,如 foo/,则默认会匹配所有(包含父子文件夹)中的 foo 文件夹内容,并且它不会匹配单个的文件;
  6. 如果一个匹配 pattern 不包含斜杠,如 foo,Git 会将其作为一个 shell 的查找命令匹配内容。

需要注意的 ** Continue reading

Git回滚的常用手法

传统VCS的回滚操作

对于版本控制系统VCS来说,回滚这个操作应该是个很普通也是很重要的需求。

如果你是传统VCS,比如SVN或者P4来说,revert是个最直观,也是最直接的手段,当然前提是你的修改还没有被提交到远程的中央仓库。

如果你已经ci了你的code到了远程中央仓库,那revert恐怕也无能为力,只能借助其他命令workaroud这个问题,比如:你用SVN的话,就得来个逆向merge操作,把所有的修改都merge回去。

但这样做也有一些弊端:

这次merge会作为一次全新的commit记录记录下来,也就是说它不能真正从你的历史记录里面抹掉你那次不想要的修改。通常情况下其实也没啥大不了的,除非你个人洁癖就是不想看到以前的那次commit记录或者你真的干了啥不想让别人知道的事情。

Git时代的回滚操作

但当发展到git时代,这种回滚操作的复杂度,已经随着git模型本身的特点,变得不那么简单了。

熟悉git的人都知道,为了分布式的需求,git将每一个网络节点作为了一个完整的VCS,也就是每个单台的host在没有网络的前提下,都是一个不受任何影响可以满足除了和其他节点同步(比如:git pull/push这类)之外的几乎所有操作。

为了达到这种效果,git不仅在本地有一个完整的local repository,而且将原本简单的working tree(或者叫working directory)也切成了两块区域——working tree和index(也叫stage)。

这样,光从本地修改的角度来看,你的修改就可能存在三块区域中,working tree、index或者commit之后的历史对象区域。下面我们一个一个各个区域一般都怎么回滚。 Continue reading

git commit 与 git commit -a 的区别

软件版本:
操作系统:ubuntu10.04
内核版本:Linux version 2.6.32-36-generic
git 版本:git version 1.7.0.4

目录:

1. 文件状态
2. 提交
2.1 git commit 与 git commit -a
2.2 添加提交信息
3. 修改/取消
4. 参考资料

1. 文件状态

一般仓库中的文件可能存在于这三种状态:

1)Untracked files → 文件未被跟踪;
2)Changes to be committed → 文件已暂存,这是下次提交的内容;
3)  Changes bu not updated → 文件被修改,但并没有添加到暂存区。如果 commit 时没有带 -a 选项,这个状态下的文件不会被提交。 Continue reading