Git学习笔记

#####################################################

qq:1218761836

qq群:150181442

E-mail:wangxing0122@hotmail.com

#####################################################

目录

Git. 2

1.1 初次运行前的配置... 2

1.2 创建版本库... 3

0.3 git提交文件... 4

1.4 检查当前文件状态... 4

1.5 跟踪新文件... 5

1.6 忽略文件... 6

1.7 跳过使用暂存区域... 9

1.8 移除文件... 9

1.9 移动文件... 10

2.0 Git 查看历史提交信息... 11

2.1 git撤销操作... 15

git支持的协议

git

git://

SSH+git

ssh://

Http+git

http://

Https+git

https://

File(本地)

File://

Git

1.1 初次运行前的配置

安装好git之后,需要配置git的环境,只需要配置一次。

Git自带有一个git config 的工具来帮助设置控制git外观和和行为的配置变量。这些变量存储在三个不同的位置:

1 /etc/gitconfig 文件:包含系统上每一个用户及他们仓库的通用配置。如果使用带有—system选项的git config时,它会从此文件读写配置变量。

2 ~/.gitconfig 或~/.config/git/config 文件:只针对当前用户。可以传递—global 选项让git读写此文件。

3 当前使用仓库的git目录中的config文件(就是.git/config):针对该仓库

用户信息

Git 在第一次提交的时候需要这些信息,否则提交会失败,每一个git提交都会使用这些信息,并且写入到每一次提交中,不可更改:

git config --global user.name "wang xingxing"

git config --global user.email wangxing0122@hotmail.com

如果使用—global选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情,git都会使用那么信息,当你针对特定项目使用不同的用户名称与你邮件地址时,可以在那个项目下运行没有—global选项的命令来配置

文本编辑器

git config --global core.editor emacs #使默认的编辑器为emacs或者vim

检查配置信息

在根目录下运行获取的信息

[root@wx-a ~]# git config --list

user.name=wang xingxing

user.email=wangxing0122@hotmail.com

core.editor=vim

在版本库中运行获取的信息

[root@wx-a sadoc]# git config --list

user.name=wang xingxing

user.email=wangxing0122@hotmail.com

core.editor=vim

core.repositoryformatversion=0

core.filemode=true

core.bare=false

core.logallrefupdates=true

看到重复的变量名,因为git会从不同的文件中读取同一个配置(例如:/etc/gitconfig与~/.gitconfig)这种情况下git会找到每一个变量的最后一个配置

查看某一个变量信息

[root@wx-a sadoc]# git config user.name

wang xingxing

获取git命令帮助

git –help

man git

git –help

1.2 创建版本库

[root@wx-a /]# mkdir /project/git/sadoc –p

[root@wx-a /]# cd /project/git/sadoc/

[root@wx-a sadoc]# git init

Initialized empty Git repository in /project/git/sadoc/.git/

[root@wx-a sadoc]# ls -a

. .. .git

提示创建了一个空的版本库在/project/git/sadoc/目录下,git init创建一个名为.git 的子目录,这个子目录含有你初始化的git仓库中所有的必须文件(跟踪管理版本库,轻易不要手动修改.git目录中的文件),这些文件是git仓库的骨干。但是,我只做了一个初始化的操作,项目里的文件还没有被跟踪,

.git 中文件都有哪些

[root@wx-a sadoc]# tree -a

.

└── .git

├── branches

├── config

├── description

├── HEAD

├── hooks

│   ├── applypatch-msg.sample

│   ├── commit-msg.sample

│   ├── post-commit.sample

│   ├── post-receive.sample

│   ├── post-update.sample

│   ├── pre-applypatch.sample

│   ├── pre-commit.sample

│   ├── prepare-commit-msg.sample

│   ├── pre-rebase.sample

│   └── update.sample

├── info

│   └── exclude

├── objects

│   ├── info

│   └── pack

└── refs

├── heads

└── tags

10 directories, 14 files

0.3 git提交文件

为版本库添加文件或者目录

在版本库的目录下创建文件或者目录

