Git2:Git基本操作
一、git全局配置
一般在新的系统上,我们都需要先配置下自己的Git工作环境。配置工作只需进行一次,以后升级时还会沿用现在的配置。如果需要,你随时可以用相同的命令修改已有的配置:
git config --global user.name "Breeze Yan" #配置全局用户名
git config --global user.email "yanw02@mysoft.com.cn" #配置全局用户邮箱
git config --unset --global user.name "Breeze Yan" #取消全局用户名配置
git config --unset --global user.email "breeze.yan@newbiiz.com"
git config --list #查看git配置
git config user.name
git config user.email
二、创建一个版本库
#创建一个目录:
mkdir git_test
#在项目目录下执行如下操作完成初始化操作:
git init
初始化完成以后,在项目目录下会出现一个.git的目录,所有git需要的数据和资源都存放在这个目录中
三、git的常用操作
在工作目录下面的所有文件都无外乎这两种状态:已跟踪或未跟踪。已跟踪的文件指的是已经被纳入版本控制管理的文件。已跟踪的文件,它们的状态可能是已修改,已暂存,或者未更新(未修改)。而未跟踪的文件,它们既没有上次更新的快照,也不在当前的暂存区域,通常情况下它们就是那些在工作目录下新创建的文件。
在对某些文件进行编辑之后,git将这些文件标记为已修改。我们会逐步把这些修改过的文件保存到暂存区域,直到最后一次一次性的提交所有这些位于暂存区域的文件,如此重复。所以使用Git时的文件状态变化周期如图所示
1、版本提交与回退
1.1、版本提交
在git_test目录下创建一个文件code.txt,内容如下:
this is the first line
通过如下命令提交一个版本:
yanwei@ubuntu:~/git_test$ git add code.txt
yanwei@ubuntu:~/git_test$ git commit -m 'first commit'
[master (根提交) d66bdc0] first commit
1 file changed, 1 insertion(+)
create mode 100644 code.txt
使用如下命令可以查看版本记录:
yanwei@ubuntu:~/git_test$ git log
commit d66bdc0189d3663db2feed6193c00751b277e80d (HEAD -> master)
Author: yanwei <yanwei@douyu.tv>
Date: Sun Jul 15 22:35:33 2018 +0800
first commit
1.2、版本回退
再次提交一个版本:
# 在code.txt中再添加一行之后,内容如下:
yanwei@ubuntu:~/git_test$ cat code.txt
this is the first line
this is the second line
# 再次提交:
yanwei@ubuntu:~/git_test$ git add code.txt
yanwei@ubuntu:~/git_test$ git commit -m 'second commit'
[master 227ecaa] second commit
1 file changed, 1 insertion(+)
yanwei@ubuntu:~/git_test$ git log
commit 227ecaa7a5aeca38d392662263f2704c66e1e64a (HEAD -> master)
Author: yanwei <yanwei@douyu.tv>
Date: Sun Jul 15 22:43:49 2018 +0800
second commit
commit d66bdc0189d3663db2feed6193c00751b277e80d
Author: yanwei <yanwei@douyu.tv>
Date: Sun Jul 15 22:35:33 2018 +0800
first commit
现在若想回退到上一个版本,可以使用如下命令:
yanwei@ubuntu:~/git_test$ git reset --hard HEAD^
HEAD 现在位于 d66bdc0 first commit
yanwei@ubuntu:~/git_test$ git log
commit d66bdc0189d3663db2feed6193c00751b277e80d (HEAD -> master)
Author: yanwei <yanwei@douyu.tv>
Date: Sun Jul 15 22:35:33 2018 +0800
first commit
yanwei@ubuntu:~/git_test$ cat code.txt
this is the first line
其中HEAD表示当前最新版本,HEAD^表示当前版本的上一个版本,HEAD^^表示当前版本的上上个版本,也可以使用HEAD~1表示当前版本的前一个版本,HEAD~100表示当前版本的前100版本。
假如这个时候,又需要回到second commit版本,可以使用如下命令:
# 通过如下命令找到操作记录:
yanwei@ubuntu:~/git_test$ git reflog
d66bdc0 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
227ecaa HEAD@{1}: commit: second commit
d66bdc0 (HEAD -> master) HEAD@{2}: commit (initial): first commit
# 回退到second commit:
yanwei@ubuntu:~/git_test$ git reset --hard 227ecaa
HEAD 现在位于 227ecaa second commit
yanwei@ubuntu:~/git_test$ git log
commit 227ecaa7a5aeca38d392662263f2704c66e1e64a (HEAD -> master)
Author: yanwei <yanwei@douyu.tv>
Date: Sun Jul 15 22:43:49 2018 +0800
second commit
commit d66bdc0189d3663db2feed6193c00751b277e80d
Author: yanwei <yanwei@douyu.tv>
Date: Sun Jul 15 22:35:33 2018 +0800
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,内容如下:
yanwei@ubuntu:~/git_test$ cat code2.txt
the code2 first line
然后再次编辑code.txt,在其中加入一行,编辑后内容如下:
yanwei@ubuntu:~/git_test$ cat code.txt
this is the first line
this is the second line
this is the third line
使用git status查看当前工作树的状态:
yanwei@ubuntu:~/git_test$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: code.txt
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
code2.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
上面提示code.txt被修改,而code2.txt没有被跟踪。
我们将code.txt和code2.txt加入到暂存区,然后再次查看工作树状态:
yanwei@ubuntu:~/git_test$ git add code.txt
yanwei@ubuntu:~/git_test$ git add code2.txt
yanwei@ubuntu:~/git_test$ git status
位于分支 master
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: code.txt
新文件: code2.txt
然后,执行git commit就可以一次性把暂存区的所有修改提交到分支创建一个版本:
yanwei@ubuntu:~/git_test$ git commit -m 'third commit'
[master e4fb2aa] third commit
2 files changed, 2 insertions(+)
create mode 100644 code2.txt
yanwei@ubuntu:~/git_test$ git log
commit e4fb2aa04ca8aa3b6a32ef46a69fa5f97ae625fa (HEAD -> master)
Author: yanwei <yanwei@douyu.tv>
Date: Sun Jul 15 23:16:56 2018 +0800
third commit
commit 227ecaa7a5aeca38d392662263f2704c66e1e64a
Author: yanwei <yanwei@douyu.tv>
Date: Sun Jul 15 22:43:49 2018 +0800
second commit
commit d66bdc0189d3663db2feed6193c00751b277e80d
Author: yanwei <yanwei@douyu.tv>
Date: Sun Jul 15 22:35:33 2018 +0800
first commit
一旦提交后,在没有再次对工作区作修改之前,那么工作区就是“干净”的:
yanwei@ubuntu:~/git_test$ git status
位于分支 master
无文件要提交,干净的工作区
现在版本库变成了如下模样:

