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 " ...
随机推荐
- Redux和React-Redux的实现(一):Redux的实现和context
react使用redux做状态管理,实现多个组件之间的信息共享,解决了父子组件.兄弟组件之间的复杂通信问题.vue有vuex,总之是一种flux的思想.react提供了react-redux这个库,一 ...
- 暑假作业app博客
一.光照传感器 界面 简介 运用了传感器类,通过手机的感应区根据当时的光照强度显示出数据. 核心代码 protected void onCreate(Bundle savedInstanceState ...
- WebGL学习笔记五
本章主要是对纹理的进一步讲解,我们很多时候需要将现实中已有 的图片在网页中展示出来而不是去创造图片,通过纹理 我们可以将光栅化的图形和图片纹理形成映射并且将图片在图形 中显示出来.基本过程与前几章一致 ...
- B-tree&B+tree&数据库索引原理
B-tree&B+tree:https://www.cnblogs.com/vianzhang/p/7922426.html 数据库索引原理:https://www.cnblogs.com/a ...
- week2-作业2
项目地址:https://git.coding.net/Rainoob/calculate.git ·1.需求分析:程序可以根据输入的参数n随机产生n道四则运算计算题,每个数字在0-100之间.运算符 ...
- ESXi服务器遇到 IPMI_SI_DRV 的解决, 感谢原作者 以及今天 解决问题.
ESXI 服务器断电之后一直 LOADING MODULE IPMI_SI_DRV 的解决办法 今日家中忽然断电,之后 ESXi 服务器就一直疯狂转,连接显示器,发现原来一直没有启动.停留在ESXi ...
- poj 2299 Ultra-QuickSort(树状数组求逆序数)
链接:http://poj.org/problem?id=2299 题意:给出n个数,求将这n个数从小到大排序,求使用快排的需要交换的次数. 分析:由快排的性质很容易发现,只需要求每个数的逆序数累加起 ...
- (2)YARN的工作流程
Writing YARN Applications 文档中的启动过程: Application submission client向Yarn ResourceManager提交一个Applicatio ...
- BZOJ1226 SDOI2009学校食堂(状压dp)
由于Bi<=7,考虑状压. 如果考虑前i个位置的话,状态里需要压入前7个人后7个人,显然是跑不动的. 那么改成考虑前i个人.于是设f[i][j][k]表示前i个人都已吃完饭,i+1后面7个人的吃 ...
- Python - 静态函数(staticmethod), 类函数(classmethod), 成员函数 区别(完全解析)
原文地址:http://blog.csdn.net/caroline_wendy/article/details/23383995 还有一篇:http://blog.csdn.net/carolzha ...