[root@wx-a sadoc]# mkdir abcd

[root@wx-a sadoc]# touch test

[root@wx-a sadoc]# git add test abcd #添加到版本库中

[root@wx-a sadoc]# git commit –m ‘initial project version’ #提交成功

[master fc75b2e] initial project version

0 files changed, 0 insertions(+), 0 deletions(-)

create mode 100644 test

git 记录每次更新到仓库

在git的版本库中对文件做些修改,在完成目标之后,提交更新到仓库。

工作目录下的每一个文件都不外乎两种状态:已跟踪或未跟踪。已跟踪的文件是指那些被纳入版本控制的文件,在上一次快照中有他们的记录,在工作一段时间后,他们的状态可能处于未修改,已修改或已放入暂存区,工作目录中除已跟踪文件以外的所有其他文件都属于未跟踪文件,他们既不存在于上次快照的记录中,也没有放入暂存区。初次克隆某个仓库的时候,工作目录的所有文件都属于已跟踪文件,并处于未修改状态。

编辑过某些文件之后,由于上次提交后你对他们做了修改,git将他们标记为已修改文件。我们逐步将这些修改过的文件放入暂存区,然后提交所有暂存了的修改,如此反复,所以使用git时文件的生命周期如下:

1.4 检查当前文件状态

要查看哪些文件处于什么状态,可以用git status 命令。如果在克隆仓库后立即使用使用此命令,会看到类似这样的输出:

[root@wx-a sadoc]# git status

# On branch master

nothing to commit (working directory clean)

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

创建一个README文件。使用git status 命令,查看一下文件状态

[root@wx-a sadoc]# echo “my project” > readme

[root@wx-a sadoc]# git status

# On branch master

# 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)

查看到这个文件还没有提交到版本库中,也没有添加到版本库中

1.5 跟踪新文件

[root@wx-a sadoc]# git add readme

[root@wx-a sadoc]# git status

# On branch master

# Changes to be committed:

# (use “git reset HEAD <file>…” to unstage)

#

# new file: readme

#

提示这个文件已经放在暂存区,而没有被提交

修改暂存区文件

[root@wx-a sadoc]# vim readme

my project

abcdesss

[root@wx-a sadoc]# git status

# On branch master

# Changes to be committed:

# (use “git reset HEAD <file>…” to unstage)

#

# new file: readme

#

# Changed but not updated:

# (use “git add <file>…” to update what will be committed)

# (use “git checkout -- <file>…” to discard changes in working directory)

#

# modified: readme

#

此时暂存区的文件已经修改,需要重新git add 一下

[root@wx-a sadoc]# git status

# On branch master

# Changes to be committed:

# (use “git reset HEAD <file>…” to unstage)

#

# new file: readme

#

状态预览

[root@wx-a sadoc]# git status –s

A readme

或者

[root@wx-a sadoc]# git status –short

A readme

新添加的未跟踪文件前面有?? 标记

新添加到暂存区的文件前面有A标记

修改过的文件前面有M标记

1.6 忽略文件

一般我们总会有些文件无需纳入git的管理,也不希望他们总出现未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等,在这种情况下,我们可以创建一个名为.gitignore 的文件,列出要忽略的文件模式,例如:

cat .gitignore

*.[oa]

*~

第一行告诉git忽略所有以.o或.a结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的。

第二行告诉git忽略所有以波浪符(~)结尾的文件,许多文件编辑软件(比如emacs)都用这样的文件名保存副本。此外还可以忽略log,tmp或者pid目录,以及自动生成的文档等等。要养成一开始就设置好.gittignore文件的习惯,以免将来误提交这类无用的文件

文件.gittignore 的格式规范如下:

所有空行或者以#开头的行都会被git忽略

可以使用标准的glob模式匹配

匹配模式可以以(/)开头防止递归

匹配模式可以以(/)结尾指定目录

要忽略指定模式以外的文件或目录,可以再模式前加上惊叹号(!)取反。

所谓的golb模式是指shell所使用的简化了的正则表达式。

(*)号匹配零个或多个任意字符;[abc]匹配任何一个列在括号中的字符,(?)匹配任意字符;

