重新提交
可以更优雅地处理这种问题,比如:
❯ git commit -m 'add user module'
[main 71c4fa9] add user module
3 files changed, 61 insertions(+)
create mode 100644 ch1/demo/src/main/java/cn/icexmoon/learngit/demo/controller/UserController.java
create mode 100644 ch1/demo/src/main/java/cn/icexmoon/learngit/demo/entity/User.java
create mode 100644 ch1/demo/src/main/java/cn/icexmoon/learngit/demo/service/UserService.java
这里从暂存区提交了三个文件到分支,假设发现少提交了一个文件:
❯ git commit --amend
[main 51fc7ad] add user module
Date: Fri Jan 30 14:43:08 2026 +0800
4 files changed, 81 insertions(+)
create mode 100644 ch1/demo/src/main/java/cn/icexmoon/learngit/demo/controller/UserController.java
create mode 100644 ch1/demo/src/main/java/cn/icexmoon/learngit/demo/entity/User.java
create mode 100644 ch1/demo/src/main/java/cn/icexmoon/learngit/demo/service/UserService.java
create mode 100644 ch1/demo/src/main/java/cn/icexmoon/learngit/demo/service/impl/UserServiceImpl.java
添加新文件到暂存区可以使用
add命令,也可以通过其它工具。
借助--amend参数,Git 会用一个新的提交记录替换最近的一次提交记录,看上去好像我们撤销了最近一次提交,并重新进行了提交一样。需要注意的是,只能对已经提交到本地分支,但没有推送到远程分支的提交记录这样做。如果最近的一次提交记录已经推送到远程分支,是不能这样操作的。
撤销暂存
通常我喜欢在项目根目录使用git add .快捷地添加所有需要提交的文件到暂存区,然后提交。但偶尔会遇到有些文件不需要提交,但被错误地放入暂存区(这通常是因为还未在.gitignore文件中添加这些文件导致的)。
此时查看文件状态:
❯ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: ch1/demo/src/main/java/cn/icexmoon/learngit/demo/entity/ClassRoom.java
new file: ch1/demo/src/main/java/cn/icexmoon/learngit/demo/entity/Teacher.java
我们可以按照提示,使用git restore --staged命令将文件从暂存区撤销:
git restore --staged ch1/demo/src/main/java/cn/icexmoon/learngit/demo/entity/Teacher.java
再次查看状态就能发现该文件变成了未添加到暂存区时的状态。
还原文件
另一个常见需求是,你需要保证当前工作区与分支一致,比如你打算切换(checkout)到另一个分支。如果此时有新增或修改的文件,你就需要进行暂存并提交,以避免丢失文件。
但如果你不想保留这些修改,可以直接用分支中的记录进行还原操作。
方便的是,如果执行还原操作在查看文件状态时 Git 会进行提示:
❯ git status
On branch main
Your branch is ahead of 'origin/main' by 2 commits.
(use "git push" to publish your local commits)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: ch1/demo/src/main/java/cn/icexmoon/learngit/demo/entity/User.java
与之前撤销暂存有所不同,这里不需要使用
--staged参数,因为显然这里还未将修改后的文件进行暂存。相应的,这里的restore命令会直接将工作区的文件进行还原。
需要注意的是,因为这里还原前的文件没有添加到暂存区,也没有进行提交,所以这个操作会丢失之前的修改内容,无法找回,所以操作前务必确认你确实需要执行该操作。
The End.

文章评论