要求: 编写一个文档,回答下列问题,这些问题的答案都应当使用 git 命令实现。
提交: 一个 MarkDown 文件和若干个图片文件,在 MarkDown 中使用有效的相对路径引用你的图片。
思路:
- 先用
git status查看当前哪些文件已暂存、哪些只在工作区修改; - 用
git restore --staged <file>把已经加入暂存区的文件“退回”到工作区; - 再用
git restore <file>或git restore .丢弃工作区里的修改; - 再次
git status,确认工作区已经回到最后一次提交时的状态。
关键命令示例(终端内容见截图):
git status
git restore --staged src/app.c
git restore .
git status思路:
- 当你确定所有当前修改都不要了(包括暂存区和工作区),可以使用
git reset --hard HEAD; - 这个命令会同时重置 HEAD、索引(暂存区)和工作区,把整个仓库恢复到当前分支最后一次提交的状态;
- 再次
git status,确认干净。
关键命令示例:
git status
git reset --hard HEAD
git status这里我给出的是不修改历史的两种方式:通过新增提交的方式回退版本,而不是直接改写历史记录。
思路:
- 使用
git log --oneline找到需要回退的那个提交的哈希值(例如8a1c9ac); - 运行
git revert <commit>,Git 会自动生成一个新的提交,这个提交的内容刚好与目标提交相反,从而达到“撤销”的效果; - 这样不会删除原来的提交,只是在后面多了一个“撤销”提交,属于不修改历史。
关键命令示例:
git log --oneline -3
git revert 8a1c9ac
git log --oneline -4思路:
- 通过
git log --oneline找到想要回到的旧版本(比如3b8f5d1); - 使用
git restore --source=<旧版本> .把整个工作区文件内容恢复成旧版本; - 检查无误后,重新提交一次,这个新的提交就相当于“回滚到了旧版本”,但是中间的历史仍然保留;
- 同样属于不修改历史,只是通过“再提交一次”的方式回到旧状态。
关键命令示例:
git log --oneline -3
git restore --source=3b8f5d1 .
git status
git commit -am "rollback to version 3b8f5d1 without history rewrite"
git log --oneline -4思路:
- 假设有
main和feature/login两个分支; - 先切到功能分支
feature/login,用git rebase main,把功能分支的提交“移动”到main分支的后面; - 然后切换回
main,直接git merge feature/login,此时会是一个 fast-forward 合并(实际上只是移动指针),看起来像是线性历史; - 这种方式也是一种合并分支的方法,但不是传统的
merge生成 merge commit 的形式。
关键命令示例:
git branch
git log --oneline --graph --all
git checkout feature/login
git rebase main
git checkout main
git merge feature/login
git log --oneline --graph思路:
- 当你只想从某个分支中挑选部分提交合并到当前分支时,可以使用
git cherry-pick; - 先查看功能分支的提交记录,找到需要的提交哈希(例如
9f0c4d1); - 在目标分支(比如
main)上执行git cherry-pick <commit>,Git 会把该提交“复制”到当前分支,形成一个新的提交; - 这也是一种“合并分支工作成果”的方式,但不是直接对整个分支做 merge。
关键命令示例:
git branch
git log --oneline feature/login
git checkout main
git cherry-pick 9f0c4d1
git log --oneline --graph