例子:

# no .a files

*.a

# but do track lib.a, even though you’re ignoring .a files above

!lib.a

# only ignore the TODO file in the current directory, not subdir/TODO

/TODO

# ignore all files in the build/ directory

build/

# ignore doc/notes.txt, but not doc/server/arch.txt

doc/*.txt

# ignore all .pdf files in the doc/ directory

doc/**/*.pdf

查看已暂存和未暂存的修改

[root@wx-a sadoc]# git status

# On branch master

# Changes to be committed:

# (use “git reset HEAD <file>…” to unstage)

#

# new file: readme

#

# Untracked files:

# (use “git add <file>…” to include in what will be committed)

#

# test-1

要查看尚未暂存的文件更新哪部分,直接输入git diff

[root@wx-a sadoc]# git diff

diff –git a/test-1 b/test-1

index e69de29..8e2baef 100644

--- a/test-1

+++ b/test-1

@@ -0,0 +1 @@

+test-1

[root@wx-a sadoc]#

若要查看已暂存的将要添加到下次提交的内容,可以用git diff –cached命令(git1.6.1及更高版本还允许使用git diff –staged,效果是相同的,但更好记些)

[root@wx-a sadoc]# git diff –cached

diff –git a/readme b/readme

new file mode 100644

index 0000000..ba82621

--- /dev/null

+++ b/readme

@@ -0,0 +1,2 @@

+my project

+abcdesss

diff –git a/test-1 b/test-1

new file mode 100644

index 0000000..e69de29

# git diff本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有的改动,所以有时间一下子暂存了所有更新的文件后,运行git diff后却什么也没有,就是这个原因。

Git diff的插件版本

可以使用git difftool –tool-help 命令系统支持哪些git diff插件。

提交更新

现在的暂存区域已经准备妥当可以提交了,在此之前,请一定要确认还有什么修改过的或新建的文件还没有git add过,否则提交的时候不会记录这些还没暂存起来的变化,这些修改过的文件只保留在本地磁盘,所以,每次准备提交前,先用git status看下,是不是都已暂存起来了,然后再运行提交命令 git commit

[root@wx-a sadoc]# git commit

这种方式会启动文本编辑器以便输入本次提交的说明,默认会启用shell的环境变量$EDTTOR所指定的软件,一般都是vim或emacs。当然也可以按照起步介绍的方式,使用git config –global core.deitor 命令设置喜欢的编辑软件)

编辑器会显示类似下面的文本信息

# Please enter the commit message for your changes. Lines starting

# with ‘#’ will be ignored, and an empty message aborts the commit.

# On branch master

# Changes to be committed:

# (use “git reset HEAD <file>…” to unstage)

#

# new file: readme

# new file: test-1

#

可以看到,默认提交的消息包含最后一次运行git status的输出,放在注释行里,另外开头还有一空行,供你输入提交说明,也可以去修改注释行,不过留着也没关系。

也可以再commit 命令后添加-m选项,将提交的信息与命令放在同一行,如下所示:

[root@wx-a sadoc]# git commit –m “test –version 2”

[master bec67e0] test –version 2

1 files changed, 3 insertions(+), 0 deletions(-)

create mode 100644 readme

create mode 100644 test-1

已经完成了一个提交,可以看到,提交之后告诉我,当前是在那个分支(master)。以及本次提交的完整SHA-1 校验和

bec67e0,以及在本次提交中,有多少文件修订过,多少行添加和删改过。

提交的时的记录是放在暂存区域的快照,任何还未暂存的仍然保持已修改状态,可以再下次提交时纳入版本管理,每一次运行提交操作,都是对你项目做一次快照,以后可以回到这个状态,或者进行比较。

1.7 跳过使用暂存区域

尽管使用暂存区域的方式可以静心准备要提交的细节,但有的时候略显繁琐,git提供了一个跳过使用暂存区域的方式,只要在提交的时候,给git commit加上-a 选项,git就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add 步骤:

[root@wx-a sadoc]# git status

