购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.6 修改Commit记录

程序员心情不太好,不小心在Commit信息里骂了客户,要怎样消掉?

身为程序员,难免会遇到一些不太顺心的客户或项目。心情不好的时候,在代码或Commit信息中“发泄”一下情绪也是很常见的,只是这要是让客户看见了总是不好解释。

要改动Commit记录,有以下几种方式。

(1)把.git目录整个删除(不建议)。

(2)使用git rebase命令来改动历史记录。

(3)先把Commit用git reset命令删除,整理后再重新Commit。

(4)使用--amend参数改动最后一次的Commit。

这里采用第4种方式,即改动最后一次的Commit信息。第2种和第3种方式会在后面的章节中陆续介绍。至于第1种方式,会把该项目中所有的Git记录全部清除,除非必要,不要轻易使用。

1. 使用--amend参数进行Commit

例如,原来的记录是这样的:

$ git log --oneline
4879515 WTF
7dbc437 add hello.html
657fce7 add container
abb4f43 update index page
cef6e40 create index page
cc797cd init commit

那个WTF信息有点糟糕!要改动最后一次的Commit信息,只需直接在Commit命令后面加上--amend参数即可:

$ git commit --amend -m "Welcome To Facebook"
[master 614a90c] Welcome To Facebook
Date: Wed Aug 16 05:42:56 2017 +0800
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 config/database.yml

如果没有加上-m参数并提供要改动的信息,就会弹出Vim编辑器窗口让你编辑信息。再回来查看记录,WTF就被改成Welcome To Facebook了:

$ git log --oneline
614a90c Welcome To Facebook
7dbc437 add hello.html
657fce7 add container
abb4f43 update index page
cef6e40 create index page
cc797cd init commit

如果使用SourceTree,可以单击左上角的Commit按钮进入Commit界面,然后在右下角选择Commit Options→Amend last commit选项,如图5-23所示。

图5-23

在下方的文本框中输入信息,然后单击右下角的Commit按钮,即可完成改动。

2. 你注意到了吗

虽然只是修改记录的信息,其他什么都没有改,但对Git来说,因为Commit的内容改变了,所以Git会重新计算并产生一个新的Commit对象,这其实是一次全新的Commit(只是看起来不像新的)。例如,上面这个例子中,改动前的Commit对象的SHA-1值是4879515,但改完信息之后SHA-1值变成了614a90c。虽然Commit的时间与文件的内容看起来并没有被改动,但它仍是一次全新的Commit。

3. 可以改动更早的记录吗

可以改动更早的记录,只是要使用Rebase命令来处理,因为--amend参数只能处理最后一次的Commit。关于Rebase命令的使用方式,可参阅7.1节。

注意,虽然这只是改动信息,但不管怎么说,它就是改动了一次历史记录,所以尽量不要在已经Push出去后再改动,否则可能会给其他人造成困扰。 C75w/cPYkdU0uMSxXvpW2MIknNBHgD2HVvSuxP5t2TIEs716TNfCZwbkp8cmTPNd



5.7 追加文件到最近一次的Commit

刚刚完成Commit,但发现有一个文件忘了加上,又不想为了这个文件重新再发一次Commit……

像上述这种情况,虽然为了这个文件再加送一次Commit也不是不行,但有些人有Commit的洁癖,希望每个Commit既不要太大也不要太小,做到其应该做的事就好。所以,如果不想再发一次Commit,就把这个文件并入最近一次的Commit。可以采用下面这两种方式来完成。

(1)使用git reset命令把最后一次的Commit删除,加入新文件后再重新Commit。

(2)使用--amend参数进行Commit。

这里先介绍第2种方式,第1种方式会在5.13节进行说明。

例如,这里有一个名为cinderella.html的文件,想把它加到最近一次的Commit中,可以使用如下命令:

$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

  cinderella.html

nothing added to commit but untracked files present (use "git add" to track)

假设它刚加进来,状态还是Untracked。流程上一样,还是使用git add命令先把文件加到暂存区:

$ git add cinderella.html

接着在Commit时加上--amend参数:

$ git commit --amend --no-edit
[master 3128d00] update story
Date: Wed Aug 16 05:42:56 2017 +0800
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 cinderella.html 
create mode 100644 config/database.yml

这样就可以把文件并入最近一次的Commit。最后面那个--no-edit参数的意思是“我不要编辑Commit信息”,所以就不会跳出Vim编辑器窗口。

如果使用SourceTree,同样也是先把cinderella.html文件加至暂存区(勾选),然后在Commit的时候选择Commit Options→Amend last commit选项,如图5-24所示。

图5-24

Commit信息改不改都可以,最后单击右下角的Commit按钮,这个文件就会被并到最近的一次Commit中。

注意!

像这样改动历史记录的操作,尽量不要应用在已经Push出去的Commit上。 /oQQ+WUjnfM6LWGsxQAMaiMG5YnmhqylOdkVmrD+e8cunFJGHi4f1lzhSQbod+IL



5.8 新增目录

刚刚新增了一个images目录,却发现这个目录好像无法被加到Git中。

例如:

$ git status
On branch master
nothing to commit, working tree clean

现在的状态是刚完成Commit,工作目录也没有任何改动。接着创建一个images目录:

$ mkdir images

再看一下状态,会发现Git的状态依旧没有变化:

$ git status
On branch master
nothing to commit, working tree clean

有一点要记住,就是Git在计算、产生对象时,是根据“文件的内容”进行计算的,所以只是新增一个目录的话,Git是无法处理它的。

注意!

空的目录无法被提交!

这时怎么办?其实很简单,只要在空目录中随便放一个文件就行了。如果当前还没有文件可以放,或者不知道该放什么文件,通常可以放一个名为“.keep”或“.gitkeep”的空文件,让Git能“感应”到这个目录的存在:

$ touch images/.keep

然后再查看一下状态:

$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

  images/

nothing added to commit but untracked files present (use "git add" to track)

可以发现,Git已经感知到这个目录的存在了(其实是感应到里面那个.keep文件的存在),接下来按照一般的流程进行add和commit即可。 /oQQ+WUjnfM6LWGsxQAMaiMG5YnmhqylOdkVmrD+e8cunFJGHi4f1lzhSQbod+IL

点击中间区域
呼出菜单
上一章
目录
下一章
×