Git学习笔记
#####################################################
qq:1218761836
qq群:150181442
E-mail:[email protected]
#####################################################
目录
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之后,需要配置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 [email protected]
如果使用―global选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情,git都会使用那么信息,当你针对特定项目使用不同的用户名称与你邮件地址时,可以在那个项目下运行没有―global选项的命令来配置
文本编辑器
git config --global core.editor emacs #使默认的编辑器为emacs或者vim
检查配置信息
在根目录下运行获取的信息
[root@wx-a ~]# git config --list
user.name=wang xingxing
core.editor=vim
在版本库中运行获取的信息
[root@wx-a sadoc]# git config --list
user.name=wang xingxing
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 �Chelp
man git
git �Chelp
[root@wx-a /]# mkdir /project/git/sadoc �Cp
[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
为版本库添加文件或者目录
在版本库的目录下创建文件或者目录
[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 �Cm ‘initial project version’ #提交成功
[master fc75b2e] initial project version
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test
git 记录每次更新到仓库
在git的版本库中对文件做些修改,在完成目标之后,提交更新到仓库。
工作目录下的每一个文件都不外乎两种状态:已跟踪或未跟踪。已跟踪的文件是指那些被纳入版本控制的文件,在上一次快照中有他们的记录,在工作一段时间后,他们的状态可能处于未修改,已修改或已放入暂存区,工作目录中除已跟踪文件以外的所有其他文件都属于未跟踪文件,他们既不存在于上次快照的记录中,也没有放入暂存区。初次克隆某个仓库的时候,工作目录的所有文件都属于已跟踪文件,并处于未修改状态。
编辑过某些文件之后,由于上次提交后你对他们做了修改,git将他们标记为已修改文件。我们逐步将这些修改过的文件放入暂存区,然后提交所有暂存了的修改,如此反复,所以使用git时文件的生命周期如下:
要查看哪些文件处于什么状态,可以用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)
查看到这个文件还没有提交到版本库中,也没有添加到版本库中
[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 �Cs
A readme
或者
[root@wx-a sadoc]# git status �Cshort
A readme
新添加的未跟踪文件前面有?? 标记
新添加到暂存区的文件前面有A标记
修改过的文件前面有M标记
一般我们总会有些文件无需纳入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 �Cgit 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 �Ccached命令(git1.6.1及更高版本还允许使用git diff �Cstaged,效果是相同的,但更好记些)
[root@wx-a sadoc]# git diff �Ccached
diff �Cgit a/readme b/readme
new file mode 100644
index 0000000..ba82621
--- /dev/null
+++ b/readme
@@ -0,0 +1,2 @@
+my project
+abcdesss
diff �Cgit a/test-1 b/test-1
new file mode 100644
index 0000000..e69de29
# git diff本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有的改动,所以有时间一下子暂存了所有更新的文件后,运行git diff后却什么也没有,就是这个原因。
Git diff的插件版本
可以使用git difftool �Ctool-help 命令系统支持哪些git diff插件。
提交更新
现在的暂存区域已经准备妥当可以提交了,在此之前,请一定要确认还有什么修改过的或新建的文件还没有git add过,否则提交的时候不会记录这些还没暂存起来的变化,这些修改过的文件只保留在本地磁盘,所以,每次准备提交前,先用git status看下,是不是都已暂存起来了,然后再运行提交命令 git commit
[root@wx-a sadoc]# git commit
这种方式会启动文本编辑器以便输入本次提交的说明,默认会启用shell的环境变量$EDTTOR所指定的软件,一般都是vim或emacs。当然也可以按照起步介绍的方式,使用git config �Cglobal 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 �Cm “test �Cversion 2”
[master bec67e0] test �Cversion 2
1 files changed, 3 insertions(+), 0 deletions(-)
create mode 100644 readme
create mode 100644 test-1
已经完成了一个提交,可以看到,提交之后告诉我,当前是在那个分支(master)。以及本次提交的完整SHA-1 校验和
bec67e0,以及在本次提交中,有多少文件修订过,多少行添加和删改过。
提交的时的记录是放在暂存区域的快照,任何还未暂存的仍然保持已修改状态,可以再下次提交时纳入版本管理,每一次运行提交操作,都是对你项目做一次快照,以后可以回到这个状态,或者进行比较。
尽管使用暂存区域的方式可以静心准备要提交的细节,但有的时候略显繁琐,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
要从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�Cr--. 1 root root 0 Sep 30 01:07 abc
-rw-r�Cr--. 1 root root 9 Oct 2 06:00 abc-add
drwxr-xr-x. 2 root root 4096 Oct 1 22:53 abcd
-rw-r�Cr--. 1 root root 20 Oct 1 23:37 readme
-rw-r�Cr--. 1 root root 0 Oct 1 22:53 test
-rw-r�Cr--. 1 root root 7 Oct 2 04:49 test-1
-rw-r�Cr--. 1 root root 19 Oct 2 06:00 test-add
[root@wx-a sadoc]# rm �Crf 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 �Ca”)
此时需要运行 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 �Ccached README
git rm 命令后面可以列出文件或者目录的名字,也可以使用glob模式。
Git rm log/\*.log
注意到这个星号* 之前的反斜杠\,因为git有它自己的文件模式扩展匹配方式,所以我们不用shell来帮忙,此命令删除log/ 目录下扩展名为.log 的所有文件。类似的比如:
git rm \*~
该命令为删除以~ 结尾的所有文件
不像其他的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轻便的多,不过有时间用其他工具批处理改名的话,要记得提交前删除老的文件名,再添加新的文件名。
在提交若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史,完成这个任务最简单而又有效的工具是git log命令。
[root@wx-a sadoc]# git log
commit 82276f4036681b5f4686346e13e3f79fba475214
Author: wang xingxing <[email protected]>
Date: Fri Oct 2 06:01:11 2015 +0800
added new benchmarks
commit bec67e0ba02e81b2b9d4ddd1c65791ecde16c8d0
Author: wang xingxing <[email protected]>
Date: Fri Oct 2 05:20:47 2015 +0800
test �Cversion 2
commit fc75b2e8cdd381516dad6acb6c04bd8da52b89db
Author: wang xingxing <[email protected]>
Date: Thu Oct 1 22:54:21 2015 +0800
initial project version
commit e14c816c6fa318a4ac56599b1b781f1adbaf2781
Author: root <[email protected]>
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 �Cp -2
commit 82276f4036681b5f4686346e13e3f79fba475214
Author: wang xingxing <[email protected]>
Date: Fri Oct 2 06:01:11 2015 +0800
added new benchmarks
diff �Cgit a/abc-add b/abc-add
new file mode 100644
index 0000000..2d91f20
--- /dev/null
+++ b/abc-add
@@ -0,0 +1 @@
+test add
diff �Cgit 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 �Ca
commit bec67e0ba02e81b2b9d4ddd1c65791ecde16c8d0
Author: wang xingxing <[email protected]>
Date: Fri Oct 2 05:20:47 2015 +0800
test �Cversion 2
diff �Cgit a/readme b/readme
new file mode 100644
index 0000000..ba82621
…………………………………………………….
该选项除了显示基本信息之外,还在附带了每次commit的变化,当进行代码审查,或者快速浏览某个搭档提交的commit所带来的变化的时候,这个参数就费用有用了,你也可以为git log附带一系列的总结性选项。比如说你想看到每次提交的简略的统计信息,你可以使用―stat 选项
git log �Cstat
另外一个常用的选项是―pretty,这个选项可以指定使用不同于默认格式的方式展示提交历史,这个选项有一些内建的子选项可以配合使用,比如用oneline将每个提交放在一行显示,查看的提交数很大时非常有用,另外还有short,full和fuller可以用,展示的信息或多或少有些不同,
git log �Cpretty=oneline
但最有意思的是format,可以定制要显示的记录格式,这样的输出对后期提取分析格外有用,因为你知道输出的格式不会随着git的更新而发生改变
[root@wx-a sadoc]# git log �Cpretty=format:”%h - %an, %ar : %s”
82276f4 �C wang xingxing, 12 hours ago : added new benchmarks
bec67e0 �C wang xingxing, 13 hours ago : test �Cversion 2
fc75b2e �C wang xingxing, 19 hours ago : initial project version
e14c816 �C root, 3 days ago : in aa abc ok
选项 |
说明 |
%H |
提交对象(commit)的完整哈希字串 |
%h |
提交对象的简短哈希字串 |
%T |
树对象(tree)的完整哈希字串 |
%t |
树对象的简短哈希字串 |
%P |
父对象(parent)的完整哈希字串 |
%p |
父对象的简短哈希字串 |
%an |
作者(author)的名字 |
%ae |
作者的电子邮件地址 |
%ad |
作者修订日期(可以用 �Cdate= 选项定制格式) |
%ar |
作者修订日期,按多久以前的方式显示 |
%cn |
提交者(committer)的名字 |
%ce |
提交者的电子邮件地址 |
%cd |
提交日期 |
%cr |
提交日期,按多久以前的方式显示 |
%s |
提交说明 |
作者和提交者之间究竟的区别:其实作者指的是实际做出修改的人,提交者指的是最后将此工作成果提交到仓库的人,所以,当你为某个项目发布补丁,然后某个核心成员将你的补丁并入项目时,你就是作者,而那个核心成员就是提交者。
当oneline或format与另一个log 选项―graph结合使用时尤其有用,这个选项添加一些ASCII字符串来形象地展示你的分支、合并历史:
[root@wx-a sadoc]# git log �Cpretty=format:”%h %s” �Cgraph
* 82276f4 added new benchmarks
* bec67e0 test �Cversion 2
* fc75b2e initial project version
* e14c816 in aa abc ok
以上只是简单介绍了一些git log命令支持的选项,表2列出我们目前涉及到和没涉及到的选项,已经他们是如何影响log命令的输出的:
选项 |
说明 |
-p |
按补丁格式显示每个更新之间的差异。 |
--stat |
显示每次更新的文件修改统计信息。 |
--shortstat |
只显示 �Cstat 中最后的行数修改添加移除统计。 |
--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 �Csince=2.weeks
这个命令也可以再多种格式下工作,比如说具体的某一天”“2015-10-2”“,或者是相对多久以前”“ years 1 day 3 minutes ago”“还可以给出搜索条件,列出符合的提交,用―author选项显示指定作者的提交,用―grep选项搜索提交说明的关键字,
另外一个费用有用的筛选选项是-S,可以列出那些添加或移除了某些字符串的提交。比如说,你想找出添加或移除了某一个特定函数的引用的提交,你可以这样使用:
[root@wx-a sadoc]# git log �CSfunction_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 �Cpretty=”%h - %s” �Cauthor=gitster �Csince=”2008-10-01” --before=”2008-11-01” �Cno-merges �C t/
在任何一个阶段,你都有可能想要撤销某些操作,这里,我们将会学习几个撤销你所做修改的基本工具,注意,有些撤销操作是不可逆的,这是在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