# On branch master

# Changes to be committed:

# (use "git reset HEAD <file>..." to unstage)

#

# new file: abc-add

# new file: test-add

#

# Changed but not updated:

# (use "git add <file>..." to update what will be committed)

# (use "git checkout -- <file>..." to discard changes in working directory)

#

# modified: abc-add

# modified: test-add

[root@wx-a sadoc]# git commit -a -m 'added new benchmarks'

[master 82276f4] added new benchmarks

2 files changed, 2 insertions(+), 0 deletions(-)

create mode 100644 abc-add

create mode 100644 test-add

1.8 移除文件

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

如果只是简单的从工作目录中手工删除文件,运行 git status 时就会在changes not staged for commit部分(也就是未暂存清单)看到。

[root@wx-a sadoc]# ll

total 24

drwxr-xr-x. 2 root root 4096 Sep 30 01:07 aa

-rw-r–r--. 1 root root 0 Sep 30 01:07 abc

-rw-r–r--. 1 root root 9 Oct 2 06:00 abc-add

drwxr-xr-x. 2 root root 4096 Oct 1 22:53 abcd

-rw-r–r--. 1 root root 20 Oct 1 23:37 readme

-rw-r–r--. 1 root root 0 Oct 1 22:53 test

-rw-r–r--. 1 root root 7 Oct 2 04:49 test-1

-rw-r–r--. 1 root root 19 Oct 2 06:00 test-add

[root@wx-a sadoc]# rm –rf test-add

[root@wx-a sadoc]# git status

# On branch master

# Changed but not updated:

# (use “git add/rm <file>…” to update what will be committed)

# (use “git checkout -- <file>…” to discard changes in working directory)

#

# deleted: test-add

#

no changes added to commit (use “git add” and/or “git commit –a”)

此时需要运行 git rm记录此次移除文件的操作

[root@wx-a sadoc]# git rm test-add

rm ‘test-add’

[root@wx-a sadoc]# git status

# On branch master

# Changes to be committed:

# (use “git reset HEAD <file>…” to unstage)

#

# deleted: test-add

#

下一次提交时,该文件就不再纳入版本管理了,如果删除之前修改并且已经放到暂存区域的话,则必须要用强制删除选项-f,这是一种安全特性,用于防止误删还没有添加到快照的数据,这样的数据不能被git恢复。

另外一种情况是,我们想把文件从git仓库移除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,你想让文件保留在磁盘,但是并不想让git继续跟踪,当你忘记添加.gitignore 文件;不小心把一个很大的的日志文件或一堆.a 这样编译生成文件添加到暂存区时,这一做法尤其有用,为达到这一目的,使用—cached选项:

git rm –cached README

git rm 命令后面可以列出文件或者目录的名字,也可以使用glob模式。

Git rm log/\*.log

注意到这个星号* 之前的反斜杠\,因为git有它自己的文件模式扩展匹配方式,所以我们不用shell来帮忙,此命令删除log/ 目录下扩展名为.log 的所有文件。类似的比如:

git rm \*~

该命令为删除以~ 结尾的所有文件

1.9 移动文件

不像其他的vcs系统,git并不显式跟踪文件移动操作。如果在git中重命名了某个文件,仓库中存储的元数据并不会体现出这是一次改名操作。不过git非常聪明,它会推断出究竟发生了什么。

既然如此,当你看到git的mv 命令时会困惑不已。要在git中对文件改名,可以这么做:

git mv file_form file_to

它会恰如预期般正常工作,实际上,即便此时查看状态信息,也会明白无误地看到关于命名操作的说明:

[root@wx-a sadoc]# git mv readme readme.md

[root@wx-a sadoc]# git status

# On branch master

# Changes to be committed:

# (use "git reset HEAD <file>..." to unstage)

#

# renamed: readme -> readme.md

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

mv readme readme.md

git rm readme

git add readme

如此分开操作,git也会意识到这是一次改名,所以不管何种方式结果都一样,两者唯一的区别是,mv是一条命令而另一种需要三条命令,直接用git mv轻便的多,不过有时间用其他工具批处理改名的话,要记得提交前删除老的文件名,再添加新的文件名。

