<commit_before><<<<<<< HEAD
# Git master修改
=======
# Git master修改
>>>>>>> master

## 起步

分布式版本控制系统（Distributed Version Control System，简称 DVCS）

在这类系统中，像 Git、Mercurial、Bazaar 以及 Darcs 等，客户端并不只提取最新版本的文件快照，而是把代码仓库完整地镜像下来。 这么一来，任何一处协同工作用的服务器发生故障，事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作，实际上都是一次对代码仓库的完整备份。

对非线性开发模式的强力支持（允许成千上万个并行开发的分支）

## 常用命令行

| Windows | Mac OS/Linux) | 描述               | 例子
| mkdir   | mkdir         | 新建目录           | mkdir testdirectory
| del     | rm            | 删除文档/目录      | del c:\test\test.txt
| copy    | cp            | 复制文档           | copy c:\test\test.txt c:\windows\test.txt
| move    | mv            | 移动文档           | move c:\test\test.txt c:\windows\test.txt
| cd      | cd            | 修改路径           | cd test
| dir     | ls            | 列出所有文档和路径 | dir
| exit    | exit          | 离开视窗           | exit


## 安装git

官方版本下载
http://git-scm.com/download/win
http://msysgit.github.com/

GitHub for Windows
https://desktop.github.com/

## 获取仓库

### 在现有目录中初始化仓库

该命令将创建一个名为 .git 的子目录，这个子目录含有你初始化的 Git 仓库中所有的必须文件，这些文件是 Git 仓库的骨干。

    > git init

你可通过 `git add` 命令来实现对指定文件的跟踪，然后执行 `git commit` 提交

    > git add *.c
    > git commit -m 'initial project version'

### 在现有目录中初始化仓库

当你执行 git clone 命令的时候，默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。 事实上，如果你的服务器的磁盘坏掉了，你通常可以使用任何一个克隆下来的用户端来重建服务器上的仓库

克隆仓库的命令格式是 `git clone [url]`
    > git clone https://github.com/libgit2/libgit2

如果不想每次都输入完整的 Git 命令，可以通过 git config 文件来轻松地为每一个命令设置一个别名。
工作目录下的每一个文件都不外乎这两种状态：已跟踪(Untracked)或未跟踪(Tracked: Unmodified Modified Staged)。

已跟踪的文件是指那些被纳入了版本控制的文件，在上一次快照中有它们的记录，在工作一段时间后，它们的状态可能处于未修改，已修改或已放入暂存区。 工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件，它们既不存在于上次快照的记录中，也没有放入暂存区。 

### 检查当前文件状态

要查看哪些文件处于什么状态，可以用 `git status` 命令。

Untracked

工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件，它们既不存在于上次快照的记录中，也没有放入暂存区。

    On branch master
    
    Initial commit
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
    
            README
    
    nothing added to commit but untracked files present (use "git add" to track)


Committed

这说明你现在的工作目录相当干净。换句话说，所有已跟踪文件在上次提交后都未被更改过。 此外，上面的信息还表明，当前目录下没有出现任何处于未跟踪状态的新文件，否则 Git 会在这里列出来。 最后，该命令还显示了当前所在分支，并告诉你这个分支同远程服务器上对应的分支没有偏离。 现在，分支名是 “master”,这是默认的分支名。

    On branch master
    nothing to commit, working directory clean


Modified

    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)

            modified:   README

    no changes added to commit (use "git add" and/or "git commit -a")


Stadged

    On branch master

    Initial commit

    Changes to be committed:
      (use "git rm --cached <file>..." to unstage)

            new file:   README


### 更新仓库的命令

| 命令                        | 描述                        |
| --------------------------- | --------------------------- |
| git add <file>              | 将文件放入暂存区            |
| git diff                    | 分析文件差异                |
| git commit -m "FEA:message" | 提交暂存区的更新            |
| git rm <file>               | 从已跟踪文件清单中移除文件  |
| git mv <file> <file>        | 移动文件                    |
| git clone <url>             | 从仓库克隆文件
| git log                     | 查看提交历史 参数 -p 显示每次提交的内容差异 -2 仅显示最近两次提交
| git reset HEAD <file>       | 取消暂存的文件
| git checkout -- <file>      | 拷贝了线上文件来覆盖它，这样对那个文件做的任何修改都会消失| 

