git commit -a
把工作区的修改添加到本地仓库的需要两步git add filename
,git commit -m "message"
有时候会觉得麻烦,这个时候可以使用git commit -a -m "message"
,相当于把上述两部合并成一步了。这里的-a
相当于add
吧。不过注意,如果是一个untracked file是不能直接这样操作的,还是得老老实实的分两步从工作区提交到本地仓库,之后才能使用commit -a -m "message"
。
git diff 和git diff HEAD
git diff
可以查看工作区和暂存区之间的差异。
git diff HEAD
可以查看工作区和本地仓库之间的差异。
上述的差异是指工作区比暂存区或本地仓库多或者少的代码。
红色表示工作区比暂存区/本地仓库缺少的代码,前面会有-
号。
绿色表示工作区比暂存区/本地仓库多的代码,前面会有+
号。
要是文末多了几个空白行,则会提示\ No newline at end of file
。
git checkout -- filename
git checkout -- filename
使用该命令,相当于用暂存区里的filename版本替换掉工作区的。注意filename
和--
之间有空格,毕竟file
不是git checkout
命令的参数。比如,当你你使用rm file
,把文件从工作区删除,使用git checkout --file
后,file就会变成存放在暂存区里的file版本。如果这个文件是新建的,显然就无法被恢复。
git rm filename
-
git rm filename
可以把文件从工作区,暂存区里同时删掉。使用git status
命令查看状态。
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: gabage.txt
这个时候就不能用git checkout -- file
恢复文件了,因为暂存区中的文件也已经被删除了,会提示
error: pathspec 'gabage.txt' did not match any file(s) known to git
后续再git commit -m "message"
,就ok了。注意:先手动删除文件,然后使用git rm filename
和git add filename
效果是一样的。。
-
git rm --cache filename
可以把文件只从暂存区里删掉。使用git status
查看状态
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: gabage2.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
gabage2.txt
Changes to be committed
是因为暂存区里的文件和本地仓库里文件不一致导致的,使用commit -m "message"
就可以使暂存区里的文件和本地仓库里一致了。当然也可以使用git reset HEAD filename
,把本地仓库里的文件版本替换暂存区里的版本。
Untracked files
是因为工作区有一个文件没记录在暂存区,使用git add
就可以了。
git reset HEAD filename
git reset HEAD filename
可以把本地仓库里的文件版本替换暂存区里的文件版本。如果使用git add filename
,再使用git reset HEAD filename
效果相当于撤销了这次git add filename
的操作。git reset
命令有三种模式。
- -- soft:回退到某个版本,只回退本地仓库的信息,不对暂存区和工作区操作。
- --mixed:此为默认方式,平时不加参数的话,用的就是这种模式,回退本地仓库和暂存区的文件版本,不对工作区进行操作,所以用
git reset HEAD filename
,本地仓库的版本没有变,而暂存区版本和本地仓库不一定一致,造成的效果就相当于用本地仓库的文件版本替换了暂存区的文件版本。其实这个命令本地仓库和暂存区的文件版本同时被替换。 - --hard:彻底回退到某个版本,工作区,暂存区,本地仓库的版本都会被替换。