2.0 Git 查看历史提交信息

在提交若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史,完成这个任务最简单而又有效的工具是git log命令。

[root@wx-a sadoc]# git log

commit 82276f4036681b5f4686346e13e3f79fba475214

Author: wang xingxing <wangxing0122@hotmail.com>

Date: Fri Oct 2 06:01:11 2015 +0800

added new benchmarks

commit bec67e0ba02e81b2b9d4ddd1c65791ecde16c8d0

Author: wang xingxing <wangxing0122@hotmail.com>

Date: Fri Oct 2 05:20:47 2015 +0800

test –version 2

commit fc75b2e8cdd381516dad6acb6c04bd8da52b89db

Author: wang xingxing <wangxing0122@hotmail.com>

Date: Thu Oct 1 22:54:21 2015 +0800

initial project version

commit e14c816c6fa318a4ac56599b1b781f1adbaf2781

Author: root <root@wx-a.localdomain>

Date: Wed Sep 30 01:09:45 2015 +0800

in aa abc ok

默认不用任何参数的话,git log会按提交时间列出所有的更新,最近的更新排在最上面。正如你所看到的,这个命令会列出每个提交的SHA-1 校验和、作者名字和电子邮件地址、提交时间以及提交说明。

Git log有许多选项可以帮助你搜寻你所要找的提交,最常用的一些命令:

一个常用的选项是-p,用来显示每次提交的内容差异,你也可以加上-2来仅显示最近两次提交:

[root@wx-a sadoc]# git log –p -2

commit 82276f4036681b5f4686346e13e3f79fba475214

Author: wang xingxing <wangxing0122@hotmail.com>

Date: Fri Oct 2 06:01:11 2015 +0800

added new benchmarks

diff –git a/abc-add b/abc-add

new file mode 100644

index 0000000..2d91f20

--- /dev/null

+++ b/abc-add

@@ -0,0 +1 @@

+test add

diff –git a/test-add b/test-add

new file mode 100644

index 0000000..8de9442

--- /dev/null

+++ b/test-add

@@ -0,0 +1 @@

+test is in add –a

commit bec67e0ba02e81b2b9d4ddd1c65791ecde16c8d0

Author: wang xingxing <wangxing0122@hotmail.com>

Date: Fri Oct 2 05:20:47 2015 +0800

test –version 2

diff –git a/readme b/readme

new file mode 100644

index 0000000..ba82621

…………………………………………………….

该选项除了显示基本信息之外,还在附带了每次commit的变化,当进行代码审查,或者快速浏览某个搭档提交的commit所带来的变化的时候,这个参数就费用有用了,你也可以为git log附带一系列的总结性选项。比如说你想看到每次提交的简略的统计信息,你可以使用—stat 选项

git log –stat

另外一个常用的选项是—pretty,这个选项可以指定使用不同于默认格式的方式展示提交历史,这个选项有一些内建的子选项可以配合使用,比如用oneline将每个提交放在一行显示,查看的提交数很大时非常有用,另外还有short,full和fuller可以用,展示的信息或多或少有些不同,

git log –pretty=oneline

但最有意思的是format,可以定制要显示的记录格式,这样的输出对后期提取分析格外有用,因为你知道输出的格式不会随着git的更新而发生改变

[root@wx-a sadoc]# git log –pretty=format:”%h - %an, %ar : %s”

82276f4 – wang xingxing, 12 hours ago : added new benchmarks

bec67e0 – wang xingxing, 13 hours ago : test –version 2

fc75b2e – wang xingxing, 19 hours ago : initial project version

e14c816 – root, 3 days ago : in aa abc ok

选项

说明

%H

提交对象(commit)的完整哈希字串

%h

提交对象的简短哈希字串

%T

树对象(tree)的完整哈希字串

%t

树对象的简短哈希字串

%P

父对象(parent)的完整哈希字串

%p

父对象的简短哈希字串

%an

作者(author)的名字

%ae

作者的电子邮件地址