### 远程仓库的使用


| 命令                        | 描述                        |
| --------------------------- | --------------------------- |
| git remote              | 查看远程仓库   -v 会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL          |
| git remote add <remoteName> <url>   | 添加一个新的远程 Git 仓库，同时指定一个你可以轻松引用的简写   |
| git fetch <remoteName/url> | 从远程仓库中抓取与拉取            |
| git push <remoteName> <branchName>    | 推送到远程仓库 默认的branchName是master  |
| git remote rename <remoteName> <newName>    | 远程仓库的移除与重命名
| git remote rm <remoteName>                     | 移除一个远程仓库

### 管理
| 命令                        | 描述                        |
| --------------------------- | --------------------------- |
| git tag              | 查看远程仓库          |
| git tag  - a <tagName>  <verification> -m "message"  | 附注标签 如果verification缺失，则是给当前版本添加标签;  |
| git push <remoteName> [tagname] | 在创建完标签后你必须显式地推送标签到共享服务器上，不然不会上传。|
| git config --global alias.ci 'commit' | 如果不想每次都输入完整的 Git 命令，可以为每一个命令设置一个别名。|


## 分支

### 分支简介

暂存操作会把当前版本的文件快照保存到 Git 仓库中，这个文件快照就是Git的blob对象。

| blob对象  | 保存着文件快照                                                 |
| 提交对象  | 包含指向blob 对象的指针和一个指向上次提交对象（父对象）的指针  |


![提交对象](commits-and-parents.png)

Git 的分支，其实本质上仅仅是指向提交对象的可变指针。

HEAD 在 Git 中，它是一个指针，指向当前所在的本地分支（译注：将 HEAD 想象为当前分支的别名）

Git 通过创建了一个可以移动的新的指针来创建创建新分支。 

分支切换 就将将 HEAD 指向 testing 分支。

因为刚才你创建了一个新分支，并切换过去进行了一些工作，随后又切换回 master 分支进行了另外一些工作。 上述两次改动针对的是不同分支：你可以在不同分支间不断地来回切换和工作，并在时机成熟时将它们合并起来。

| git branch   |  查看分支 -v 查看每一个分支的最后一次提交
| git branch <name>  |  创建分支
| git log --oneline --decorate |  查看各个分支所指的对象 
| git checkout <name> | 切换分支
| git checkout -b <name> | -b branch缩写；创建分支并切换分支 
| git branch -d <name> | 删除分支

 git branch [options] [-r | -a] [--merged | --no-merged]
 git branch [options] [-l] [-f] <branchname> [<start-point>]
 git branch [options] [-r] (-d | -D) <branchname>...
 git branch [options] (-m | -M) [<oldbranch>] <newbranch>



fast-forward ：当你试图合并两个分支时，如果顺着一个分支走下去能够到达另一个分支，那么 Git 在合并两者的时候，只会简单的将指针向前推进（指针右移），因为这种情况下的合并操作没有需要解决的分歧

## 分支开发工作流

### 长期分支

许多使用 Git 的开发者都喜欢使用这种方式来工作，比如只在 master 分支上保留完全稳定的代码——有可能仅仅是已经发布或即将发布的代码。 他们还有一些名为 develop 或者 next 的平行分支，被用来做后续开发或者测试稳定性——这些分支不必保持绝对稳定，但是一旦达到稳定状态，它们就可以被合并入 master 分支了。 这样，在确保这些已完成的特性分支（短期分支，比如之前的 iss53 分支）能够通过所有测试，并且不会引入更多 bug 之后，就可以合并入主干分支中，等待下一次的发布。

### 特性分支

特性分支对任何规模的项目都适用。 特性分支是一种短期分支，它被用来实现单一特性或其相关工作。 也许你从来没有在其他的版本控制系统（VCS）上这么做过，因为在那些版本控制系统中创建和合并分支通常很费劲。 然而，在 Git 中一天之内多次创建、使用、合并、删除分支都很常见。<commit_msg>解决冲突不成功master<commit_after><<<<<<< HEAD
# Git master修改
=======
# Git master修改
>>>>>>> master

## 解决冲突不成功 master

分布式版本控制系统（Distributed Version Control System，简称 DVCS）

