目录:
** 0x01 基础教程/0x02 分支流程/0x03 提交日志/0x04 变化比较/0x05 团队协作/0x06 高级用法/0x07 常见问题(FAQ)/0x08 掌握Git的秘诀

0x01 基础教程

首先,这是一组我根据链接难度和相关性组织的懒人图解学习包:

其次,需要推荐Git Data Transport Command里的这张图,一图读懂Git的数据传输流程,对于通过理解来记忆命令非常有好处。为了便于修订和添加,我重新制作了这张图:

最后,@SoftwareTeacher提到了上图中的workspace/index/local repository三者都是用户在自己本机上的代码,比较让初学者困惑。我们可以对照下中英文术语解释下:

  • workspace,中文术语:工作区。就是本地代码目录下除去.git文件夹外的文件,这部分代码的任何变动通过git status可以看到是红色标示的。
  • index,也叫stage area,中文术语:暂存区。暂存区域是一个文件,一般在.git目录中,保存了下次将提交的文件列表信息。在暂存区,还未提交到版本库的文件,通过git status可以看到是绿色标示的。
  • local repository,中文术语:本地版本库。就是代码目录下的.git目录。本地版本库和暂存区的元数据都存储在.git目录下。本地版本库里含有本地创建的各个分支索引,以及远程版本库分支的索引信息。在local repository上的操作默认是针对当前分支。
  • remote repository,中文术语:远程版本库。就是Github/Gitlab或者自己搭建的代码托管服务器上的代码仓库。

把本地代码分为三个区,是git的一个特色,是一种解决本地复杂代码修改变动管理的方案,Git的基本操作在这三个区之间

  • 在工作目录中修改文件。
  • 暂存文件,将文件的快照放入暂存区域。
  • 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。

0x02 分支流程

  • 分支操作的基本命令:

    • git checkout -b <name> 可以创建出一个名为name的分支
    • git checkout <name> 可以切换到名为name的分支
    • git branch,用来显示本地有哪些分支,用*号标示的就是当前分支。当你在分支之间做git merge或者git rebase,以及在远程版本库和本地版本库之间做git pull或者git pull --rebase时,遇到冲突的时候,查看状态最重要的两个命令就是git statusgit branch
    • git branch -a,用来显示本地的分支以及已经同步的远程分支列表。通过git fetch可以把还没有同步到本地的远程分支索引同步下来,再通过git branch -a就可以看到。
  • 图解Github的PullRequest开发方式:Understanding the GitHub Flow

0x03 提交日志

0x04 变化比较

0x05 团队协作

0x06 高级用法

0x07 常见问题(FAQ)

状态查看
Q:为什么git status的使用频率很高?
A:git status是最高频的命令,用来查看当前状态以确认发生了什么,主要是下面三种常见情况:

  • 红色的是workspace里新发生的变动。
  • 绿色的是已经执行过git add,从workspace添加到index的变动。
  • 解决冲突中当前冲突解决的状态

日志:

Q: 如何diff文件的最后一次变动?
A: git log -1 -p -- filename

Q: 如何查看两个分支之间的提交差异,例如branckA分支有的,而branchB分支没有的commit?
A: git log branchB..branchA --oneline

Q: 如何查看最新1条日志,-ni表示最新i条日志,默认全部展示太多了:
A: git log -n1

Q: 如何查看某个成员的所有日志:
A: git log --oneline --author=feilong

Q: 如何过滤日志:
A: git log --grep keyword

Q: 如何查看某个文件被那条.gitignore忽略规则所忽略?
A: git check-ignore -v filename

Q: 如何方便的查看变动日志?
A: 如果机子上装了lighttpd或者webrick则git instaweb或者git instaweb --httpd=webrick

Q: 如何同时查看每个分支的最顶端的commit?
A: git branch -vv

Q: 如何查找哪些文件里含有一个字符串,例如函数名?
A: git grep -l monitor

分支

Q:如何查看所有分支
A:git branch -a

Q:如何切换到别的分支
A: git checkout other_branch_name