3、管理文件的修改
3.1、修改文件
在code.txt中再次添加一行内容,修改后的内容如下:
yanwei@ubuntu:~/git_test$ cat code.txt
this is the first line
this is the second line
this is the third line
this is the forth line
然后使用git add命令将其添加到暂存区
yanwei@ubuntu:~/git_test$ git add code.txt
yanwei@ubuntu:~/git_test$ git status
位于分支 master
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: code.txt
再次修改该文件,添加一行内容,修改后的内容如下:
yanwei@ubuntu:~/git_test$ cat code.txt
this is the first line
this is the second line
this is the third line
this is the forth line
this is the fifth line
通过git commit提交一个版本,并使用git status查看,发现第二次修改code.txt内容之后,并没有将其添加到暂存区,所以创建新版本的时候,并没有被提交:
yanwei@ubuntu:~/git_test$ git status
位于分支 master
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: code.txt
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: code.txt
yanwei@ubuntu:~/git_test$ git commit -m 'forth commit'
[master 0a96a0f] forth commit
1 file changed, 1 insertion(+)
yanwei@ubuntu:~/git_test$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: code.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
3.2、撤销修改
3.2.1、丢弃工作区的改动
可以使用git checkout -- <文件>来丢弃工作区的改动:
# 使用如下指令来撤销我们第二次的修改
yanwei@ubuntu:~/git_test$ git checkout -- code.txt
yanwei@ubuntu:~/git_test$ git status
位于分支 master
无文件要提交,干净的工作
# 再次查看code.txt文件,发现最后一次修改已被丢弃:
yanwei@ubuntu:~/git_test$ cat code.txt
this is the first line
this is the second line
this is the third line
this is the forth line
3.2.2、撤销暂存区的修改
我们再次编辑code.txt,添加一行内容,并添加到暂存区:
yanwei@ubuntu:~/git_test$ cat code.txt
this is the first line
this is the second line
this is the third line
this is the forth line
new line
yanwei@ubuntu:~/git_test$ git add code.txt
yanwei@ubuntu:~/git_test$ git status
位于分支 master
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: code.txt
通过如下命令,将暂存区的修改撤销,重新放回工作区:
yanwei@ubuntu:~/git_test$ git reset HEAD code.txt
重置后取消暂存的变更:
M code.txt
yanwei@ubuntu:~/git_test$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: code.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
最后可以通过上面的丢弃工作区的改动,来彻底放弃对文件的修改。
3.3.3、小结
- 当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
- 当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了上面那种情形,然后按照上面的情形操作
- 已经提交了不合适的修改到版本库时,想要撤销本次提交,可直接回退版本库
4、文件差异对比
4.1、差异对比常用指令
git diff #查看工作目录中当前文件和暂存区域快照之间的差异
git diff --cached #查看暂存文件与上次提交时的快照之间的差异,与git diff --staged相同
git diff HEAD #查看在最后一次提交后所有变更
git diff v1.6 -- filename #从一个特定点开始文件的修改情况
git diff v1.6 v1.7 --stat #两次提交的差异比对
git diff master...branchname #在合并某分支前查看变更内容
git diff --name-only v1.6 HEAD #列出v1.6版本到当前最新版本的差异文件,只显示文件,不显示差异内容
4.2、具体操作
4.2.1、对比当前工作区与HEAD版本的修改差异
# 修改当前工作区的code.txt,内容如下:
yanwei@ubuntu:~/git_test$ cat code.txt
this is the first line
this is the second line
this is the third line
this is the forth line
new line
# 差异对比
yanwei@ubuntu:~/git_test$ git diff HEAD -- code.txt
diff --git a/code.txt b/code.txt
index 66f9219..9bc8cf3 100644
--- a/code.txt # ---代表HEAD
+++ b/code.txt # +++代表当前工作区的文件
@@ -2,3 +2,4 @@ this is the first line
this is the second line
this is the third line
this is the forth line
+new line # 代表当前工作区比HEAD多一行
4.2.1、对比两个版本之间的差异
# 先查看历史提交
yanwei@ubuntu:~/git_test$ git reflog
0a96a0f (HEAD -> master) HEAD@{0}: commit: forth commit
e4fb2aa HEAD@{1}: commit: third commit
227ecaa HEAD@{2}: reset: moving to 227ecaa
d66bdc0 HEAD@{3}: reset: moving to HEAD^
227ecaa HEAD@{4}: commit: second commit
d66bdc0 HEAD@{5}: commit (initial): first commit
# 对比second commit与third commit之间的差异
yanwei@ubuntu:~/git_test$ git diff 227ecaa e4fb2aa -- code.txt
diff --git a/code.txt b/code.txt
index 9899a76..01e1274 100644
--- a/code.txt
+++ b/code.txt
@@ -1,2 +1,3 @@
this is the first line
this is the second line
+this is the third line # third commit比second commit多增加了一行内容
5、删除文件
5.1、简单说明
要从Git中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件。
如果只是简单地从工作目录中手工删除文件,运行git status时就会在"Changed but not updated"部分。
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f(译注:即 force 的首字母),以防误删除文件后丢失修改的内容。
如果只想删除暂存区中的文件,而不删除工作目录中的文件,可以使用git rm --cached
5.2、具体操作示例
yanwei@ubuntu:~/git_test$ rm code2.txt
yanwei@ubuntu:~/git_test$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add/rm <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
删除: code2.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
yanwei@ubuntu:~/git_test$ git rm code2.txt
rm 'code2.txt'
yanwei@ubuntu:~/git_test$ git status
位于分支 master
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
删除: code2.txt
6、移动文件
移动一个文件的命令为:git mv
想对git中的文件改名,可以执行
git mv file1 file2
其实运行git mv相当于运行了下面三条命令:
mv readme.txt readme
git rm readme.txt
git add readme
7、查看提交历史
git log #按提交时间列出所有的更新,最近的更新排在最上面
-p -2 #-p展开显示每次提交的内容差异,-2则仅显示最近的两次更新
--stat #仅显示简要的增改行数统计
--online # 一行显示一个版本
--pretty='format' #定制要显示的记录格式
format的常用选项如下:
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
需要说明的是,作者指的是实际作出修改的人,提交者为最后一次将些文件提交到的人。
示例:
git log --pretty=format:"%H - %an, %ar : %s"
git log --oneline
--shortstat 只显示 --stat 中最后的行数修改添加移除统计。
--name-only 仅在提交信息后显示已修改的文件清单。
--name-status 显示新增、修改、删除的文件清单。
--before="2 weeks ago" --after="2012-10-29" --pretty=oneline #日期区间
Git2:Git基本操作的更多相关文章
- Git基本操作和GtHub 特殊技巧
<GitHub 入门与实践> 笔记 了解GitHub Git 和 GitHub 的区别 在Git中,开发者将源代码存入名为"Git仓库"的资料库中,并加以使用.而Git ...
- Git学习系列之Git基本操作拉取项目(图文详解)
前面博客 Git学习系列之Git基本操作推送项目(图文详解) 当然,如果多人协作,或者多个客户端进行修改,那么我们还要拉取(Pull ... )别人推送到在线仓库的内容下来. 大神们是不推荐使用 pu ...
- Git学习系列之Git基本操作推送项目(图文详解)
前面博客 Git学习系列之Git基本操作提交项目(图文详解) 如果完成到一定程度,那么可以推送到远端在线仓库. 推送之前,请确保你已经设置了全局的 user.name 和 user.email, 如果 ...
- Git学习系列之Git基本操作提交项目(图文详解)
前面博客 Git学习系列之Git基本操作克隆项目(图文详解) 然后可以 cd 切换到 LispGentleIntro 目录, 新增或者修改某些文件.这里只是模拟一下操作, 实际情况可能是 使用 Ecl ...
- Git学习系列之Git基本操作克隆项目(图文详解)
不多说,直接上干货! 想必,能进来看我写的这篇博文的朋友,肯定是了解过. 比如SVN的操作吧,最常见的是 检出(Check out ...), 更新 (Update ...), 以及 提交(Commi ...
- Git-Runoob:Git 基本操作
ylbtech-Git-Runoob:Git 基本操作 1.返回顶部 1. Git 基本操作 Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比.本章将对有关创建与提交你的项目快照的命令作 ...
- 学习如何运用GitHub网站+出现的问题+Git基本操作总结
首先介绍一下GitHub网站: github是一个基于git的代码托管平台. GitHub 拥有一个非常鼓励合作的社区氛围.这一方面源于 GitHub 的付费模式:私有项目需要付费,而公共项目完全免费 ...
- Git基本操作(Windows下)
在开始使用Git之前,我觉得是很有必要了解下Git与其他版本控制系统的差异与文件在Git中的三种状态.可以到下面这个网站看下:Git详解之一 Git起步,了解之后,可以对Git的基本操作有一个更清晰的 ...
- git基本操作及上传代码到gitHub
1.基本配置: 配置用户名:git config --global user.name" "; 配置邮箱:git config --global user.email " ...
随机推荐
- centos下配置gitosis服务器
背景: 一台windows电脑,Xshell可以登录centos服务器(centos7.2 64位,有root用户权限),windows电脑已经安装好git和tortoies 在windows下下载和 ...
- 敏捷开发与XP实践
北京电子科技学院(BESTI) 实 验 报 告 课程: Java 班级:1352 姓名:黄伟业 学号:20135215 成绩: ...
- “私人助手”Beta版使用说明
私人助手(Beta)版使用说明 私人助手这款软件是通过添加事件提醒功能,让用户能在正确的时间做正确的事情,使得工作变得更有效率,而这款软件的特色在于提醒模式的添加,用户可以通过震动.铃声提醒,我们的特 ...
- sqlDataAdapter和SqlCommand的区别
因为DataSet是离线的,所以SqlDataAdapter这个对象是连接DataSet和数据库的桥梁,所有对DataSet的操作(填充,更新等)都要通过他 ado.net数据访问有两种方式: 1.离 ...
- 05_Java基础语法_第5天(方法)_讲义
今日内容介绍 1.方法基础知识 2.方法高级内容 3.方法案例 01方法的概述 * A: 为什么要有方法 * 提高代码的复用性 * B: 什么是方法 * 完成特定功能的代码块. 02方法的定义格式 * ...
- C/C++ 打印文件名、行号、函数名的方法
转自:http://zhidao.baidu.com/link?url=JLCaxBAXLJVcx_8jsyJVF92E_bZjo4ONJ5Ab-HGlNBc1dfzcAyFAIygwP1qr18aa ...
- 继《在Windows下编译扩展OpenCV 3.1.0 + opencv_contrib》修订
在之前的<在Windows下编译扩展OpenCV 3.1.0 + opencv_contrib>中有些问题,后来由于时间不是很充足,故现在对其中的问题进行完善,如下所示对红色框框中的相应的 ...
- Beta阶段 敏捷冲刺day1
一.提供当天站立式会议照片一张: 二. 每个人的工作 (有work item 的ID) (1) 昨天已完成的工作: (2) 今天计划完成的工作: 今天大家一起讨论了一下之后几天的任务,以及如何对网页进 ...
- [转帖]通俗解释 AWS 云服务每个组件的作用
你有听说过 ContainerCache,ElastiCast 和 QR72 这些 AWS 的新服务吗? 没有就对了,这些都是我编的:) 不过,AWS 有 50 多个服务,从名称也不能看出这些服务是做 ...
- SQLSERVER STANDARD 版本不支持内存数据库
1. 自己负责的一个环境 安装了 SQLSERVER2014 的 标准版 发现有问题. 恢复了一个带内存数据库的性能测试库之后报错. 报错信息很不明了,但是 查了半天发现必须升级企业版才可以... 还 ...