在这类系统中，像 Git、Mercurial、Bazaar 以及 Darcs 等，客户端并不只提取最新版本的文件快照，而是把代码仓库完整地镜像下来。 这么一来，任何一处协同工作用的服务器发生故障，事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作，实际上都是一次对代码仓库的完整备份。

对非线性开发模式的强力支持（允许成千上万个并行开发的分支）

## 常用命令行

| Windows | Mac OS/Linux) | 描述               | 例子
| mkdir   | mkdir         | 新建目录           | mkdir testdirectory
| del     | rm            | 删除文档/目录      | del c:\test\test.txt
| copy    | cp            | 复制文档           | copy c:\test\test.txt c:\windows\test.txt
| move    | mv            | 移动文档           | move c:\test\test.txt c:\windows\test.txt
| cd      | cd            | 修改路径           | cd test
| dir     | ls            | 列出所有文档和路径 | dir
| exit    | exit          | 离开视窗           | exit


## 安装git

官方版本下载
http://git-scm.com/download/win
http://msysgit.github.com/

GitHub for Windows
https://desktop.github.com/

## 获取仓库

### 在现有目录中初始化仓库

该命令将创建一个名为 .git 的子目录，这个子目录含有你初始化的 Git 仓库中所有的必须文件，这些文件是 Git 仓库的骨干。

    > git init

你可通过 `git add` 命令来实现对指定文件的跟踪，然后执行 `git commit` 提交

    > git add *.c
    > git commit -m 'initial project version'

### 在现有目录中初始化仓库

当你执行 git clone 命令的时候，默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。 事实上，如果你的服务器的磁盘坏掉了，你通常可以使用任何一个克隆下来的用户端来重建服务器上的仓库

克隆仓库的命令格式是 `git clone [url]`
    > git clone https://github.com/libgit2/libgit2

如果不想每次都输入完整的 Git 命令，可以通过 git config 文件来轻松地为每一个命令设置一个别名。
工作目录下的每一个文件都不外乎这两种状态：已跟踪(Untracked)或未跟踪(Tracked: Unmodified Modified Staged)。

已跟踪的文件是指那些被纳入了版本控制的文件，在上一次快照中有它们的记录，在工作一段时间后，它们的状态可能处于未修改，已修改或已放入暂存区。 工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件，它们既不存在于上次快照的记录中，也没有放入暂存区。 

### 检查当前文件状态

要查看哪些文件处于什么状态，可以用 `git status` 命令。

Untracked

工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件，它们既不存在于上次快照的记录中，也没有放入暂存区。

    On branch master
    
    Initial commit
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
    
            README
    
    nothing added to commit but untracked files present (use "git add" to track)


Committed

这说明你现在的工作目录相当干净。换句话说，所有已跟踪文件在上次提交后都未被更改过。 此外，上面的信息还表明，当前目录下没有出现任何处于未跟踪状态的新文件，否则 Git 会在这里列出来。 最后，该命令还显示了当前所在分支，并告诉你这个分支同远程服务器上对应的分支没有偏离。 现在，分支名是 “master”,这是默认的分支名。

    On branch master
    nothing to commit, working directory clean


Modified

    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)

            modified:   README

    no changes added to commit (use "git add" and/or "git commit -a")


Stadged

    On branch master

    Initial commit

    Changes to be committed:
      (use "git rm --cached <file>..." to unstage)

            new file:   README


### 更新仓库的命令

| 命令                        | 描述                        |
| --------------------------- | --------------------------- |
| git add <file>              | 将文件放入暂存区            |
| git diff                    | 分析文件差异                |
| git commit -m "FEA:message" | 提交暂存区的更新            |
| git rm <file>               | 从已跟踪文件清单中移除文件  |
| git mv <file> <file>        | 移动文件                    |
| git clone <url>             | 从仓库克隆文件
| git log                     | 查看提交历史 参数 -p 显示每次提交的内容差异 -2 仅显示最近两次提交
| git reset HEAD <file>       | 取消暂存的文件
| git checkout -- <file>      | 拷贝了线上文件来覆盖它，这样对那个文件做的任何修改都会消失| 

### 远程仓库的使用