Q: 如何从别到分支合并到当前分支
A: git merge other_branch_name

Q: 如何以别的分支为基准在当前分支上重做
A:git rebase other_branch_name

提交

Q:代码修改一半,需要临时更新代码修改一个BUG怎么办?
A:把当前代码临时放到stash stack里:

  • 入栈:git stash
  • 更新,修改并提交:
    • git pull --rebase
    • do something
    • git add .
    • git commit -m 'fix bug'
    • git push origin master
  • 出栈:git stash pop

冲突:
Q: 遇到冲突的时候,如何只使用自己的版本?
A: 取决于是merge还是rebase,在merge中--ours表示自己的版本,--theirs表示对方的版本,而rebase时相反,rebase顾名思义指以对方的版本为基准版本。

  • merge:

    • git merge other_branch_name
    • 在merge中,使用自己的版本是:git checkout --ours,使用对方的版本是git checkout --theirs,两者都需要则要通过diff工具比对合并。
    • git merge --continue
  • rebase:
    • git rebase other_branch_name
    • 在merge中,使用自己的版本是:git checkout --theirs,使用对方的版本是git checkout --ours,两者都需要则要通过diff工具比对合并。
    • git rebase --continue

Q: git pullgit pull --rebase的区别是什么?
A:git pull=git fetch+git merge,而git pull --rebase=git fetch+git rebase,所以在两种情况下的冲突的解决同mergerebase

Q:git cherry_pick怎么用?
A:如果你想把分支A上的一个commit提取出来添加到分支B上,基本步骤是:

  • 通过git checkout A切换到A分支

    • 通过git log --oneline -n10查看A分支上最近N条记录(这里是查看了10条),复制你需要提取的那个commit的哈希例如是7f6eb072b7e。
  • 通过git checkout B切换到B分支
    • 通过git cherry_pick 7f6eb072b7e将哈希值7f6eb072b7e对应的那个commit作用到当前分支,也就是分支B。
    • 如果有冲突,你需要解决下冲突。

0x08 掌握Git的秘诀

首先,我学习 git/svn/latex 之类的,基本做法是理解背后的原理,然后使用的过程中随时查手册,久了就通过肌肉记忆自然熟悉。像这里是latex的索引,但是我现在编辑latex比较少,有时候排版书籍的时候用的时候会去更新下。

其次,坚持使用git命令行来处理日常工作,学习git的原子指令。如果使用GUI,会习惯GUI的操作,但是对于git本身的常用操作会生疏,甚至不理解一个GUI复合了哪些原子的操作,出现问题的时候到底是哪个环节出问题。

最后,工欲善其事,必先利其器,即使是使用git命令本身,也有利器辅助。我用了2年多Mac系统,有一个历史命令自动完成的工具,叫fishshell,通过fish,我只要敲前面几个字母,后面就会灰色自动完成,上下键可以切换同类的敲过的高频命令,按向右的方向键自动完成。通过这种方式,我又比别人减少了大量输入错误导致的命令学习障碍,极大增加成功率。

