一、git全局配置

一般在新的系统上,我们都需要先配置下自己的Git工作环境。配置工作只需进行一次,以后升级时还会沿用现在的配置。如果需要,你随时可以用相同的命令修改已有的配置:

  1. git config --global user.name "Breeze Yan" #配置全局用户名
  2. git config --global user.email "yanw02@mysoft.com.cn" #配置全局用户邮箱
  3. git config --unset --global user.name "Breeze Yan" #取消全局用户名配置
  4. git config --unset --global user.email "breeze.yan@newbiiz.com"
  5. git config --list #查看git配置
  6. git config user.name
  7. git config user.email

二、创建一个版本库

  1. #创建一个目录:
  2. mkdir git_test
  3. #在项目目录下执行如下操作完成初始化操作:
  4. git init

初始化完成以后,在项目目录下会出现一个.git的目录,所有git需要的数据和资源都存放在这个目录中

三、git的常用操作

在工作目录下面的所有文件都无外乎这两种状态:已跟踪或未跟踪。已跟踪的文件指的是已经被纳入版本控制管理的文件。已跟踪的文件,它们的状态可能是已修改,已暂存,或者未更新(未修改)。而未跟踪的文件,它们既没有上次更新的快照,也不在当前的暂存区域,通常情况下它们就是那些在工作目录下新创建的文件。

在对某些文件进行编辑之后,git将这些文件标记为已修改。我们会逐步把这些修改过的文件保存到暂存区域,直到最后一次一次性的提交所有这些位于暂存区域的文件,如此重复。所以使用Git时的文件状态变化周期如图所示

1、版本提交与回退

1.1、版本提交

在git_test目录下创建一个文件code.txt,内容如下:

  1. this is the first line

通过如下命令提交一个版本:

  1. yanwei@ubuntu:~/git_test$ git add code.txt
  2. yanwei@ubuntu:~/git_test$ git commit -m 'first commit'
  3. [master (根提交) d66bdc0] first commit
  4. 1 file changed, 1 insertion(+)
  5. create mode 100644 code.txt

使用如下命令可以查看版本记录:

  1. yanwei@ubuntu:~/git_test$ git log
  2. commit d66bdc0189d3663db2feed6193c00751b277e80d (HEAD -> master)
  3. Author: yanwei <yanwei@douyu.tv>
  4. Date: Sun Jul 15 22:35:33 2018 +0800
  5. first commit

1.2、版本回退

再次提交一个版本:

  1. # 在code.txt中再添加一行之后,内容如下:
  2. yanwei@ubuntu:~/git_test$ cat code.txt
  3. this is the first line
  4. this is the second line
  5. # 再次提交:
  6. yanwei@ubuntu:~/git_test$ git add code.txt
  7. yanwei@ubuntu:~/git_test$ git commit -m 'second commit'
  8. [master 227ecaa] second commit
  9. 1 file changed, 1 insertion(+)
  10. yanwei@ubuntu:~/git_test$ git log
  11. commit 227ecaa7a5aeca38d392662263f2704c66e1e64a (HEAD -> master)
  12. Author: yanwei <yanwei@douyu.tv>
  13. Date: Sun Jul 15 22:43:49 2018 +0800
  14. second commit
  15. commit d66bdc0189d3663db2feed6193c00751b277e80d
  16. Author: yanwei <yanwei@douyu.tv>
  17. Date: Sun Jul 15 22:35:33 2018 +0800
  18. first commit

现在若想回退到上一个版本,可以使用如下命令:

  1. yanwei@ubuntu:~/git_test$ git reset --hard HEAD^
  2. HEAD 现在位于 d66bdc0 first commit
  3. yanwei@ubuntu:~/git_test$ git log
  4. commit d66bdc0189d3663db2feed6193c00751b277e80d (HEAD -> master)
  5. Author: yanwei <yanwei@douyu.tv>
  6. Date: Sun Jul 15 22:35:33 2018 +0800
  7. first commit
  8. yanwei@ubuntu:~/git_test$ cat code.txt
  9. this is the first line