| 命令                        | 描述                        |
| --------------------------- | --------------------------- |
| git remote              | 查看远程仓库   -v 会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL          |
| git remote add <remoteName> <url>   | 添加一个新的远程 Git 仓库，同时指定一个你可以轻松引用的简写   |
| git fetch <remoteName/url> | 从远程仓库中抓取与拉取            |
| git push <remoteName> <branchName>    | 推送到远程仓库 默认的branchName是master  |
| git remote rename <remoteName> <newName>    | 远程仓库的移除与重命名
| git remote rm <remoteName>                     | 移除一个远程仓库

### 管理
| 命令                        | 描述                        |
| --------------------------- | --------------------------- |
| git tag              | 查看远程仓库          |
| git tag  - a <tagName>  <verification> -m "message"  | 附注标签 如果verification缺失，则是给当前版本添加标签;  |
| git push <remoteName> [tagname] | 在创建完标签后你必须显式地推送标签到共享服务器上，不然不会上传。|
| git config --global alias.ci 'commit' | 如果不想每次都输入完整的 Git 命令，可以为每一个命令设置一个别名。|


## 分支

### 分支简介

暂存操作会把当前版本的文件快照保存到 Git 仓库中，这个文件快照就是Git的blob对象。

| blob对象  | 保存着文件快照                                                 |
| 提交对象  | 包含指向blob 对象的指针和一个指向上次提交对象（父对象）的指针  |


![提交对象](commits-and-parents.png)

Git 的分支，其实本质上仅仅是指向提交对象的可变指针。

HEAD 在 Git 中，它是一个指针，指向当前所在的本地分支（译注：将 HEAD 想象为当前分支的别名）

Git 通过创建了一个可以移动的新的指针来创建创建新分支。 

分支切换 就将将 HEAD 指向 testing 分支。

因为刚才你创建了一个新分支，并切换过去进行了一些工作，随后又切换回 master 分支进行了另外一些工作。 上述两次改动针对的是不同分支：你可以在不同分支间不断地来回切换和工作，并在时机成熟时将它们合并起来。

| git branch   |  查看分支 -v 查看每一个分支的最后一次提交
| git branch <name>  |  创建分支
| git log --oneline --decorate |  查看各个分支所指的对象 
| git checkout <name> | 切换分支
| git checkout -b <name> | -b branch缩写；创建分支并切换分支 
| git branch -d <name> | 删除分支

 git branch [options] [-r | -a] [--merged | --no-merged]
 git branch [options] [-l] [-f] <branchname> [<start-point>]
 git branch [options] [-r] (-d | -D) <branchname>...
 git branch [options] (-m | -M) [<oldbranch>] <newbranch>



fast-forward ：当你试图合并两个分支时，如果顺着一个分支走下去能够到达另一个分支，那么 Git 在合并两者的时候，只会简单的将指针向前推进（指针右移），因为这种情况下的合并操作没有需要解决的分歧

## 分支开发工作流

### 长期分支

许多使用 Git 的开发者都喜欢使用这种方式来工作，比如只在 master 分支上保留完全稳定的代码——有可能仅仅是已经发布或即将发布的代码。 他们还有一些名为 develop 或者 next 的平行分支，被用来做后续开发或者测试稳定性——这些分支不必保持绝对稳定，但是一旦达到稳定状态，它们就可以被合并入 master 分支了。 这样，在确保这些已完成的特性分支（短期分支，比如之前的 iss53 分支）能够通过所有测试，并且不会引入更多 bug 之后，就可以合并入主干分支中，等待下一次的发布。

### 特性分支

特性分支对任何规模的项目都适用。 特性分支是一种短期分支，它被用来实现单一特性或其相关工作。 也许你从来没有在其他的版本控制系统（VCS）上这么做过，因为在那些版本控制系统中创建和合并分支通常很费劲。 然而，在 Git 中一天之内多次创建、使用、合并、删除分支都很常见。
{'fraction_non_alphanumeric': 0.12734792348785112, 'fraction_numerical': 0.0008616232982939859, 'mean_word_length': 2.3702090592334493, 'pattern_counts': {'":': 0, '<': 79, '<?xml version=': 0, '>': 87, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 18, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6216950', 'n_tokens_mistral': 6444, 'n_tokens_neox': 7186, 'n_words': 948}