%ad

作者修订日期(可以用 –date= 选项定制格式)

%ar

作者修订日期,按多久以前的方式显示

%cn

提交者(committer)的名字

%ce

提交者的电子邮件地址

%cd

提交日期

%cr

提交日期,按多久以前的方式显示

%s

提交说明

作者和提交者之间究竟的区别:其实作者指的是实际做出修改的人,提交者指的是最后将此工作成果提交到仓库的人,所以,当你为某个项目发布补丁,然后某个核心成员将你的补丁并入项目时,你就是作者,而那个核心成员就是提交者。

当oneline或format与另一个log 选项—graph结合使用时尤其有用,这个选项添加一些ASCII字符串来形象地展示你的分支、合并历史:

[root@wx-a sadoc]# git log –pretty=format:”%h %s” –graph

* 82276f4 added new benchmarks

* bec67e0 test –version 2

* fc75b2e initial project version

* e14c816 in aa abc ok

以上只是简单介绍了一些git log命令支持的选项,表2列出我们目前涉及到和没涉及到的选项,已经他们是如何影响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还有许多非常实用的限制输出长度的选项,也就是只输出部分提交信息.之前你已经看到过-2了,它只显示最近两条提交,实际上,这是-<n>选项的写法,期中的n可以是任何整数,表示仅显示最近若干条提交。不过实践中我们是不太用这个选项的,git在输出所有提交时会自动调用分页程序,所以你一次只会看到一页的内容。

另外还有按照时间作限制的选项,比如—since和—until也很有用。例子:列出所有最近2周内的提交

[root@wx-a sadoc]# git log –since=2.weeks

这个命令也可以再多种格式下工作,比如说具体的某一天”“2015-10-2”“,或者是相对多久以前”“ years 1 day 3 minutes ago”“还可以给出搜索条件,列出符合的提交,用—author选项显示指定作者的提交,用—grep选项搜索提交说明的关键字,

另外一个费用有用的筛选选项是-S,可以列出那些添加或移除了某些字符串的提交。比如说,你想找出添加或移除了某一个特定函数的引用的提交,你可以这样使用:

[root@wx-a sadoc]# git log –Sfunction_name

最后一个很实用的git log选项是路径(path),如果只关心某些文件或者目录的历史提交,可以再git log选项的最后指定它们的路径,因为是放在最后位置上的选项,所以用两个短划线(-)隔开之前的选项和后面限定的路径名。

限制 git log 输出的选项


选项

说明

-(n)

仅显示最近的 n 条提交

--since, --after

仅显示指定时间之后的提交。

--until, --before

仅显示指定时间之前的提交。

--author

仅显示指定作者相关的提交。

--committer

仅显示指定提交者相关的提交。

--grep

仅显示含指定关键字的提交

-S

仅显示添加或移除了某个关键字的提交

例子:如果查看git仓库中,,2008年10月期间,junio Hamano提交的但未合并的测试文件,可以用下面的查询命令:

git log –pretty=”%h - %s” –author=gitster –since=”2008-10-01” --before=”2008-11-01” –no-merges – t/

2.1 git撤销操作

在任何一个阶段,你都有可能想要撤销某些操作,这里,我们将会学习几个撤销你所做修改的基本工具,注意,有些撤销操作是不可逆的,这是在git使用的过程中,会因为操作失误而导致之前的工作丢失的少有的几个地方之一。

有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。此时,可以运行带有—amend选项的提交命令尝试重新提交:

git commit --amend

这个命令会将暂存区中的文件提交。如果上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变,而你所修改的只是提交信息。

文件编辑器启动后,可以看到之前的提交信息,编辑后保存会覆盖原来提交的信息。

例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:

git commit -m ‘initial commit’

git add forgotten_file

git commit --amend

最终你只会有一个提交-第二次提交将代替第一次提交的结果。

取消暂存的文件

git reset HEAD file 来取消暂存

撤销对文件的修改

git status 查看会告诉你是否撤销对文件的修改

git checkout -- file 撤销对文件的修改

git命令的帮助   git help  status