其中HEAD表示当前最新版本,HEAD^表示当前版本的上一个版本,HEAD^^表示当前版本的上上个版本,也可以使用HEAD~1表示当前版本的前一个版本,HEAD~100表示当前版本的前100版本。

假如这个时候,又需要回到second commit版本,可以使用如下命令:

  1. # 通过如下命令找到操作记录:
  2. yanwei@ubuntu:~/git_test$ git reflog
  3. d66bdc0 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
  4. 227ecaa HEAD@{1}: commit: second commit
  5. d66bdc0 (HEAD -> master) HEAD@{2}: commit (initial): first commit
  6. # 回退到second commit:
  7. yanwei@ubuntu:~/git_test$ git reset --hard 227ecaa
  8. HEAD 现在位于 227ecaa second commit
  9. yanwei@ubuntu:~/git_test$ git log
  10. commit 227ecaa7a5aeca38d392662263f2704c66e1e64a (HEAD -> master)
  11. Author: yanwei <yanwei@douyu.tv>
  12. Date: Sun Jul 15 22:43:49 2018 +0800
  13. second commit
  14. commit d66bdc0189d3663db2feed6193c00751b277e80d
  15. Author: yanwei <yanwei@douyu.tv>
  16. Date: Sun Jul 15 22:35:33 2018 +0800
  17. first commit

2、工作区、版本库与暂存区

2.1、工作区

我们操作文件的目录,如git_test,就是一个工作区

2.2、版本库

工作区有一个隐藏目录.git,这个不是工作区,而是git的版本库。

git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

因为我们创建git版本库时,git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

可以简单理解为,需要提交的文件修改全部放到暂存区,然后,一次性提交暂存区的所有修改。

前面我们把文件往git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

下面,我们在git_test目录下再创建一个文件code2.txt,内容如下:

  1. yanwei@ubuntu:~/git_test$ cat code2.txt
  2. the code2 first line

然后再次编辑code.txt,在其中加入一行,编辑后内容如下:

  1. yanwei@ubuntu:~/git_test$ cat code.txt
  2. this is the first line
  3. this is the second line
  4. this is the third line

