Update copyright notes.

This commit is contained in:
ZhongyiTong
2015-12-05 01:52:21 +08:00
parent 74c9b0dc59
commit 2903d8d614
11 changed files with 243 additions and 192 deletions

View File

@ -1,9 +1,8 @@
Git log高级用法 # Git log高级用法
===
> BY 童仲毅(geeeeeeeeek@github) > BY 童仲毅([geeeeeeeeek@github](https://github.com/geeeeeeeeek/git-recipes/))
> >
> 这是一篇在[原文](https://www.atlassian.com/git/tutorials/git-log)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名([CC BY 2.5 AU](http://creativecommons.org/licenses/by/2.5/au/deed.zh))协议共享。 > 这是一篇在[原文(BY atlassian)](https://www.atlassian.com/git/tutorials/git-log)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名([CC BY 2.5 AU](http://creativecommons.org/licenses/by/2.5/au/deed.zh))协议共享。
每一个版本控制系统的出现都是为了让你记录代码的变化。你可以看到项目的历史记录——谁贡献了什么、bug是什么时候引入的还可以撤回有问题的更改。但是首先你得知道如何来使用它。这也就是为什么会有`git log` 这个命令。 每一个版本控制系统的出现都是为了让你记录代码的变化。你可以看到项目的历史记录——谁贡献了什么、bug是什么时候引入的还可以撤回有问题的更改。但是首先你得知道如何来使用它。这也就是为什么会有`git log` 这个命令。
@ -11,8 +10,8 @@ Git log高级用法
`git log` 有两个高级用法一是自定义commit的输出格式二是过滤哪些commit要输出。这两个用法合二为一你就可以找到你项目中你需要的任何信息。 `git log` 有两个高级用法一是自定义commit的输出格式二是过滤哪些commit要输出。这两个用法合二为一你就可以找到你项目中你需要的任何信息。
格式化Log输出 ## 格式化Log输出
---
首先,这篇文章会展示几种`git log` 格式化输出的例子。大多数例子只是通过标记来向`git log` 请求或多或少的信息。 首先,这篇文章会展示几种`git log` 格式化输出的例子。大多数例子只是通过标记来向`git log` 请求或多或少的信息。
如果你不喜欢默认的`git log` 格式,你可以用`git config` 的别名功能来给你想要的格式创建一个快捷方式。 如果你不喜欢默认的`git log` 格式,你可以用`git config` 的别名功能来给你想要的格式创建一个快捷方式。
@ -27,6 +26,7 @@ ad8621a Fix a bug in the feature
16b36c6 Add a new feature 16b36c6 Add a new feature
23ad9ad Add the initial code base 23ad9ad Add the initial code base
``` ```
它对于获得你项目的大致情况很有帮助。 它对于获得你项目的大致情况很有帮助。
### Decorate ### Decorate
@ -84,6 +84,7 @@ index 18ca709..c673b40 100644
对于改动很多的commit来说这个输出会变得又长又大。一般来说当你输出所有删改的时候你应该是想要查找某一具体的改动这时你就要用到`pickaxe` 选项。 对于改动很多的commit来说这个输出会变得又长又大。一般来说当你输出所有删改的时候你应该是想要查找某一具体的改动这时你就要用到`pickaxe` 选项。
### Shortlog ### Shortlog
`git shortlog` 是一种特别的`git log` 它是为创建发布声明设计的。它把每个commit按作者分类显示commit信息的第一行。这样可以容易地看到谁做了什么。 `git shortlog` 是一种特别的`git log` 它是为创建发布声明设计的。它把每个commit按作者分类显示commit信息的第一行。这样可以容易地看到谁做了什么。
比如说两个开发者为项目贡献了5个commit那么`git shortlog` 输出会是这样的: 比如说两个开发者为项目贡献了5个commit那么`git shortlog` 输出会是这样的:
@ -98,9 +99,11 @@ John (3):
Add a new feature Add a new feature
Merge branch 'feature' Merge branch 'feature'
``` ```
默认情况下,`git shortlog` 把输出按作者名字排序,但你可以传入`-n` 选项来按每个作者commit数量排序。 默认情况下,`git shortlog` 把输出按作者名字排序,但你可以传入`-n` 选项来按每个作者commit数量排序。
### Graph ### Graph
`--graph` 选项绘制一个ASCII图像来展示commit历史的分支结构。它经常和 `--oneline` 和 `--decorate` 两个命令一起使用这样会更容易查看哪个commit属于哪个分支 `--graph` 选项绘制一个ASCII图像来展示commit历史的分支结构。它经常和 `--oneline` 和 `--decorate` 两个命令一起使用这样会更容易查看哪个commit属于哪个分支
``` ```
@ -141,19 +144,22 @@ John committed f12ca28 on Wed Jun 22 13:50:31 2014 -0500
除了让你只看到关注的信息,这个`--pretty=format:"<string>"` 选项在你想要在另一个命令中使用日志内容是尤为有用的。 除了让你只看到关注的信息,这个`--pretty=format:"<string>"` 选项在你想要在另一个命令中使用日志内容是尤为有用的。
过滤提交历史 ## 过滤提交历史
---
格式化commit输出只是`git log` 其中的一个用途。另一半是理解如何浏览整个提交历史。接下来的文章会介绍如何用`git log` 选择项目历史中的特定的commit。所有的用法都可以和上面讨论过的格式化选项结合起来。 格式化commit输出只是`git log` 其中的一个用途。另一半是理解如何浏览整个提交历史。接下来的文章会介绍如何用`git log` 选择项目历史中的特定的commit。所有的用法都可以和上面讨论过的格式化选项结合起来。
### 按数量 ### 按数量
`git log` 最基础的过滤选项是限制显示的commit数量。当你只对最近几次commit感兴趣时它可以节省你一页一页查看的时间。 `git log` 最基础的过滤选项是限制显示的commit数量。当你只对最近几次commit感兴趣时它可以节省你一页一页查看的时间。
你可以在后面加上`-<n>`选项。比如说下面这个命令会显示最新的3次commit 你可以在后面加上`-<n>`选项。比如说下面这个命令会显示最新的3次commit
``` ```
git log -3 git log -3
``` ```
### 按日期 ### 按日期
如果你想要查看某一特定时间段内的commit你可以使用`--after` 或 `--before` 标记来按日期筛选。它们都接受好几种日期格式作为参数。比如说下面的命令会显示2014年7月1日后的commit 如果你想要查看某一特定时间段内的commit你可以使用`--after` 或 `--before` 标记来按日期筛选。它们都接受好几种日期格式作为参数。比如说下面的命令会显示2014年7月1日后的commit
``` ```
@ -175,6 +181,7 @@ git log --after="2014-7-1" --before="2014-7-4"
注意`--since` 、`--until` 标记和`--after` 、`--before` 标记分别是等价的。 注意`--since` 、`--until` 标记和`--after` 、`--before` 标记分别是等价的。
### 按作者 ### 按作者
当你只想看某一特定作者的commit的时候你可以使用`--author` 标记。它接受正则表达式返回所有作者名字满足这个规则的commit。如果你知道那个作者的确切名字你可以直接传入文本字符串 当你只想看某一特定作者的commit的时候你可以使用`--author` 标记。它接受正则表达式返回所有作者名字满足这个规则的commit。如果你知道那个作者的确切名字你可以直接传入文本字符串
``` ```
@ -265,8 +272,7 @@ git log --merges
它会返回所有有两个父节点的commit。 它会返回所有有两个父节点的commit。
总结 ## 总结
---
你现在应该对使用`git log` 来格式化输出和选择你要显示的commit的用法比较熟悉了。它允许你查看你项目历史中任何需要的内容。 你现在应该对使用`git log` 来格式化输出和选择你要显示的commit的用法比较熟悉了。它允许你查看你项目历史中任何需要的内容。

View File

@ -1,16 +1,17 @@
Git图解 # Git图解
========
> BY 童仲毅(geeeeeeeeek@github) > BY 童仲毅([geeeeeeeeek@github](https://github.com/geeeeeeeeek/git-recipes/))
> >
> 这是一篇在[原文](http://marklodato.github.io/visual-git-guide/index-zh-cn.html)基础上演绎的文章。原作者[Mark Lodato](lodatom@gmail.com),译者[wych](ellrywych@gmail.com)。原文采用[创用CC 姓名标示-非商业性-相同方式分享3.0 美国授权条款](https://creativecommons.org/licenses/by-nc-sa/3.0/us/)授权。 > 这是一篇在[原文](http://marklodato.github.io/visual-git-guide/index-zh-cn.html)基础上演绎的文章。原作者[Mark Lodato](lodatom@gmail.com),译者[wych](ellrywych@gmail.com)。原文采用[创用CC 姓名标示-非商业性-相同方式分享3.0 美国授权条款](https://creativecommons.org/licenses/by-nc-sa/3.0/us/)授权。
此页图解git中的最常用命令。如果你稍微理解git的工作原理这篇文章能够让你理解的更透彻。 此页图解git中的最常用命令。如果你稍微理解git的工作原理这篇文章能够让你理解的更透彻。
基本用法
--------- ## 基本用法
![enter image description here](http://marklodato.github.io/visual-git-guide/basic-usage.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/basic-usage.svg)
上面的四条命令在工作目录、stage缓存(也叫做索引)和commit历史之间复制文件。 上面的四条命令在工作目录、stage缓存(也叫做索引)和commit历史之间复制文件。
* `git add files` 把工作目录中的文件加入stage缓存 * `git add files` 把工作目录中的文件加入stage缓存
@ -19,25 +20,29 @@ Git图解
* `git checkout -- files` 把文件从stage缓存复制到工作目录用来丢弃本地修改 * `git checkout -- files` 把文件从stage缓存复制到工作目录用来丢弃本地修改
你可以用 `git reset -p``git checkout -p``git add -p`进入交互模式也可以跳过stage缓存直接从commit历史取出文件或者直接提交代码。 你可以用 `git reset -p``git checkout -p``git add -p`进入交互模式也可以跳过stage缓存直接从commit历史取出文件或者直接提交代码。
![enter image description here](http://marklodato.github.io/visual-git-guide/basic-usage-2.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/basic-usage-2.svg)
* `git commit -a ` 相当于运行`git add`把所有当前目录下的文件加入stage缓存再运行`git commit` * `git commit -a ` 相当于运行`git add`把所有当前目录下的文件加入stage缓存再运行`git commit`
* `git commit files` 进行一次包含最后一次提交加上工作目录中文件快照的提交并且文件被添加到stage缓存。 * `git commit files` 进行一次包含最后一次提交加上工作目录中文件快照的提交并且文件被添加到stage缓存。
* `git checkout HEAD -- files` 回滚到复制最后一次提交。 * `git checkout HEAD -- files` 回滚到复制最后一次提交。
约定 ## 约定
--------
后文中以下面的形式使用图片: 后文中以下面的形式使用图片:
![enter image description here](http://marklodato.github.io/visual-git-guide/conventions.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/conventions.svg)
绿色的5位字符表示提交的ID分别指向父节点。分支用橙色显示分别指向特定的提交。当前分支由附在其上的_HEAD_标识。 绿色的5位字符表示提交的ID分别指向父节点。分支用橙色显示分别指向特定的提交。当前分支由附在其上的_HEAD_标识。
这张图片里显示最后5次提交_ed489_是最新提交。 _master_分支指向此次提交另一个_maint_分支指向祖父提交节点。 这张图片里显示最后5次提交_ed489_是最新提交。 _master_分支指向此次提交另一个_maint_分支指向祖父提交节点。
命令详解 ## 命令详解
---------
### Diff ### Diff
有许多种方法查看两次提交之间的变动,下面是其中一些例子。 有许多种方法查看两次提交之间的变动,下面是其中一些例子。
![enter image description here](http://marklodato.github.io/visual-git-guide/diff.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/diff.svg)
### Commit ### Commit
@ -45,13 +50,19 @@ Git图解
提交时git用stage缓存中的文件创建一个新的提交并把此时的节点设为父节点。然后把当前分支指向新的提交节点。下图中当前分支是_master_。 提交时git用stage缓存中的文件创建一个新的提交并把此时的节点设为父节点。然后把当前分支指向新的提交节点。下图中当前分支是_master_。
在运行命令之前_master_指向_ed489_提交后_master_指向新的节点_f0cec_并以_ed489_作为父节点。 在运行命令之前_master_指向_ed489_提交后_master_指向新的节点_f0cec_并以_ed489_作为父节点。
![enter image description here](http://marklodato.github.io/visual-git-guide/commit-master.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/commit-master.svg)
即便当前分支是某次提交的祖父节点git会同样操作。下图中在_master_分支的祖父节点_maint_分支进行一次提交生成了_1800b_。 即便当前分支是某次提交的祖父节点git会同样操作。下图中在_master_分支的祖父节点_maint_分支进行一次提交生成了_1800b_。
这样_maint_分支就不再是_master_分支的祖父节点。此时[merge](#merge) 或者 [rebase](#rebase) 是必须的。 这样_maint_分支就不再是_master_分支的祖父节点。此时[merge](#merge) 或者 [rebase](#rebase) 是必须的。
![enter image description here](http://marklodato.github.io/visual-git-guide/commit-maint.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/commit-maint.svg)
如果想更改一次提交,使用 `git commit --amend`。git会使用与当前提交相同的父节点进行一次新提交旧的提交会被取消。 如果想更改一次提交,使用 `git commit --amend`。git会使用与当前提交相同的父节点进行一次新提交旧的提交会被取消。
![enter image description here](http://marklodato.github.io/visual-git-guide/commit-amend.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/commit-amend.svg)
另一个例子是[分离HEAD提交](#detached),在后面的章节中介绍。 另一个例子是[分离HEAD提交](#detached),在后面的章节中介绍。
### Checkout ### Checkout
@ -59,19 +70,29 @@ Git图解
checkout命令用于从历史提交或者stage缓存中拷贝文件到工作目录也可用于切换分支。 checkout命令用于从历史提交或者stage缓存中拷贝文件到工作目录也可用于切换分支。
当给定某个文件名(或者打开-p选项或者文件名和-p选项同时打开git会从指定的提交中拷贝文件到stage缓存和工作目录。比如`git checkout HEAD~ foo.c`会将提交节点_HEAD~_即当前提交节点的父节点中的`foo.c`复制到工作目录并且加到stage缓存中。如果命令中没有指定提交节点则会从stage缓存中拷贝内容。注意当前分支不会发生变化。 当给定某个文件名(或者打开-p选项或者文件名和-p选项同时打开git会从指定的提交中拷贝文件到stage缓存和工作目录。比如`git checkout HEAD~ foo.c`会将提交节点_HEAD~_即当前提交节点的父节点中的`foo.c`复制到工作目录并且加到stage缓存中。如果命令中没有指定提交节点则会从stage缓存中拷贝内容。注意当前分支不会发生变化。
![enter image description here](http://marklodato.github.io/visual-git-guide/checkout-files.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/checkout-files.svg)
当不指定文件名而是给出一个本地分支时那么_HEAD_标识会移动到那个分支也就是说我们“切换”到那个分支了然后stage缓存和工作目录中的内容会和_HEAD_对应的提交节点一致。新提交节点下图中的a47c3中的所有文件都会被复制到stage缓存和工作目录中只存在于老的提交节点ed489中的文件会被删除不属于上述两者的文件会被忽略不受影响。 当不指定文件名而是给出一个本地分支时那么_HEAD_标识会移动到那个分支也就是说我们“切换”到那个分支了然后stage缓存和工作目录中的内容会和_HEAD_对应的提交节点一致。新提交节点下图中的a47c3中的所有文件都会被复制到stage缓存和工作目录中只存在于老的提交节点ed489中的文件会被删除不属于上述两者的文件会被忽略不受影响。
![enter image description here](http://marklodato.github.io/visual-git-guide/checkout-branch.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/checkout-branch.svg)
如果既没有指定文件名也没有指定分支名而是一个标签、远程分支、SHA-1值或者是像_master~3_类似的东西就得到一个匿名分支称作_detached HEAD_被分离的_HEAD_标识。这样可以很方便地在历史版本之间互相切换。比如说你想要编译1.6.6.1版本的git你可以运行`git checkout v1.6.6.1`(这是一个标签,而非分支名),编译,安装,然后切换回另一个分支,比如说`git checkout master`。然而当提交操作涉及到“分离的HEAD”时其行为会略有不同详情见在[下面](#detached)。 如果既没有指定文件名也没有指定分支名而是一个标签、远程分支、SHA-1值或者是像_master~3_类似的东西就得到一个匿名分支称作_detached HEAD_被分离的_HEAD_标识。这样可以很方便地在历史版本之间互相切换。比如说你想要编译1.6.6.1版本的git你可以运行`git checkout v1.6.6.1`(这是一个标签,而非分支名),编译,安装,然后切换回另一个分支,比如说`git checkout master`。然而当提交操作涉及到“分离的HEAD”时其行为会略有不同详情见在[下面](#detached)。
![enter image description here](http://marklodato.github.io/visual-git-guide/checkout-detached.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/checkout-detached.svg)
### HEAD标识处于分离状态时的提交操作 ### HEAD标识处于分离状态时的提交操作
当_HEAD_处于分离状态不依附于任一分支提交操作可以正常进行但是不会更新任何已命名的分支。你可以认为这是在更新一个匿名分支。 当_HEAD_处于分离状态不依附于任一分支提交操作可以正常进行但是不会更新任何已命名的分支。你可以认为这是在更新一个匿名分支。
![enter image description here](http://marklodato.github.io/visual-git-guide/commit-detached.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/commit-detached.svg)
一旦此后你切换到别的分支比如说_master_那么这个提交节点可能再也不会被引用到然后就会被丢弃掉了。注意这个命令之后就不会有东西引用_2eecb_。 一旦此后你切换到别的分支比如说_master_那么这个提交节点可能再也不会被引用到然后就会被丢弃掉了。注意这个命令之后就不会有东西引用_2eecb_。
![enter image description here](http://marklodato.github.io/visual-git-guide/checkout-after-detached.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/checkout-after-detached.svg)
但是,如果你想保存这个状态,可以用命令`git checkout -b name`来创建一个新的分支。 但是,如果你想保存这个状态,可以用命令`git checkout -b name`来创建一个新的分支。
![enter image description here](http://marklodato.github.io/visual-git-guide/checkout-b-detached.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/checkout-b-detached.svg)
### Reset ### Reset
@ -79,10 +100,15 @@ checkout命令用于从历史提交或者stage缓存中拷贝文件到工
reset命令把当前分支指向另一个位置并且有选择的变动工作目录和索引。也用来在从历史commit历史中复制文件到索引而不动工作目录。 reset命令把当前分支指向另一个位置并且有选择的变动工作目录和索引。也用来在从历史commit历史中复制文件到索引而不动工作目录。
如果不给选项,那么当前分支指向到那个提交。如果用`--hard`选项,那么工作目录也更新,如果用`--soft`选项,那么都不变。 如果不给选项,那么当前分支指向到那个提交。如果用`--hard`选项,那么工作目录也更新,如果用`--soft`选项,那么都不变。
![enter image description here](http://marklodato.github.io/visual-git-guide/reset-commit.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/reset-commit.svg)
如果没有给出提交点的版本号那么默认用_HEAD_。这样分支指向不变但是索引会回滚到最后一次提交如果用`--hard`选项,工作目录也同样。 如果没有给出提交点的版本号那么默认用_HEAD_。这样分支指向不变但是索引会回滚到最后一次提交如果用`--hard`选项,工作目录也同样。
![enter image description here](http://marklodato.github.io/visual-git-guide/reset.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/reset.svg)
如果给了文件名(或者 `-p`选项), 那么工作效果和带文件名的[checkout](#checkout)差不多,除了索引被更新。 如果给了文件名(或者 `-p`选项), 那么工作效果和带文件名的[checkout](#checkout)差不多,除了索引被更新。
![enter image description here](http://marklodato.github.io/visual-git-guide/reset-files.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/reset-files.svg)
### Merge ### Merge
@ -90,13 +116,17 @@ reset命令把当前分支指向另一个位置并且有选择的变动工作
merge 命令把不同分支合并起来。合并前,索引必须和当前提交相同。如果另一个分支是当前提交的祖父节点,那么合并命令将什么也不做。 merge 命令把不同分支合并起来。合并前,索引必须和当前提交相同。如果另一个分支是当前提交的祖父节点,那么合并命令将什么也不做。
另一种情况是如果当前提交是另一个分支的祖父节点就导致_fast-forward_合并。指向只是简单的移动并生成一个新的提交。 另一种情况是如果当前提交是另一个分支的祖父节点就导致_fast-forward_合并。指向只是简单的移动并生成一个新的提交。
![enter image description here](http://marklodato.github.io/visual-git-guide/merge-ff.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/merge-ff.svg)
否则就是一次真正的合并。默认把当前提交(_ed489_ 如下所示)和另一个提交(_33104_)以及他们的共同祖父节点(_b325c_)进行一次[三方合并](http://en.wikipedia.org/wiki/Three-way_merge)。结果是先保存当前目录和索引然后和父节点_33104_一起做一次新提交。 否则就是一次真正的合并。默认把当前提交(_ed489_ 如下所示)和另一个提交(_33104_)以及他们的共同祖父节点(_b325c_)进行一次[三方合并](http://en.wikipedia.org/wiki/Three-way_merge)。结果是先保存当前目录和索引然后和父节点_33104_一起做一次新提交。
![enter image description here](http://marklodato.github.io/visual-git-guide/merge.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/merge.svg)
### Cherry Pick ### Cherry Pick
cherry-pick命令"复制"一个提交节点并在当前分支做一次完全一样的新提交。 cherry-pick命令"复制"一个提交节点并在当前分支做一次完全一样的新提交。
![enter image description here](http://marklodato.github.io/visual-git-guide/cherry-pick.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/cherry-pick.svg)
### Rebase ### Rebase
@ -104,10 +134,13 @@ cherry-pick命令"复制"一个提交节点并在当前分支做一次完全一
rebase是合并命令的另一种选择。合并把两个父分支合并进行一次提交提交历史不是线性的。rebase在当前分支上重演另一个分支的历史提交历史是线性的。 rebase是合并命令的另一种选择。合并把两个父分支合并进行一次提交提交历史不是线性的。rebase在当前分支上重演另一个分支的历史提交历史是线性的。
本质上,这是线性化的自动的 [cherry-pick](#cherry-pick)。 本质上,这是线性化的自动的 [cherry-pick](#cherry-pick)。
![enter image description here](http://marklodato.github.io/visual-git-guide/rebase.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/rebase.svg)
上面的命令都在_topic_分支中进行而不是_master_分支在_master_分支上重演并且把分支指向新的节点。注意旧提交没有被引用将被回收。 上面的命令都在_topic_分支中进行而不是_master_分支在_master_分支上重演并且把分支指向新的节点。注意旧提交没有被引用将被回收。
要限制回滚范围,使用`--onto`选项。下面的命令在_master_分支上重演当前分支从_169a6_以来的最近几个提交即_2c33a_。 要限制回滚范围,使用`--onto`选项。下面的命令在_master_分支上重演当前分支从_169a6_以来的最近几个提交即_2c33a_。
![enter image description here](http://marklodato.github.io/visual-git-guide/rebase-onto.svg) ![enter image description here](http://marklodato.github.io/visual-git-guide/rebase-onto.svg)
同样有`git rebase --interactive`让你更方便的完成一些复杂操作,比如丢弃、重排、修改、合并提交。 同样有`git rebase --interactive`让你更方便的完成一些复杂操作,比如丢弃、重排、修改、合并提交。

View File

@ -1,9 +1,8 @@
Git提交引用和引用日志 # Git提交引用和引用日志
===
> BY 童仲毅(geeeeeeeeek@github) > BY 童仲毅([geeeeeeeeek@github](https://github.com/geeeeeeeeek/git-recipes/))
> >
> 这是一篇在[原文](https://www.atlassian.com/git/tutorials/refs-and-the-reflog)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名([CC BY 2.5 AU](http://creativecommons.org/licenses/by/2.5/au/deed.zh))协议共享。 > 这是一篇在[原文(BY atlassian)](https://www.atlassian.com/git/tutorials/refs-and-the-reflog)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名([CC BY 2.5 AU](http://creativecommons.org/licenses/by/2.5/au/deed.zh))协议共享。
提交(commit)是Git的精髓所在你无时不刻不在创建和缓存提交、查看以前的提交或者用各种Git命令在仓库间转移你的提交。大多数的命令都对同一个提交操作而有些会接受提交的引用作为参数。比如你可以给`git checkout` 传入一个引用来查看以前的提交,或者传入一个分支名来切换到对于的分支。 提交(commit)是Git的精髓所在你无时不刻不在创建和缓存提交、查看以前的提交或者用各种Git命令在仓库间转移你的提交。大多数的命令都对同一个提交操作而有些会接受提交的引用作为参数。比如你可以给`git checkout` 传入一个引用来查看以前的提交,或者传入一个分支名来切换到对于的分支。
@ -13,8 +12,7 @@ Git提交引用和引用日志
我们还会学到如何使用Git的引用日志查看看似已经删除的提交。 我们还会学到如何使用Git的引用日志查看看似已经删除的提交。
哈希字串 ## 哈希字串
---
引用一个提交最直接的方式是通过SHA-1的哈希字串这是每个提交唯一的ID。你可以在`git log`的输出中找到提交的哈希字串。 引用一个提交最直接的方式是通过SHA-1的哈希字串这是每个提交唯一的ID。你可以在`git log`的输出中找到提交的哈希字串。
@ -40,8 +38,7 @@ git rev-parse master
当你写的自定义脚本中需要将提交引用作为参数时,这个命令非常有用。你可以让`git rev-parse`帮你处理转换,而不用手动做这件事。 当你写的自定义脚本中需要将提交引用作为参数时,这个命令非常有用。你可以让`git rev-parse`帮你处理转换,而不用手动做这件事。
引用 ## 引用
---
ref是提交的间接引用。你可以把它当做哈希字串的别名但对用户更友好。这就是Git内部表示分支和标签的机制。 ref是提交的间接引用。你可以把它当做哈希字串的别名但对用户更友好。这就是Git内部表示分支和标签的机制。
@ -78,6 +75,7 @@ git log -1 master
`tags`目录也是以相同的方式存储,只不过其中存的是标签而不是分支。`remotes`目录将你之前用`git remote`命令创建的所有远程仓库以子目录的形式一一列出。在每个文件夹中你可以找到所有fetch到本地仓库的远程分支。 `tags`目录也是以相同的方式存储,只不过其中存的是标签而不是分支。`remotes`目录将你之前用`git remote`命令创建的所有远程仓库以子目录的形式一一列出。在每个文件夹中你可以找到所有fetch到本地仓库的远程分支。
### 指定引用 ### 指定引用
当你向Git命令传入引用的时候你既可以指定引用完整的名称也可以使用缩写然后让Git来寻找匹配。你应该已经对引用的缩写很熟悉了每次你通过名称引用分支的时候都会这么做。 当你向Git命令传入引用的时候你既可以指定引用完整的名称也可以使用缩写然后让Git来寻找匹配。你应该已经对引用的缩写很熟悉了每次你通过名称引用分支的时候都会这么做。
``` ```
@ -94,8 +92,7 @@ git show refs/heads/some-feature
我们会在refspec一节见到更多引用名称。 我们会在refspec一节见到更多引用名称。
打包引用目录 ## 打包引用目录
---
对于大型仓库Git会周期性地执行垃圾回收来移除不需要的对象将所有引用文件压缩成单个文件来获得更好的性能。你可以使用这个命令强制垃圾回收来执行压缩 对于大型仓库Git会周期性地执行垃圾回收来移除不需要的对象将所有引用文件压缩成单个文件来获得更好的性能。你可以使用这个命令强制垃圾回收来执行压缩
@ -113,8 +110,7 @@ bb883e4c91c870b5fed88fd36696e752fb6cf8e6 refs/tags/v0.9
另一方面正常的Git功能不会受到任何影响。但如果你好奇你的`.git/refs`文件夹为什么是空的,这一节告诉你了答案。 另一方面正常的Git功能不会受到任何影响。但如果你好奇你的`.git/refs`文件夹为什么是空的,这一节告诉你了答案。
特殊的引用 ## 特殊的引用
---
除了`refs`文件夹外,`.git`根目录还有一些特殊的引用。如下所示: 除了`refs`文件夹外,`.git`根目录还有一些特殊的引用。如下所示:
@ -138,12 +134,13 @@ cat .git/HEAD
在大多数情况下,`HEAD`是你唯一用得到的引用。其它引用一般只在写底层脚本接触到Git内部的工作机制时才会用到。 在大多数情况下,`HEAD`是你唯一用得到的引用。其它引用一般只在写底层脚本接触到Git内部的工作机制时才会用到。
refspec
--- ## refspec
refspec将本地分支和远程分支对应起来。我们可以通过它用本地的Git命令管理远程分支设置一些高级的`git push`和`git fetch`行为。 refspec将本地分支和远程分支对应起来。我们可以通过它用本地的Git命令管理远程分支设置一些高级的`git push`和`git fetch`行为。
refspec的定义是这样的`[+]<src>:<dst>`。`<src>`参数是本地的源分支,`<dst>`是远程的目标分支。可选的`+`号强制远程仓库采用非快速向前的更新策略。 refspec的定义是这样的`[+]<src>:<dst>`。`<src>`参数是本地的源分支,`<dst>`是远程的目标分支。可选的`+`号强制远程仓库采用非快速向前的更新策略。
refspec可以和`git push`一起使用用来指定远程的分支的名称。比如下面这个命令将master分支push到远程origin就像一般的`git push`一样但它使用qa-master作为远程仓库中的分支名。对于QA团队来说这个方法非常有用。 refspec可以和`git push`一起使用用来指定远程的分支的名称。比如下面这个命令将master分支push到远程origin就像一般的`git push`一样但它使用qa-master作为远程仓库中的分支名。对于QA团队来说这个方法非常有用。
@ -161,6 +158,7 @@ git push origin :some-feature
这非常方便因为你不需要登陆到你的远程仓库然后手动删除这些远程分支。注意在Git v1.7.0之后你可以用`--delete`标记代替上面这个方法。下面这个命令和上面的命令作用相同: 这非常方便因为你不需要登陆到你的远程仓库然后手动删除这些远程分支。注意在Git v1.7.0之后你可以用`--delete`标记代替上面这个方法。下面这个命令和上面的命令作用相同:
``` ```
git push origin --delete some-feature git push origin --delete some-feature
``` ```
@ -192,8 +190,7 @@ fetch这一行告诉`git fetch`从origin仓库中下载所有分支。但是
refspec给了你完全的掌控权可以定制Git命令如何在仓库之间转移分支。你可以重命名或是删除你的本地分支fetch或是push不同的分支名修改`git push`和`git fetch`的设置,只对你想要的分支进行操作。 refspec给了你完全的掌控权可以定制Git命令如何在仓库之间转移分支。你可以重命名或是删除你的本地分支fetch或是push不同的分支名修改`git push`和`git fetch`的设置,只对你想要的分支进行操作。
相对引用 ## 相对引用
---
你还可以通过提交之间的相对关系来引用。`~`符号让你访问父节点的提交。比如说,下面这个命令显示`HEAD`祖父节点的提交: 你还可以通过提交之间的相对关系来引用。`~`符号让你访问父节点的提交。比如说,下面这个命令显示`HEAD`祖父节点的提交:
@ -222,6 +219,7 @@ git show HEAD^2^1
相对引用在命令中的用法和普通的引用相同。比如,下面所有命令中使用的都是相对引用: 相对引用在命令中的用法和普通的引用相同。比如,下面所有命令中使用的都是相对引用:
``` ```
# Only list commits that are parent of the second parent of a merge commit # Only list commits that are parent of the second parent of a merge commit
git log HEAD^2 git log HEAD^2
@ -233,8 +231,7 @@ git reset HEAD~3
git rebase -i HEAD~3 git rebase -i HEAD~3
``` ```
引用日志 ## 引用日志
---
引用日志是Git的安全网。它记录了你在仓库中做的所有更改不管你有没有提交。你也可以认为这是你本地更改的完整历史记录。运行`git reflog`命令查看引用日志。它应该会打印出像下面这样的信息: 引用日志是Git的安全网。它记录了你在仓库中做的所有更改不管你有没有提交。你也可以认为这是你本地更改的完整历史记录。运行`git reflog`命令查看引用日志。它应该会打印出像下面这样的信息:
@ -271,8 +268,7 @@ git checkout HEAD@{1}
这会让你处于`HEAD`分离的状态。你可以从这里开始,创建新的分支,继续你的工作。 这会让你处于`HEAD`分离的状态。你可以从这里开始,创建新的分支,继续你的工作。
总结 ## 总结
---
你现在对Git提交的引用应该已经相当熟悉了。我们知道了分支和标签是如何存在于`.git`的子文件夹refs中如何读取打包的引用文件如何使用refspec来进行更高级的push和fetch操作如何使用`~`和`^`符号来遍历分支结构。 你现在对Git提交的引用应该已经相当熟悉了。我们知道了分支和标签是如何存在于`.git`的子文件夹refs中如何读取打包的引用文件如何使用refspec来进行更高级的push和fetch操作如何使用`~`和`^`符号来遍历分支结构。

View File

@ -1,7 +1,6 @@
Git简易指南(上) # Git简易指南(上)
===========
> BY 童仲毅(geeeeeeeeek@github) > BY 童仲毅([geeeeeeeeek@github](https://github.com/geeeeeeeeek/git-recipes/))
> >
> 除非另行注明,页面上所有内容采用知识共享-署名([CC BY 2.5 AU](http://creativecommons.org/licenses/by/2.5/au/deed.zh))协议共享。[git-guide](https://github.com/rogerdudler/git-guide/) 项目对本文亦有贡献。 > 除非另行注明,页面上所有内容采用知识共享-署名([CC BY 2.5 AU](http://creativecommons.org/licenses/by/2.5/au/deed.zh))协议共享。[git-guide](https://github.com/rogerdudler/git-guide/) 项目对本文亦有贡献。
@ -9,65 +8,83 @@ Git简易指南(上)
在这节中我会介绍如何在你的个人项目中使用Git我们会讨论Git最基本的操作——如何初始化你的项目如何管理新的或者已有的文件如何在远端仓库中储存你的代码。 在这节中我会介绍如何在你的个人项目中使用Git我们会讨论Git最基本的操作——如何初始化你的项目如何管理新的或者已有的文件如何在远端仓库中储存你的代码。
安装Git ## 安装Git
---------
- Mac用户Xcode Command Line Tools自带Git (`xcode-select --install` ) - Mac用户Xcode Command Line Tools自带Git (`xcode-select --install` )
- Linux用户`sudo apt-get install git`
- Windows用户下载[Git SCM](git-for-windows.github.io) - Linux用户`sudo apt-get install git`
- 对于Windows用户安装后如果希望在全局的cmd中使用git需要把git.exe加入PATH环境变量中或在Git Bash中使用Git。
- Windows用户下载[Git SCM](git-for-windows.github.io)
```
- 对于Windows用户安装后如果希望在全局的cmd中使用git需要把git.exe加入PATH环境变量中或在Git Bash中使用Git。
```
## 检出仓库
检出仓库
----
执行如下命令以创建一个本地仓库的克隆版本: 执行如下命令以创建一个本地仓库的克隆版本:
`git clone /path/to/repository` `git clone /path/to/repository`
如果是远端服务器上的仓库,你的命令会是这个样子: 如果是远端服务器上的仓库,你的命令会是这个样子:
`git clone username@host:/path/to/repository` 通过SSH `git clone username@host:/path/to/repository` 通过SSH
或者: 或者:
`git clone https:/path/to/repository.git` 通过https `git clone https:/path/to/repository.git` 通过https
比如说`git clone https://github.com/geeeeeeeeek/git-recipes.git`可以将git教程clone到你指定的目录。 比如说`git clone https://github.com/geeeeeeeeek/git-recipes.git`可以将git教程clone到你指定的目录。
创建新仓库 ## 创建新仓库
--------
创建新文件夹,打开,然后执行 `git init`以创建新的 git 仓库。 创建新文件夹,打开,然后执行 `git init`以创建新的 git 仓库。
> 下面每一步中,你都可以通过`git status`来查看你的git仓库状态。 > 下面每一步中,你都可以通过`git status`来查看你的git仓库状态。
工作流 ## 工作流
---
你的本地仓库由 git 维护的三棵“树”组成。第一个是你的 `工作目录`,它持有实际文件;第二个是 `缓存区(Index)`,它像个缓存区域,临时保存你的改动;最后是 `HEAD`,指向你最近一次提交后的结果。 你的本地仓库由 git 维护的三棵“树”组成。第一个是你的 `工作目录`,它持有实际文件;第二个是 `缓存区(Index)`,它像个缓存区域,临时保存你的改动;最后是 `HEAD`,指向你最近一次提交后的结果。
![enter image description here](http://www.bootcss.com/p/git-guide/img/trees.png) ![enter image description here](http://www.bootcss.com/p/git-guide/img/trees.png)
> 事实上第三个阶段是commit history的图。HEAD一般是指向最新一次commit的引用。现在暂时不必究其细节。 > 事实上第三个阶段是commit history的图。HEAD一般是指向最新一次commit的引用。现在暂时不必究其细节。
添加与提交 ## 添加与提交
----
你可以计划改动(把它们添加到缓存区),使用如下命令: 你可以计划改动(把它们添加到缓存区),使用如下命令:
``` ```
git add < filename > git add < filename >
git add * git add *
``` ```
这是 git 基本工作流程的第一步。使用如下命令以实际提交改动: 这是 git 基本工作流程的第一步。使用如下命令以实际提交改动:
``` ```
git commit -m "代码提交信息" git commit -m "代码提交信息"
``` ```
现在,你的改动已经提交到了 HEAD但是还没到你的远端仓库。 现在,你的改动已经提交到了 HEAD但是还没到你的远端仓库。
> 在开发时良好的习惯是根据工作进度及时commit并务必注意附上有意义的commit message。创建完项目目录后第一次提交的commit message一般为"Initial commit."。 > 在开发时良好的习惯是根据工作进度及时commit并务必注意附上有意义的commit message。创建完项目目录后第一次提交的commit message一般为"Initial commit."。
推送改动 ## 推送改动
---
你的改动现在已经在本地仓库的 HEAD 中了。执行如下命令以将这些改动提交到远端仓库: 你的改动现在已经在本地仓库的 HEAD 中了。执行如下命令以将这些改动提交到远端仓库:
``` ```
git push origin master git push origin master
``` ```
可以把 master 换成你想要推送的任何分支。 可以把 master 换成你想要推送的任何分支。
如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加: 如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:
``` ```
git remote add origin <server> git remote add origin <server>
``` ```
如此你就能够将你的改动推送到所添加的服务器上去了。 如此你就能够将你的改动推送到所添加的服务器上去了。
> - 这里origin是< server >的别名取什么名字都可以你也可以在push时将< server >替换为origin。但为了以后push方便我们第一次一般都会先remote add。 > - 这里origin是< server >的别名取什么名字都可以你也可以在push时将< server >替换为origin。但为了以后push方便我们第一次一般都会先remote add。

View File

@ -1,9 +1,8 @@
Git钩子 # Git钩子
===
> BY 童仲毅(geeeeeeeeek@github) > BY 童仲毅([geeeeeeeeek@github](https://github.com/geeeeeeeeek/git-recipes/))
> >
> 这是一篇在[原文](https://www.atlassian.com/git/tutorials/git-hooks)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名([CC BY 2.5 AU](http://creativecommons.org/licenses/by/2.5/au/deed.zh))协议共享。 > 这是一篇在[原文(BY atlassian)](https://www.atlassian.com/git/tutorials/git-hooks)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名([CC BY 2.5 AU](http://creativecommons.org/licenses/by/2.5/au/deed.zh))协议共享。
Git钩子是在Git仓库中特定事件发生时自动运行的脚本。它可以让你自定义Git内部的行为在开始周期中的关键点触发自定义的行为。 Git钩子是在Git仓库中特定事件发生时自动运行的脚本。它可以让你自定义Git内部的行为在开始周期中的关键点触发自定义的行为。
@ -13,8 +12,7 @@ Git钩子最常见的使用场景包括了推行提交规范根据仓库状
在这篇文章中我们会先简要介绍Git钩子是如何工作的。然后我们会审视一些本地和远端仓库使用最流行的钩子。 在这篇文章中我们会先简要介绍Git钩子是如何工作的。然后我们会审视一些本地和远端仓库使用最流行的钩子。
概述 # 概述
===
所有Git钩子都是仓库中特定事件发生时Git自动运行的普通脚本。因此Git钩子安装和配置也非常容易。 所有Git钩子都是仓库中特定事件发生时Git自动运行的普通脚本。因此Git钩子安装和配置也非常容易。
@ -57,6 +55,7 @@ chmod +x prepare-commit-msg
内置的脚本大多是shell和PERL语言的但你可以使用任何脚本语言只要它们最后能编译到可执行文件。每次脚本中的`#!/bin/sh` 定义了你的文件将被如何解释。比如使用其他语言时你只需要将path改为你的解释器的路径。 内置的脚本大多是shell和PERL语言的但你可以使用任何脚本语言只要它们最后能编译到可执行文件。每次脚本中的`#!/bin/sh` 定义了你的文件将被如何解释。比如使用其他语言时你只需要将path改为你的解释器的路径。
比如说,你可以在`prepare-commit-msg` 中写一个可执行的Python脚本。下面这个钩子和上一节的shell脚本做的事完全一样。 比如说,你可以在`prepare-commit-msg` 中写一个可执行的Python脚本。下面这个钩子和上一节的shell脚本做的事完全一样。
``` ```
@ -89,8 +88,7 @@ with open(commit_msg_filepath, 'w') as f:
也就是说,用服务端钩子来拒绝没有遵守规范的提交是完全可行的。后面我们会再讨论这个问题。 也就是说,用服务端钩子来拒绝没有遵守规范的提交是完全可行的。后面我们会再讨论这个问题。
本地钩子 ## 本地钩子
---
本地钩子只影响它们所在的仓库。当你在读这一节的时候,记住开发者可以修改他们本地的钩子,所以不要用它们来推行强制的提交规范。不过,它们确实可以让开发者更易于接受这些规范。 本地钩子只影响它们所在的仓库。当你在读这一节的时候,记住开发者可以修改他们本地的钩子,所以不要用它们来推行强制的提交规范。不过,它们确实可以让开发者更易于接受这些规范。
@ -147,7 +145,9 @@ fi
这只是`pre-commit` 的其中一个例子。它恰好使用了已有的Git命令来根据提交带来的更改进行测试但你可以在`pre-commit` 中做任何你想做的事比如执行其它脚本、运行第三方测试集、用Lint检查代码风格。 这只是`pre-commit` 的其中一个例子。它恰好使用了已有的Git命令来根据提交带来的更改进行测试但你可以在`pre-commit` 中做任何你想做的事比如执行其它脚本、运行第三方测试集、用Lint检查代码风格。
### prepare-commit-msg ### prepare-commit-msg
`prepare-commit-msg` 钩子在`pre-commit` 钩子在文本编辑器中生成提交信息之后被调用。这被用来方便地修改自动生成的squash或merge提交。 `prepare-commit-msg` 钩子在`pre-commit` 钩子在文本编辑器中生成提交信息之后被调用。这被用来方便地修改自动生成的squash或merge提交。
`prepare-commit-msg` 脚本的参数可以是下列三个: `prepare-commit-msg` 脚本的参数可以是下列三个:
@ -292,6 +292,7 @@ session.quit()
### post-checkout ### post-checkout
`post-checkout` 钩子和`post-commit` 钩子很像,但它是在你用`git checkout` 查看引用的时候被调用的。这是用来清理你的工作目录中可能会令人困惑的生成文件。This is nice for clearing out your working directory of generated files that would otherwise cause confusion. `post-checkout` 钩子和`post-commit` 钩子很像,但它是在你用`git checkout` 查看引用的时候被调用的。这是用来清理你的工作目录中可能会令人困惑的生成文件。This is nice for clearing out your working directory of generated files that would otherwise cause confusion.
这个钩子接受三个参数,它的返回状态不影响`git checkout` 命令。 这个钩子接受三个参数,它的返回状态不影响`git checkout` 命令。
@ -354,8 +355,7 @@ The pre-rebase hook refused to rebase.
内置的`pre-rebase.sample` 脚本是一个更复杂的例子。它在什么时候阻止rebase这方面更加智能。它会检查你当前的分支是否已经合并到了下一个分支中去也就是主分支。如果是的话rebase可能会遇到问题脚本会放弃这次rebase。 内置的`pre-rebase.sample` 脚本是一个更复杂的例子。它在什么时候阻止rebase这方面更加智能。它会检查你当前的分支是否已经合并到了下一个分支中去也就是主分支。如果是的话rebase可能会遇到问题脚本会放弃这次rebase。
服务端钩子 # 服务端钩子
===
服务端钩子和本地钩子几乎一样,只不过它们存在于服务端的仓库中(比如说中心仓库,或者开发者的公共仓库)。当和官方仓库连接时,其中一些可以用来拒绝一些不符合规范的提交。 服务端钩子和本地钩子几乎一样,只不过它们存在于服务端的仓库中(比如说中心仓库,或者开发者的公共仓库)。当和官方仓库连接时,其中一些可以用来拒绝一些不符合规范的提交。
@ -443,8 +443,7 @@ print "Moving '%s' from %s to %s" % (branch, old_commit, new_commit)
这个脚本没有参数,但和`pre-receive` 一样通过标准输入读取。 这个脚本没有参数,但和`pre-receive` 一样通过标准输入读取。
总结 ## 总结
---
在这篇文章中我们学习了如果用Git钩子来修改内部行为当仓库中特定的事件发生时接受消息。钩子是存在于`git/hooks` 仓库中的普通脚本,因此也非常容易安装和定制。 在这篇文章中我们学习了如果用Git钩子来修改内部行为当仓库中特定的事件发生时接受消息。钩子是存在于`git/hooks` 仓库中的普通脚本,因此也非常容易安装和定制。

View File

@ -1,8 +1,8 @@
# 代码合并Merge还是Rebase # 代码合并Merge还是Rebase
> BY 童仲毅(geeeeeeeeek@github) > BY 童仲毅([geeeeeeeeek@github](https://github.com/geeeeeeeeek/git-recipes/))
> >
> 这是一篇在[原文](https://www.atlassian.com/git/tutorials/merging-vs-rebasing)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名([CC BY 2.5 AU](http://creativecommons.org/licenses/by/2.5/au/deed.zh))协议共享。 > 这是一篇在[原文(BY atlassian)](https://www.atlassian.com/git/tutorials/merging-vs-rebasing)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名([CC BY 2.5 AU](http://creativecommons.org/licenses/by/2.5/au/deed.zh))协议共享。
`git rebase` 这个命令经常被人认为是一种Git巫术初学者应该避而远之。但如果使用得当的话它能给你的团队开发省去太多烦恼。在这篇文章中我们会比较`git rebase` 和类似的`git merge` 命令找到Git工作流中rebase的所有用法。 `git rebase` 这个命令经常被人认为是一种Git巫术初学者应该避而远之。但如果使用得当的话它能给你的团队开发省去太多烦恼。在这篇文章中我们会比较`git rebase` 和类似的`git merge` 命令找到Git工作流中rebase的所有用法。

View File

@ -1,8 +1,8 @@
# 保存你的更改 # 保存你的更改
> BY 童仲毅(geeeeeeeeek@github) > BY 童仲毅([geeeeeeeeek@github](https://github.com/geeeeeeeeek/git-recipes/))
> >
> 这是一篇在[原文](https://www.atlassian.com/git/tutorials/saving-changes)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名([CC BY 2.5 AU](http://creativecommons.org/licenses/by/2.5/au/deed.zh))协议共享。 > 这是一篇在[原文(BY atlassian)](https://www.atlassian.com/git/tutorials/saving-changes)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名([CC BY 2.5 AU](http://creativecommons.org/licenses/by/2.5/au/deed.zh))协议共享。
## git add ## git add

View File

@ -1,8 +1,8 @@
# 创建代码仓库 # 创建代码仓库
> BY 童仲毅(geeeeeeeeek@github) > BY 童仲毅([geeeeeeeeek@github](https://github.com/geeeeeeeeek/git-recipes/))
> >
> 这是一篇在[Bitbucket教程](https://www.atlassian.com/git/tutorials/setting-up-a-repository)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名([CC BY 2.5 AU](http://creativecommons.org/licenses/by/2.5/au/deed.zh))协议共享。 > 这是一篇在[原文(BY atlassian)](https://www.atlassian.com/git/tutorials/setting-up-a-repository)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名([CC BY 2.5 AU](http://creativecommons.org/licenses/by/2.5/au/deed.zh))协议共享。

View File

@ -1,8 +1,8 @@
# Reset、Checkout和Revert # Reset、Checkout和Revert
> BY 童仲毅(geeeeeeeeek@github) > BY 童仲毅([geeeeeeeeek@github](https://github.com/geeeeeeeeek/git-recipes/))
> >
> 这是一篇在[原文](https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名([CC BY 2.5 AU](http://creativecommons.org/licenses/by/2.5/au/deed.zh))协议共享。 > 这是一篇在[原文(BY atlassian)](https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名([CC BY 2.5 AU](http://creativecommons.org/licenses/by/2.5/au/deed.zh))协议共享。
`git reset``git checkout``git revert`是你的Git工具箱中最有用的命令。它们都用来撤销代码仓库中的某些更改而前两个命令不仅可以作用于commit还可以作用于特定文件。 `git reset``git checkout``git revert`是你的Git工具箱中最有用的命令。它们都用来撤销代码仓库中的某些更改而前两个命令不仅可以作用于commit还可以作用于特定文件。

View File

@ -1,8 +1,8 @@
# 检查仓库状态 # 检查仓库状态
> BY 童仲毅(geeeeeeeeek@github) > BY 童仲毅([geeeeeeeeek@github](https://github.com/geeeeeeeeek/git-recipes/))
> >
> 这是一篇在[原文](https://www.atlassian.com/git/tutorials/inspecting-a-repository/git-log)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名([CC BY 2.5 AU](http://creativecommons.org/licenses/by/2.5/au/deed.zh))协议共享。 > 这是一篇在[原文(BY atlassian)](https://www.atlassian.com/git/tutorials/inspecting-a-repository/git-log)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名([CC BY 2.5 AU](http://creativecommons.org/licenses/by/2.5/au/deed.zh))协议共享。
## git status ## git status

View File

@ -7,7 +7,7 @@
- **第1章** [快速指南](https://github.com/geeeeeeeeek/git-recipes/wiki/2.1-%E5%BF%AB%E9%80%9F%E6%8C%87%E5%8D%97) - **第1章** [快速指南](https://github.com/geeeeeeeeek/git-recipes/wiki/2.1-%E5%BF%AB%E9%80%9F%E6%8C%87%E5%8D%97)
- **第2章** [创建代码仓库](https://github.com/geeeeeeeeek/git-recipes/wiki/2.2-%E5%88%9B%E5%BB%BA%E4%BB%A3%E7%A0%81%E4%BB%93%E5%BA%93) - **第2章** [创建代码仓库](https://github.com/geeeeeeeeek/git-recipes/wiki/2.2-%E5%88%9B%E5%BB%BA%E4%BB%A3%E7%A0%81%E4%BB%93%E5%BA%93)
- **第3章** [保存你的更改](https://github.com/geeeeeeeeek/git-recipes/wiki/2.3-%E4%BF%9D%E5%AD%98%E4%BD%A0%E7%9A%84%E6%9B%B4%E6%94%B9) - **第3章** [保存你的更改](https://github.com/geeeeeeeeek/git-recipes/wiki/2.3-%E4%BF%9D%E5%AD%98%E4%BD%A0%E7%9A%84%E6%9B%B4%E6%94%B9)
- **第4章** [仓库状态](https://github.com/geeeeeeeeek/git-recipes/wiki/2.4-%E6%A3%80%E6%9F%A5%E4%BB%93%E5%BA%93%E7%8A%B6%E6%80%81) - **第4章** [查仓库状态](https://github.com/geeeeeeeeek/git-recipes/wiki/2.4-%E6%A3%80%E6%9F%A5%E4%BB%93%E5%BA%93%E7%8A%B6%E6%80%81)
- **第5章** [检出之前的提交](https://github.com/geeeeeeeeek/git-recipes/wiki/2.5-%E6%A3%80%E5%87%BA%E4%B9%8B%E5%89%8D%E7%9A%84%E6%8F%90%E4%BA%A4) - **第5章** [检出之前的提交](https://github.com/geeeeeeeeek/git-recipes/wiki/2.5-%E6%A3%80%E5%87%BA%E4%B9%8B%E5%89%8D%E7%9A%84%E6%8F%90%E4%BA%A4)
- **第6章** 回滚错误的更改 **第7章** 重写项目历史 - **第6章** 回滚错误的更改 **第7章** 重写项目历史