From 27a504755942cb2a76bbe88accee9a8eadb6288e Mon Sep 17 00:00:00 2001 From: wenyongda Date: Fri, 1 Aug 2025 16:36:47 +0800 Subject: [PATCH] commit --- source/_posts/Git.md | 147 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) diff --git a/source/_posts/Git.md b/source/_posts/Git.md index 81c3c89..b4e8e3d 100644 --- a/source/_posts/Git.md +++ b/source/_posts/Git.md @@ -159,6 +159,95 @@ ssh-keygen -c -C "new_comment" -f ssh_key_path git checkout -- ``` +## 撤回(重置)本地仓库提交 + +若想把已经提交到本地仓库的提交再撤回到本地,通常有几种情况和对应的命令。最常用的是 `git reset`。 + +`git reset` 命令可以用来将当前分支的 `HEAD` 指针移动到指定的提交,并根据不同的模式来处理**暂存区**和**工作目录**。 + +- ### 1. `git reset --soft ` + + + + - **作用:** 将 `HEAD` 指针移动到指定的 ``,但**保留**工作目录和暂存区的内容。这意味着你的文件会回到该 `` 时的状态,但是你当前的修改和暂存的修改都会保留。 + + - **适用场景:** 你提交了一个 commit,但是发现提交信息写错了,或者少提交了一些文件。你可以用 `--soft` 回退到上一个 commit,然后修改文件,重新提交。 + + - **示例:** + + ```Bash + git reset --soft HEAD~1 + ``` + + 这会将 `HEAD` 回退到上一个提交(`HEAD~1` 表示上一个提交)。 + +- ### 2. `git reset --mixed ` (默认模式) + + + + - **作用:** 将 `HEAD` 指针移动到指定的 ``,并**清空**暂存区,但**保留**工作目录的内容。这意味着你的文件会回到该 `` 时的状态,你当前的修改会保留在工作目录中(未暂存)。 + + - **适用场景:** 你提交了一个 commit,但是发现这个 commit 的内容不对,想撤销提交,并重新暂存和提交。 + + - **示例:** + + ```Bash + git reset HEAD~1 + # 或者 git reset --mixed HEAD~1 + ``` + + 这会将 `HEAD` 回退到上一个提交,并将暂存区清空,但保留文件在工作目录。 + + + +- ### 3. `git reset --hard ` + + + + - **作用:** 将 `HEAD` 指针移动到指定的 ``,并**清空**暂存区和**丢弃**工作目录的所有修改。这意味着你的仓库会完全回到该 `` 时的状态,所有在该 `` 之后的修改都会丢失,**这是最危险的操作**。 + + - **适用场景:** 你想完全放弃当前分支上的所有最新修改和提交,回到之前的某个干净的状态。 + + - **示例:** + + ```Bash + git reset --hard HEAD~1 + ``` + + 这会将 `HEAD` 回退到上一个提交,并丢弃所有工作目录和暂存区的修改。 + + + +## 如何找到 `` 的 ID? + + + +你可以使用 `git log` 命令来查看提交历史,并找到你想要回退到的提交的哈希值(commit ID)。 + +Bash + +``` +git log +``` + +`git log` 会显示类似这样的信息: + +``` +commit abcdef1234567890abcdef1234567890abcdef (HEAD -> master) +Author: Your Name +Date: Fri Aug 1 13:20:00 2025 +0800 + + 最新的提交 + +commit fedcba0987654321fedcba0987654321fedcba (origin/master) +Author: Another Name +Date: Thu Jul 31 10:00:00 2025 +0800 + + 之前的提交 +``` + +你可以复制 `commit` 后面的哈希值(例如 `fedcba0987654321...`)来替换上面的 ``。 + ## git 如何关闭commit时的语法检测 ---husky 1 报错提示 @@ -238,3 +327,61 @@ git config --global https.proxy 'http://127.0.0.1:代理的port' docker exec -u git -it -w /tmp gitea bash -c '/app/gitea/gitea dump --database postgres --config /data/gitea/conf/app.ini' ``` +# Sourcetree + +这里主要介绍两种最常用的场景,对应 `git reset --soft` 和 `git reset --hard` 的效果。 + +## 撤回(重置)本地仓库提交 + +### 1. 撤销最近一次提交(保留修改以便重新提交) + + + +这类似于 `git reset --soft HEAD~1` 或 `git reset --mixed HEAD~1` 的效果,目的是撤销提交,但保留你的文件修改。 + +1. **打开日志/历史记录:** 在 SourceTree 界面的左侧,找到你的仓库,然后点击顶部的“日志/历史”或“历史记录”选项卡。 + +2. **定位要撤销的提交:** 在提交历史列表中,找到你想撤销的**前一个**提交(也就是你希望回退到的那个提交)。 + +3. **右键点击并选择:** 右键点击该提交。 + +4. **选择“将当前分支重置到此提交”:** 在弹出的菜单中选择 **“将当前分支重置到此提交”** (Reset current branch to this commit)。 + ![image-20250801140709918](https://rustfs.wenyongdalucky.club:443/hexo/image-20250801140709918.png) + +5. **选择重置模式:** 此时会出现一个弹窗,让你选择重置模式: + + - **Soft(软重置)**:勾选这个选项。它会将 `HEAD` 指针移动到选定的提交,**保留**工作目录和暂存区的内容。这意味着你的修改还在,只是不再是提交的一部分。 + - **Mixed(混合重置)**:这是默认选项。它会将 `HEAD` 指针移动到选定的提交,**清空**暂存区,但**保留**工作目录的内容。 + - **注意:** 如果你只想撤销提交,并打算修改后重新提交,通常选择 **Soft** 或 **Mixed** 都可以,根据你是否希望文件保留在暂存区。对于“撤回本地仓库提交”这个需求,通常是希望保留修改以便重新操作。 + + ![image-20250801140733960](https://rustfs.wenyongdalucky.club:443/hexo/image-20250801140733960.png) + +6. **确认:** 点击“确定”或“Reset”按钮。 + +完成这些步骤后,你会发现最新的那个提交消失了,而你工作目录中的文件依然保留了修改内容,你可以重新暂存并提交。 + +------ + + + +### 2. 彻底撤销最近一次提交(丢弃所有修改) + + + +这类似于 `git reset --hard HEAD~1` 的效果,会完全丢弃最近提交的所有修改。**请务必谨慎使用此选项,因为它会丢失数据!** + +1. **打开日志/历史记录:** 同样,在 SourceTree 中打开“日志/历史”选项卡。 +2. **定位要撤销的提交:** 找到你想撤销的**前一个**提交。 +3. **右键点击并选择:** 右键点击该提交。 +4. **选择“将当前分支重置到此提交”:** 在弹出的菜单中选择 **“将当前分支重置到此提交”** (Reset current branch to this commit)。 +5. **选择重置模式:** 在弹窗中,选择 **“Hard(硬重置)”**。 +6. **确认:** 点击“确定”或“Reset”按钮。SourceTree 还会再次弹出警告,提醒你这将丢失数据,请确认。 + +执行此操作后,你的仓库状态会完全回溯到选定的提交,所有后续的修改和提交都将消失。 + +------ + + + +- **未推送的提交:** 上述操作主要用于**尚未推送到远程仓库**的本地提交。如果你已经将提交推送到远程,使用 `git reset` 会导致本地和远程历史不一致,从而引发问题。对于已推送的提交,通常应该使用 **“逆转提交”(Revert Commit)**,它会创建一个新的提交来撤销之前的修改,而不是改写历史。 +- **Revert(逆转)操作:** 如果你希望逆转某个已推送的提交,可以在 SourceTree 中右键点击该提交,然后选择 **“逆转提交 <哈希值>”** (Revert commit )。这会创建一个新的提交来撤销该提交的修改,并且不会改变历史,是更安全的选择。