使用git status查看当前工作树的状态:

  1. yanwei@ubuntu:~/git_test$ git status
  2. 位于分支 master
  3. 尚未暂存以备提交的变更:
  4. (使用 "git add <文件>..." 更新要提交的内容)
  5. (使用 "git checkout -- <文件>..." 丢弃工作区的改动)
  6. 修改: code.txt
  7. 未跟踪的文件:
  8. (使用 "git add <文件>..." 以包含要提交的内容)
  9. code2.txt
  10. 修改尚未加入提交(使用 "git add" 和/或 "git commit -a"

上面提示code.txt被修改,而code2.txt没有被跟踪。

我们将code.txt和code2.txt加入到暂存区,然后再次查看工作树状态:

  1. yanwei@ubuntu:~/git_test$ git add code.txt
  2. yanwei@ubuntu:~/git_test$ git add code2.txt
  3. yanwei@ubuntu:~/git_test$ git status
  4. 位于分支 master
  5. 要提交的变更:
  6. (使用 "git reset HEAD <文件>..." 以取消暂存)
  7. 修改: code.txt
  8. 新文件: code2.txt

然后,执行git commit就可以一次性把暂存区的所有修改提交到分支创建一个版本:

  1. yanwei@ubuntu:~/git_test$ git commit -m 'third commit'
  2. [master e4fb2aa] third commit
  3. 2 files changed, 2 insertions(+)
  4. create mode 100644 code2.txt
  5. yanwei@ubuntu:~/git_test$ git log
  6. commit e4fb2aa04ca8aa3b6a32ef46a69fa5f97ae625fa (HEAD -> master)
  7. Author: yanwei <yanwei@douyu.tv>
  8. Date: Sun Jul 15 23:16:56 2018 +0800
  9. third commit
  10. commit 227ecaa7a5aeca38d392662263f2704c66e1e64a
  11. Author: yanwei <yanwei@douyu.tv>
  12. Date: Sun Jul 15 22:43:49 2018 +0800
  13. second commit
  14. commit d66bdc0189d3663db2feed6193c00751b277e80d
  15. Author: yanwei <yanwei@douyu.tv>
  16. Date: Sun Jul 15 22:35:33 2018 +0800
  17. first commit

一旦提交后,在没有再次对工作区作修改之前,那么工作区就是“干净”的:

  1. yanwei@ubuntu:~/git_test$ git status
  2. 位于分支 master
  3. 无文件要提交,干净的工作区

现在版本库变成了如下模样:

3、管理文件的修改

3.1、修改文件

在code.txt中再次添加一行内容,修改后的内容如下:

  1. yanwei@ubuntu:~/git_test$ cat code.txt
  2. this is the first line
  3. this is the second line
  4. this is the third line
  5. this is the forth line

然后使用git add命令将其添加到暂存区

  1. yanwei@ubuntu:~/git_test$ git add code.txt
  2. yanwei@ubuntu:~/git_test$ git status
  3. 位于分支 master
  4. 要提交的变更:
  5. (使用 "git reset HEAD <文件>..." 以取消暂存)
  6. 修改: code.txt

再次修改该文件,添加一行内容,修改后的内容如下:

  1. yanwei@ubuntu:~/git_test$ cat code.txt
  2. this is the first line
  3. this is the second line
  4. this is the third line
  5. this is the forth line
  6. this is the fifth line

通过git commit提交一个版本,并使用git status查看,发现第二次修改code.txt内容之后,并没有将其添加到暂存区,所以创建新版本的时候,并没有被提交:

  1. yanwei@ubuntu:~/git_test$ git status
  2. 位于分支 master
  3. 要提交的变更:
  4. (使用 "git reset HEAD <文件>..." 以取消暂存)
  5. 修改: code.txt
  6. 尚未暂存以备提交的变更:
  7. (使用 "git add <文件>..." 更新要提交的内容)
  8. (使用 "git checkout -- <文件>..." 丢弃工作区的改动)
  9. 修改: code.txt
  10. yanwei@ubuntu:~/git_test$ git commit -m 'forth commit'
  11. [master 0a96a0f] forth commit
  12. 1 file changed, 1 insertion(+)
  13. yanwei@ubuntu:~/git_test$ git status
  14. 位于分支 master
  15. 尚未暂存以备提交的变更:
  16. (使用 "git add <文件>..." 更新要提交的内容)
  17. (使用 "git checkout -- <文件>..." 丢弃工作区的改动)
  18. 修改: code.txt
  19. 修改尚未加入提交(使用 "git add" 和/或 "git commit -a"

3.2、撤销修改

3.2.1、丢弃工作区的改动

可以使用git checkout -- <文件>来丢弃工作区的改动:

  1. # 使用如下指令来撤销我们第二次的修改
  2. yanwei@ubuntu:~/git_test$ git checkout -- code.txt
  3. yanwei@ubuntu:~/git_test$ git status
  4. 位于分支 master
  5. 无文件要提交,干净的工作
  6. # 再次查看code.txt文件,发现最后一次修改已被丢弃:
  7. yanwei@ubuntu:~/git_test$ cat code.txt
  8. this is the first line
  9. this is the second line
  10. this is the third line
  11. this is the forth line

3.2.2、撤销暂存区的修改

我们再次编辑code.txt,添加一行内容,并添加到暂存区:

  1. yanwei@ubuntu:~/git_test$ cat code.txt
  2. this is the first line
  3. this is the second line
  4. this is the third line
  5. this is the forth line
  6. new line
  7. yanwei@ubuntu:~/git_test$ git add code.txt
  8. yanwei@ubuntu:~/git_test$ git status
  9. 位于分支 master
  10. 要提交的变更:
  11. (使用 "git reset HEAD <文件>..." 以取消暂存)
  12. 修改: code.txt

通过如下命令,将暂存区的修改撤销,重新放回工作区:

  1. yanwei@ubuntu:~/git_test$ git reset HEAD code.txt
  2. 重置后取消暂存的变更:
  3. M code.txt
  4. yanwei@ubuntu:~/git_test$ git status
  5. 位于分支 master
  6. 尚未暂存以备提交的变更:
  7. (使用 "git add <文件>..." 更新要提交的内容)
  8. (使用 "git checkout -- <文件>..." 丢弃工作区的改动)
  9. 修改: code.txt
  10. 修改尚未加入提交(使用 "git add" 和/或 "git commit -a"

最后可以通过上面的丢弃工作区的改动,来彻底放弃对文件的修改。

3.3.3、小结

  1. 当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
  2. 当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了上面那种情形,然后按照上面的情形操作
  3. 已经提交了不合适的修改到版本库时,想要撤销本次提交,可直接回退版本库

4、文件差异对比

4.1、差异对比常用指令

  1. git diff #查看工作目录中当前文件和暂存区域快照之间的差异
  2. git diff --cached #查看暂存文件与上次提交时的快照之间的差异,与git diff --staged相同
  3. git diff HEAD #查看在最后一次提交后所有变更
  4. git diff v1.6 -- filename #从一个特定点开始文件的修改情况
  5. git diff v1.6 v1.7 --stat #两次提交的差异比对
  6. git diff master...branchname #在合并某分支前查看变更内容
  7. git diff --name-only v1.6 HEAD #列出v1.6版本到当前最新版本的差异文件,只显示文件,不显示差异内容

4.2、具体操作

4.2.1、对比当前工作区与HEAD版本的修改差异

  1. # 修改当前工作区的code.txt,内容如下:
  2. yanwei@ubuntu:~/git_test$ cat code.txt
  3. this is the first line
  4. this is the second line
  5. this is the third line
  6. this is the forth line
  7. new line
  8. # 差异对比
  9. yanwei@ubuntu:~/git_test$ git diff HEAD -- code.txt
  10. diff --git a/code.txt b/code.txt
  11. index 66f9219..9bc8cf3 100644
  12. --- a/code.txt # ---代表HEAD
  13. +++ b/code.txt # +++代表当前工作区的文件
  14. @@ -2,3 +2,4 @@ this is the first line
  15. this is the second line
  16. this is the third line
  17. this is the forth line
  18. +new line # 代表当前工作区比HEAD多一行

4.2.1、对比两个版本之间的差异

  1. # 先查看历史提交
  2. yanwei@ubuntu:~/git_test$ git reflog
  3. 0a96a0f (HEAD -> master) HEAD@{0}: commit: forth commit
  4. e4fb2aa HEAD@{1}: commit: third commit
  5. 227ecaa HEAD@{2}: reset: moving to 227ecaa
  6. d66bdc0 HEAD@{3}: reset: moving to HEAD^
  7. 227ecaa HEAD@{4}: commit: second commit
  8. d66bdc0 HEAD@{5}: commit (initial): first commit
  9. # 对比second commit与third commit之间的差异
  10. yanwei@ubuntu:~/git_test$ git diff 227ecaa e4fb2aa -- code.txt
  11. diff --git a/code.txt b/code.txt
  12. index 9899a76..01e1274 100644
  13. --- a/code.txt
  14. +++ b/code.txt
  15. @@ -1,2 +1,3 @@
  16. this is the first line
  17. this is the second line
  18. +this is the third line # third commit比second commit多增加了一行内容

5、删除文件

5.1、简单说明

  1. 要从Git中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件。

  2. 如果只是简单地从工作目录中手工删除文件,运行git status时就会在"Changed but not updated"部分。

  3. 如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f(译注:即 force 的首字母),以防误删除文件后丢失修改的内容。

  4. 如果只想删除暂存区中的文件,而不删除工作目录中的文件,可以使用git rm --cached

5.2、具体操作示例

  1. yanwei@ubuntu:~/git_test$ rm code2.txt
  2. yanwei@ubuntu:~/git_test$ git status
  3. 位于分支 master
  4. 尚未暂存以备提交的变更:
  5. (使用 "git add/rm <文件>..." 更新要提交的内容)
  6. (使用 "git checkout -- <文件>..." 丢弃工作区的改动)
  7. 删除: code2.txt
  8. 修改尚未加入提交(使用 "git add" 和/或 "git commit -a"
  9. yanwei@ubuntu:~/git_test$ git rm code2.txt
  10. rm 'code2.txt'
  11. yanwei@ubuntu:~/git_test$ git status
  12. 位于分支 master
  13. 要提交的变更:
  14. (使用 "git reset HEAD <文件>..." 以取消暂存)
  15. 删除: code2.txt

6、移动文件

移动一个文件的命令为:git mv

想对git中的文件改名,可以执行

  1. git mv file1 file2

其实运行git mv相当于运行了下面三条命令:

  1. mv readme.txt readme
  2. git rm readme.txt
  3. git add readme

7、查看提交历史

  1. git log #按提交时间列出所有的更新,最近的更新排在最上面
  2. -p -2 #-p展开显示每次提交的内容差异,-2则仅显示最近的两次更新
  3. --stat #仅显示简要的增改行数统计
  4. --online # 一行显示一个版本
  5. --pretty='format' #定制要显示的记录格式
  6. format的常用选项如下:
  7. %H 提交对象(commit)的完整哈希字串
  8. %h 提交对象的简短哈希字串
  9. %T 树对象(tree)的完整哈希字串
  10. %t 树对象的简短哈希字串
  11. %P 父对象(parent)的完整哈希字串
  12. %p 父对象的简短哈希字串
  13. %an 作者(author)的名字
  14. %ae 作者的电子邮件地址
  15. %ad 作者修订日期(可以用 -date= 选项定制格式)
  16. %ar 作者修订日期,按多久以前的方式显示
  17. %cn 提交者(committer)的名字
  18. %ce 提交者的电子邮件地址
  19. %cd 提交日期
  20. %cr 提交日期,按多久以前的方式显示
  21. %s 提交说明
  22. 需要说明的是,作者指的是实际作出修改的人,提交者为最后一次将些文件提交到的人。
  23. 示例:
  24. git log --pretty=format:"%H - %an, %ar : %s"
  25. git log --oneline
  26. --shortstat 只显示 --stat 中最后的行数修改添加移除统计。
  27. --name-only 仅在提交信息后显示已修改的文件清单。
  28. --name-status 显示新增、修改、删除的文件清单。
  29. --before="2 weeks ago" --after="2012-10-29" --pretty=oneline #日期区间

Git2:Git基本操作的更多相关文章

  1. Git基本操作和GtHub 特殊技巧

    <GitHub 入门与实践> 笔记 了解GitHub Git 和 GitHub 的区别 在Git中,开发者将源代码存入名为"Git仓库"的资料库中,并加以使用.而Git ...

  2. Git学习系列之Git基本操作拉取项目(图文详解)

    前面博客 Git学习系列之Git基本操作推送项目(图文详解) 当然,如果多人协作,或者多个客户端进行修改,那么我们还要拉取(Pull ... )别人推送到在线仓库的内容下来. 大神们是不推荐使用 pu ...

  3. Git学习系列之Git基本操作推送项目(图文详解)

    前面博客 Git学习系列之Git基本操作提交项目(图文详解) 如果完成到一定程度,那么可以推送到远端在线仓库. 推送之前,请确保你已经设置了全局的 user.name 和 user.email, 如果 ...

  4. Git学习系列之Git基本操作提交项目(图文详解)

    前面博客 Git学习系列之Git基本操作克隆项目(图文详解) 然后可以 cd 切换到 LispGentleIntro 目录, 新增或者修改某些文件.这里只是模拟一下操作, 实际情况可能是 使用 Ecl ...

  5. Git学习系列之Git基本操作克隆项目(图文详解)

    不多说,直接上干货! 想必,能进来看我写的这篇博文的朋友,肯定是了解过. 比如SVN的操作吧,最常见的是 检出(Check out ...), 更新 (Update ...), 以及 提交(Commi ...

  6. Git-Runoob:Git 基本操作

    ylbtech-Git-Runoob:Git 基本操作 1.返回顶部 1. Git 基本操作 Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比.本章将对有关创建与提交你的项目快照的命令作 ...

  7. 学习如何运用GitHub网站+出现的问题+Git基本操作总结

    首先介绍一下GitHub网站: github是一个基于git的代码托管平台. GitHub 拥有一个非常鼓励合作的社区氛围.这一方面源于 GitHub 的付费模式:私有项目需要付费,而公共项目完全免费 ...

  8. Git基本操作(Windows下)

    在开始使用Git之前,我觉得是很有必要了解下Git与其他版本控制系统的差异与文件在Git中的三种状态.可以到下面这个网站看下:Git详解之一 Git起步,了解之后,可以对Git的基本操作有一个更清晰的 ...

  9. git基本操作及上传代码到gitHub

    1.基本配置: 配置用户名:git config --global user.name" "; 配置邮箱:git config --global user.email " ...

随机推荐

  1. Vue的computed计算属性是如何实现的

    一个开始 有如下代码,full是一个计算属性,开始,他的值是'hello world',1s后,msg变成了‘I like’, full的值同步变成了'I like world';其原理解析来看一下. ...

  2. PHP的垃圾回收

    PHP使用引用计数和写时拷贝(Copy-On-Write)来管理内存. 引用技术不言自明,写时拷贝工作原来如下: $worker = array("Fred", 35, " ...

  3. C#中周,月,第几周,周开始结束时间de方法总结

    1.c#获取当前时间是本年的第几周,本月的第几周 private static int getWeekNumInMonth(DateTime daytime) { int dayInMonth = d ...

  4. css3学习笔记一

    首先界面是二维的但也可以有三维的效果.先了解浏览器兼容性问题,火狐加前缀(-moz-)IE加(-MF-)谷歌加(-webkit),简单介绍css3的几个属性. 对于背景来说如果是单纯着一种颜色可以会单 ...

  5. POJ 3744 Scout YYF I 概率dp+矩阵快速幂

    题目链接: http://poj.org/problem?id=3744 Scout YYF I Time Limit: 1000MSMemory Limit: 65536K 问题描述 YYF is ...

  6. 【CS231N】1、图像分类

    一.知识点 1. 计算机识别物体面临的困难 视角变化(Viewpoint variation):同一个物体,摄像机可以从多个角度来展现. 大小变化(Scale variation):物体可视的大小通常 ...

  7. 用vue实现省市县三级联动

    我真的没想到这个会困扰到我.最开始以为,不就是直接找个简单的插件就实现了吗,jquery插件找了几个,都没有达到目的. 需求是这样的: 点击input框,弹出一个popup,然后可以滚动选择省,市,县 ...

  8. IE盒模型与W3C盒模型区别

    前两天被人问到,叫我解释一下标准盒模型与IE盒模型,额,当时只能说,知道一点,但是没有深入的去探讨过,所以下来之后就自己写了例子,亲自去验证并且查看了网上的一些资料,现将其整理如下: 一.css盒模型 ...

  9. matlab for 运算的提速

    [1]主要思想:matlab是按列存储,定义s(nums,1)比定义s(1,nums)要快哦                       需要重复query的元素看看能不能再for之前就定义好 经典案 ...

  10. Shell脚本创建Nginx的upstream及location配置文件

    #!/bin/sh ##################################################### # Name: create_nginx_conf.sh # Versi ...