再开始这个话题以前,让我想起了一件很痛苦的事情,在我大学写毕业论文的时候,我当时的文件是这样保存的git
毕业论文_初稿.doc
毕业论文_修改1.doc
毕业论文_修改2.doc
毕业论文_修改3.doc
毕业论文_完整版1.doc
毕业论文_完整版2.doc
毕业论文_完整版3.doc
毕业论文_死也不改版.doc
毕业论文_最终版1.doc
毕业论文_最终版2.doc
这个时候,咱们会重复的提交给导师,导师也会帮咱们修改毕业论文,我本身这里的还好说,那么若是是导师再给我返回回来的文件,我就要想一想,我是何时提交给导师的,我要把我后面写的东西跟导师写的东西都添加到个人最新的版本中github
以上就是使用最原始的方式进行版本控制,可是这种方式有显著缺点:shell
这个时候我就想,若是能有一个软件来帮助我来解决这个问题的话,那是多么好的一件事啊,这样我本身就不须要去保存全部的文件了,何时须要直接在软件里面看一下,岂不是很方便.windows
版本 | 文件名 | 用户 | 说明 | 日期 |
---|---|---|---|---|
1.0版本 | 毕业论文 | 张三 | 新建 | 2018.1.12 |
1.1版本 | 毕业论文 | 张三 | 写了第一部分 | 2018.2.12 |
2.0版本 | 毕业论文 | 张三 | 写完了所有 | 2018.3.23 |
3.0版本 | 毕业论文 | 张三 | 答辩使用 | 2018.4.25 |
这样你就从版本管理的农耕时代直接进入到了版本控制的21世纪,为了解决以上版本控制存在问题,应运而生了一批版本控制工具:VSS、CVS、SVN、Git等,其中Git属于绝对霸主地位。缓存
Git 是一个开源的分布式版本控制软件,用以有效、高速的处理从很小到很是大的项目版本管理。 Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发。Git 是根据GNU通用公共许可证版本2的条款分发的自由/免费软件,安装参见:http://git-scm.com/服务器
GitHub是一个基于Git的远程文件托管平台(同GitCafe、BitBucket和GitLab等)。分布式
Git自己彻底能够作到版本控制,但其全部内容以及版本记录只能保存在本机,若是想要将文件内容以及版本记录同时保存在远程,则须要结合GitHub来使用。使用场景:工具
其余 : 学习
集中式: 远程服务器保存全部版本, 用户客户端有某个版本网站
分布式: 远程服务器保存全部版本, 用户客户端有全部版本
若是你想在 Linux 上用二进制安装程序来安装 Git,可使用发行版包含的基础软件包管理工具来安装。 若是以 Fedora 上为例,你可使用 yum:
$ sudo yum install git
若是你在基于 Debian 的发行版上,请尝试用 apt-get:
$ sudo apt-get install git
在 Mac 上安装 Git 有多种方式。 最简单的方法是安装 Xcode Command Line Tools。 Mavericks (10.9) 或更高版本的系统中,在 Terminal 里尝试首次运行 git 命令便可。 若是没有安装过命令行开发者工具,将会提示你安装。
若是你想安装更新的版本,可使用二进制安装程序。 官方维护的 OSX Git 安装程序能够在 Git 官方网站下载,网址为 <http://git-scm.com/download/mac>;。
在 Windows 上安装 Git 也有几种安装方法。 官方版本能够在 Git 官方网站下载。 打开 <http://git-scm.com/download/win>,下载会自动开始。 要注意这是一个名为 Git for Windows的项目(也叫作 msysGit),和 Git 是分别独立的项目;更多信息请访问 <http://msysgit.github.io/>;。
另外一个简单的方法是安装 GitHub for Windows。 该安装程序包含图形化和命令行版本的 Git。 它也能支持 Powershell,提供了稳定的凭证缓存和健全的 CRLF 设置。 稍后咱们会对这方面有更多了解,如今只要一句话就够了,这些都是你所须要的。 你能够在 GitHub for Windows 网站下载,网址为 http://windows.github.com。
Git 有多种使用方式。 你可使用原生的命令行模式,也可使用 GUI 模式,这些 GUI 软件也能提供多种功能。 在本书中,咱们将使用命令行模式。 这是由于首先,只有在命令行模式下你才能执行 Git 的 全部命令,而大多数的 GUI 软件只实现了 Git 全部功能的一个子集以下降操做难度。 若是你学会了在命令行下如何操做,那么你在操做 GUI 软件时应该也不会遇到什么困难,可是,反之则不成立。 此外,因为每一个人的想法与侧重点不一样,不一样的人经常会安装不一样的 GUI 软件,但 全部 人必定会有命令行工具。
假如你是 Mac 用户,咱们但愿你懂得如何使用终端(Terminal);假如你是 Windows 用户,咱们但愿你懂得如何使用命令窗口(Command Prompt)或 PowerShell。 若是你还没有掌握以上技能,咱们建议你先停下来快速学习一下,本书中的讲述和举例将用到这些技能。
若是你打算使用Git来对现有的项目进行管理, 你只须要进入该项目目录并输入:
git init
该命令将建立一个名为 .git 的子目录, 这个子目录含有你初始化的Git 仓库中全部的必须文件, 可是, 在这个时候, 咱们仅仅是作一个初始化的操做, 你的项目里的文件尚未被跟踪.
那么怎么来实现项目中的管理呢
和把大象放到冰箱须要3步相比,把一个文件放到Git仓库只须要两步。
第一步,用命令git add
告诉Git,把文件添加到仓库:
git add readme.txt
执行上面的命令, 没有任何显示, 这就对了, Unix的哲学是" 没有消息就是好消息", 说明添加成功
第二步, 用命令git commit 告诉Git ,把文件提交到仓库:
git commit -m "wrote a readme file" [master (root-commit) eaadf4e] wrote a readme file 1 file changed, 2 insertions(+) create mode 100644 readme.txt
简单解释一下git commit
命令,-m
后面输入的是本次提交的说明,能够输入任意内容,固然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
嫌麻烦不想输入-m "xxx"
行不行?确实有办法能够这么干,可是强烈不建议你这么干,由于输入说明对本身对别人阅读都很重要。实在不想输入说明的童鞋请自行Google,我不告诉你这个参数。
git commit
命令执行成功后会告诉你,1 file changed
:1个文件被改动(咱们新添加的readme.txt文件);2 insertions
:插入了两行内容(readme.txt有两行内容)。
咱们已经成功地添加并提交了一个readme.txt文件,如今,是时候继续工做了,因而,咱们继续修改readme.txt文件,改为以下内容:
Git is a distributed version control system.
Git is free software.
如今,运行git status
命令看看结果:
[Derek@git]$ git status 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.txt no changes added to commit (use "git add" and/or "git commit -a")
git status 命令可让咱们时刻掌握仓库当前的状态, 上面的命令输出告诉咱们, readme.txt 被修改过了, 但尚未准备提交的修改
若是 git status
命令的输出对于你来讲过于模糊,你想知道具体修改了什么地方,能够用 git diff
命令。 稍后咱们会详细介绍 git diff
,你可能一般会用它来回答这两个问题:当前作的哪些更新尚未暂存? 有哪些更新已经暂存起来准备好了下次提交? 尽管 git status
已经经过在相应栏下列出文件名的方式回答了这个问题,git diff
将经过文件补丁的格式显示具体哪些行发生了改变。
git diff diff --git a/README.md b/README.md index e69de29..a34691f 100644 --- a/README.md +++ b/README.md @@ -0,0 +1 @@ +this is new line
此命令比较的是工做目录中当前文件和暂存区域快照之间的差别, 也就是修改以后尚未暂存起来的变化内容。
若要查看已暂存的将要添加到下次提交里的内容,能够用 git diff --cached
命令。(Git 1.6.1 及更高版本还容许使用 git diff --staged
,效果是相同的,但更好记些。)
git diff --staged diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29
如今的暂存区域已经准备稳当能够提交了。 在此以前,请必定要确认还有什么修改过的或新建的文件尚未 git add
过,不然提交的时候不会记录这些还没暂存起来的变化。 这些修改过的文件只保留在本地磁盘。 因此,每次准备提交前,先用 git status
看下,是否是都已暂存起来了, 而后再运行提交命令 git commit
:
git commit
-m 选项, 将提交信息与命令放在同一行
git commit -m 'create' [master (root-commit) 88a09aa] create 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README.md
尽管使用暂存区域的方式能够精心准备要提交的细节,但有时候这么作略显繁琐。 Git 提供了一个跳过使用暂存区域的方式, 只要在提交的时候,给 git commit
加上 -a
选项,Git 就会自动把全部已经跟踪过的文件暂存起来一并提交
git commit -a -m 'update'
[master 86d801b] update
1 file changed, 1 insertion(+)
git log commit 86d801bbaa4cc560acc7c8f79a65cac85201f170 (HEAD -> master) Author: wangfeng7399 <wangfeng17399@163.com> Date: Tue Feb 19 18:48:48 2019 +0800 update commit 88a09aa009af29e9a784d6dbb68589f70f1c51be Author: wangfeng7399 <wangfeng17399@163.com> Date: Tue Feb 19 18:48:04 2019 +0800 create
-p 用来显示每次提交的内容差别
你也能够加上 -2 来仅显示最近两次提交
git log -p -2 commit 86d801bbaa4cc560acc7c8f79a65cac85201f170 (HEAD -> master) Author: wangfeng7399 <wangfeng17399@163.com> Date: Tue Feb 19 18:48:48 2019 +0800 update diff --git a/README.md b/README.md index e69de29..a34691f 100644 --- a/README.md +++ b/README.md @@ -0,0 +1 @@ +this is new line commit 88a09aa009af29e9a784d6dbb68589f70f1c51be Author: wangfeng7399 <wangfeng17399@163.com> Date: Tue Feb 19 18:48:04 2019 +0800 create diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29
另一个经常使用的选项是 --pretty
。 这个选项能够指定使用不一样于默认格式的方式展现提交历史。 这个选项有一些内建的子选项供你使用。 好比用 oneline
将每一个提交放在一行显示,查看的提交数很大时很是有用。 另外还有 short
,full
和 fuller
能够用,展现的信息或多或少有些不一样,请本身动手实践一下看看效果如何。
git log --pretty=oneline ca82a6dff817ec66f44342007202690a93763949 changed the version number 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
但最有意思的是 format,能够定制要显示的记录格式。 这样的输出对后期提取分析格外有用 — 由于你知道输出的格式不会随着 Git 的更新而发生改变:
git log --pretty=format
经常使用的选项 列出了经常使用的格式占位符写法及其表明的意义。
选项 | 说明 |
---|---|
%H |
提交对象(commit)的完整哈希字串 |
%h |
提交对象的简短哈希字串 |
%T |
树对象(tree)的完整哈希字串 |
%t |
树对象的简短哈希字串 |
%P |
父对象(parent)的完整哈希字串 |
%p |
父对象的简短哈希字串 |
%an |
做者(author)的名字 |
%ae |
做者的电子邮件地址 |
%ad |
做者修订日期(能够用 --date= 选项定制格式) |
%ar |
做者修订日期,按多久之前的方式显示 |
%cn |
提交者(committer)的名字 |
%ce |
提交者的电子邮件地址 |
%cd |
提交日期 |
%cr |
提交日期,按多久之前的方式显示 |
%s |
提交说明 |
git log
的经常使用选项选项 | 说明 |
---|---|
-p |
按补丁格式显示每一个更新之间的差别。 |
--stat |
显示每次更新的文件修改统计信息。 |
--shortstat |
只显示 --stat 中最后的行数修改添加移除统计。 |
--name-only |
仅在提交信息后显示已修改的文件清单。 |
--name-status |
显示新增、修改、删除的文件清单。 |
--abbrev-commit |
仅显示 SHA-1 的前几个字符,而非全部的 40 个字符。 |
--relative-date |
使用较短的相对时间显示(好比,“2 weeks ago”)。 |
--graph |
显示 ASCII 图形表示的分支合并历史。 |
--pretty |
使用其余格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。 |
git log
输出的选项 中列出了经常使用的选项选项 | 说明 |
---|---|
-(n) |
仅显示最近的 n 条提交 |
--since , --after |
仅显示指定时间以后的提交。 |
--until , --before |
仅显示指定时间以前的提交。 |
--author |
仅显示指定做者相关的提交。 |
--committer |
仅显示指定提交者相关的提交。 |
--grep |
仅显示含指定关键字的提交 |
-S |
仅显示添加或移除了某个关键字的提交 |
例如你已经修改了两个文件而且想要将它们做为两次独立的修改提交,可是却意外地输入了 git add *
暂存了它们两个。 如何只取消暂存两个中的一个呢?
git status 命令提示了你
git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage)
modified: README.md
git reset HEAD README.md Unstaged changes after reset: M README.md [Derek@git]$ git status 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.md no changes added to commit (use "git add" and/or "git commit -a")
虽然在调用时加上 -- hard 选项 能够令 git reset 成为一个危险的命令, 可能致使工做目录中全部当前进度丢失! 但本例中工做目录内的文件并不会被修改, 不加选项他调用 git reset 并不危险 它只会修改暂存区域.
若是你并不想保留对 README,md 文件的修改怎么办? 你该如何方便地撤销修改 -- 将它还原成上次提交时的样子 (或者刚克隆完的样子, 或者刚把他放入工做目录时的样子)? 幸运的是., git status 也告诉了你应该如何作, 在最后一个例子中, 未暂存区域是这样:
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.md
它很是清楚地告诉了你如何撤消以前所作的修改。 让咱们来按照提示执行:
git checkout --README.md git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: README.md -> README
能够看到那些修改已经被撤消了。
你须要知道 git checkout ---[file] 是一个危险的命令, 这很重要, 你对那个文件作的任何修改都会消失
- 你只是拷贝了另外一个文件来覆盖它, 除非你确实清楚不想要那个文件了, 不然不要使用这个命令