工具(4): Git自助手册的更多相关文章

  1. Ubuntu下安装Git以及Git帮助手册【转】

    转自:http://milkythinking.com/blog/2011/04/17/install_git_and_manual/ Git简介 Git是一个分布式版本控制系统,对应的是SVN.CV ...

  2. svn 迁移至git操作手册

    svn 迁移至git操作手册 项目交付.版本管理工具变更等情况下,迁移svn旧历史记录有很大必要,方便后续追踪文件的提交历史,文件修改记录比对等.git自带了从svn迁移至git的工具命令,可很好的对 ...

  3. Git使用手册【转】

    转自:https://www.jianshu.com/p/e32a8e7ca93b 目录: Git是什么 基本概念 Git的诞生 Git的安装与配置 创建版本库 Git操作略览 远程仓库:git的杀招 ...

  4. Git Manual / Git使用手册 / Git, GitLab, Git Bash, TortoiseGit (建议全文复制到Word文档中通过导航窗格查看)

    Git使用手册 目录 1     引言 2     Git.GitLab简介 2.1      Git 2.2      GitLab 2.3      Git基本概念 3     运行环境 4    ...

  5. Git 简明手册

    0,Git 是什么 Git 是一个VCS(Version Control System),即版本控制系统. 版本控制系统从字面意思来看,它的用途就是管理/控制文件的版本.使用它,可以方便的知道一个文件 ...

  6. 【运维工具】Git代码发布系统

    引言 代码发布系统是互联网公司必备的运维系统,作用主要用户发布业务代码 到 业务服务器 为什么需要代码发布系统 有的同学可能说,我们公司服务器就那么一台,做个发布系统太麻烦了? 不认同这说法 发布系统 ...

  7. git学习手册

    #git学习手册 git: Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理.[2] Git 是 Linus Torvalds 为了帮助管理 Linux内核开发而 ...

  8. 分布式版本控制工具:git与Mercurial(zz)

    分布式版本控制工具:git与Mercurial [收藏此页] [打印]   作者:cyfdecyf  2007-12-26 内容导航: 第1页   [IT168 技术文档]    说到版本控制工具,很 ...

  9. 《mac的git安装手册-1》

    <mac的git安装手册-1> 下载地址 https://git-scm.com/downloads 如果遇到上面这个问题打开系统偏好设置: OK,这样就能安装了

随机推荐

  1. 记一次工作失误,openresty报502错误

    调试落地项目,代理跳转接口报502错误. 一开始认为阿里云tomcat有误,后面发现别的地址代理跳转有效. 开始配置跳转地址,一直折腾半天不好使.后面才知道,应用服务器和数据库服务器是分开部署的.一直 ...

  2. [开源]基于Log4Net简单实现KafkaAppender

    背景 基于之前基于Log4Net本地日志服务简单实现 实现本地日志服务,但是随着项目开发演进,本地日志服务满足不了需求,譬如在预发布环境或者生产环境,不可能让开发人员登录查看本地日志文件分析. Kaf ...

  3. msql分区

    确认mysql服务器是否支持分区表: show plugins; 如果能看到partition则表示能分区. HASH分区的特点: 根据MOD(分区键,分区数)的值把数据行存储到表的不同分区中 数据可 ...

  4. Pi Hybrids问题

    Pi Hybrids问题 清华大学肖秀波梁湧老师翻译的Rardin教授的<运筹学>[1]已于今年年中出版,感谢机械工业出版社张有利老师的推荐和赠书,让我能看到如此完美的千页级宏篇译著.该书 ...

  5. python3-随机生成10位包含数字和字母的密码

    方法一: 知识点:random.sample(sequence, k) 从指定序列中随机获取指定长度的片断 import random,string num=string.ascii_letters+ ...

  6. JS数组添加删除

    栈是一种LIFO(Last-In-First-Out,后进先出)的数据结构著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.原文: https://www.w3cplus.com/j ...

  7. Linux系列

    Linux入门及进阶学习. 目录 Linux的安装 GNOME图形界面的基本操作 命令行BASH的基本操作 Linux文件系统的基本结构 Linux文件基本操作管理 Linux系统目录架构 Linux ...

  8. 代理模式 PROXY Surrogate 结构型 设计模式(十四)

    代理模式 PROXY 别名Surrogate 意图 为其他的对象提供一种代理以控制对这个对象的访问. 代理模式含义比较清晰,就是中间人,中介公司,经纪人... 在计算机程序中,代理就表示一个客户端不想 ...

  9. vue 数据改变但是视图没更新

    在使用过程中会出现数据改变但是视图没有更新的情况(类型数组或者对象),这里我们就需要用到 $set 如果是对象类型: this.$set(this.userInfo, 'name', 'gionlee ...

  10. Android View的重绘过程之Draw

    博客首页:http://www.cnblogs.com/kezhuang/p/ View绘制的三部曲,测量,布局,绘画现在我们分析绘画部分测量和布局 在前两篇文章中已经分析过了.不了解的可以去我的博客 ...