背景
在实际的开发工作中,使用git commit 总会遇到一些令人抓狂的提交,一切源于手欠和脑子不清醒,把一些不该提交的东西一起提交了。
不过还在Git还是能给我们后悔的机会。
场景模拟
@PostMapping("/hhh")
public String test1(){
AbsBatch batch = mapper.selectByPrimaryKey("dd");
return batch.toString();
}
@PostMapping("/hhhh")
public String test3(){
AbsBatch batch = mapper.selectByPrimaryKey("dd");
return batch.toString();
}
在这一次的提交中,我本来只需要提交test1这个方法,但是一不小心把test3也一起提交了o((⊙﹏⊙))o
case 1 已提交未push
这种情况处理起来比较简单。如果你适用的开发工具是idea时,就显得尤为简单。
undo commit
直接就是 右键 -> undo commit
直接把本地的git提交记录给去掉了,但是你之前对代码的修改还在(✪ω✪) 然后你就可以回到未提交的状态,然后重新提交。
reset
git reset --soft,–hard的区别
git reset 命令可以将当前的HEAD重置到特定的状态。
首先要搞清楚下面几个概念
- HEAD: HEAD就是指向当前分支当前版本的游标
- Index: Index即为暂存区,当你修改了你的git仓库里的一个文件时,这些变化一开始是unstaged状态,为了提交这些修改,你需要使用git add把它加入到index,使它成为staged状态。当你提交一个commit时,index里面的修改被提交。
- working tree: 即当前的工作目录。
git reset 的用法
git reset [<mode>] [<commit>]
git reset 将当前分支的HEAD指向给定的版本,并根据模式的不同决定是否修改index和working tree。
常用的有三种模式,–soft, --mixed, --hard,如果没有给出则默认是–mixed
1 --soft
已经有未提交的更改:如果在执行软重置之前有未提交的更改,Git 可能会拒绝执行软重置操作。您可以通过提交或保存当前工作目录中的更改来解决此问题。
请一定注意这个
reset --soft相当于后悔药,给你重新改过的机会。对于上面的场景,就可以再次修改重新提交,保持干净的 commit 记录。
以上说的是还未 push 的commit。对于已经 push 的 commit,也可以使用该命令,不过再次 push 时,由于远程分支和本地分支有差异,需要强制推送git push -f来覆盖被 reset 的 commit。
还有一点需要注意,在reset --soft指定 commit 号时,会将该 commit 到最近一次 commit 的所有修改内容全部恢复,而不是只针对该 commit。
使用 --soft参数将会仅仅重置HEAD到制定的版本,不会修改index和working tree
三次提交
第一次:test1.txt
第二次:test2.txt
第三次:test3.txt
本地文件的内容并没有发生变化,而index中仍然有最近一次提交的修改,这时执行git status会显示这些修改已经在再暂存区中了,无需再一次执行git add。接下来就可以重新修改提交了。
2 --mixed
使用 --mixed参数与 --soft的不同之处在于, --mixed修改了index,使其与第二个版本匹配。index中给定commit之后的修改被unstaged。需要重新 git add .
3. --hard
使用–hard同时也会修改working tree,也就是当前的工作目录,如果我们执行git reset --hard HEAD~,那么最后一次提交的修改,包括本地文件的修改都会被清楚,彻底还原到上一次提交的状态且无法找回。所以在执行reset --hard之前一定要小心
不建议使用!
revert
如果你比较莽,直接就是一个revert commit,你就会悲催的发现:代码确实回退了,但是你的代码全部都不见了!!!∑(゚Д゚ノ)ノ 。如果你打算重写,那我只能表示:人山人海雅座一位!
想要你的代码回来,也有那么几种方法
- 对 revert的这次提交再次进行revert or undo commit
但是呢,这里有个问题就是,重新revert找回的代码,额,提交不了。这时候你本地的代码和Git云上的代码就出现了不一致。我的建议:新建一个项目重新拉代码,那那个新项目里修改。
- 查看git的提交记录,然后自己复制粘贴去(不推荐)
case 2 commit and push
如果你跟我一样,就喜欢直接一步到位。每次都是提交和push一起操作的,那么这个过程就会麻烦不少。
处理
-
确保您的工作目录干净,并且没有未提交的更改。您可以使用git status命令检查当前工作目录的状态。
-
使用git log命令查看提交历史,并找到您想要重新提交的上次提交的哈希值(commit hash)。
要查看上次提交的哈希值,您可以使用以下命令:git log --oneline
这将显示最近的提交记录,每个提交记录都有一个简短的哈希值以及提交的摘要信息。最近的提交记录将显示在顶部。
如果您只想查看最近一次提交的哈希值,您可以使用以下命令:
git log --oneline -n 1
这将只显示最近一次提交的哈希值和摘要信息。
请注意,哈希值是一串字符,通常由16进制数字组成。您可以使用这个哈希值来标识和引用特定的提交。
-
运行以下命令,将您想要重新提交的上次提交的部分内容添加到暂存区:
git cherry-pick <commit-hash>
将
<commit-hash>
替换为您要重新提交的上次提交的哈希值。这将应用指定的提交,并将更改添加到暂存区。
-
运行以下命令,检查您的更改是否正确添加到暂存区:
git status 确保您只看到了您想要重新提交的部分内容被添加到了暂存区。
-
运行以下命令,提交您的更改:
git commit -m "Recommit specific changes from previous commit" 替换提交信息`"Recommit specific changes from previous commit"`为您自己的提交信息。 这将创建一个新的提交,包含您重新提交的部分内容。
-
最后,如果您需要将更改推送到远程仓库,请运行:
git push
这将把您的新提交推送到远程仓库。
请注意,git cherry-pick命令会将指定提交中的更改复制到当前分支,因此请确保您在正确的分支上进行操作。