问题背景:
- 发版时 更新VersionInfo后直接commit push了,忘了修改changlog文件,想把changlog的修改和上次push合并在一起。
解决方案
如果你已经进行了提交并且忘记包含一个文件,但希望将这个文件合并到之前的一次提交中,可以使用 git commit --amend
来进行修改。以下是步骤:
-
添加文件到暂存区:
- 首先,确保你在工作目录中包含了想要添加的文件,然后将其添加到暂存区。
git add <file_name>
-
使用
--amend
修改最后一次提交:- 接下来,运行下面的命令来修改上一次提交,并包含新添加的文件。
git commit --amend
-
编辑提交信息(可选):
- 默认情况下,这将打开你的默认文本编辑器,允许你修改提交信息。如果不需要修改提交信息,可以直接保存并关闭编辑器。
-
强制推送到远程仓库(如果已推送过):
- 如果你已经将原始提交推送到远程仓库,那么你需要使用
--force
或者更安全的--force-with-lease
来强制更新远程分支。
git push origin <branch_name> --force-with-lease
使用
--force-with-lease
可以在确保没有其他人更新该分支的情况下安全地强制推送。 - 如果你已经将原始提交推送到远程仓库,那么你需要使用
注意事项
-
协作警告:如果你在与他人协作的公共分支上操作,应格外小心,因为
--force
会覆盖远程历史记录,可能会影响其他开发人员的工作。 -
本地分支:如果这是一个尚未推送或仅在本地使用的分支,则可以放心地执行上述步骤而无需担心对他人的影响。
这些步骤可以帮助你将遗漏的文件合并到最新的提交中,从而保持提交历史的整洁和准确。
检查是否执行 git commit --amend
我正在执行上述操作时,被人叫走了,半天后回到工位忘记执行到哪一步了?
例如,如何确定我上次的commit 是否是“git commit --amend”
要确定你上次的提交是否使用了 git commit --amend
,可以通过查看 Git 日志和比较某些提交信息来判断。以下是一些步骤和方法:
1. 检查提交历史
使用 git log
查看最近的提交历史,观察提交记录是否有重写的迹象。
git log
-
提交 SHA-1 哈希:如果你怀疑某个提交被
--amend
修改过,可以查看该提交的 SHA-1 哈希值是否改变。 -
提交时间:通常情况下,
--amend
会导致提交时间更新。如果你注意到某个提交的时间与之前的预期不符,这可能表示它被修改过。
2. 查看引用日志 (reflog)
Git 的引用日志(reflog)会记录所有的 HEAD 更新,包括 commit --amend
操作。你可以查看 reflog 来确认是否进行了 --amend
操作。
git reflog
在 reflog
中,你会看到类似于以下条目:
abcd123 HEAD@{0}: commit (amend): Updated commit message or changes
efgh456 HEAD@{1}: commit: Original commit message
实际上我的效果
b71c33952 (HEAD -> pre_release) HEAD@{0}: commit (amend): Release v4.1.8.1
140bff2a0 (origin/pre_release) HEAD@{1}: commit: Release v4.1.8.1
c521e966b HEAD@{2}: commit: [Fixed] 修复 isMainProcess 的 NPE
- 查找 “commit (amend)”:注意那些包含 “(amend)” 标记的条目,这表示该提交是通过
git commit --amend
创建或修改的。
3. 比较提交快照
如果你对特定文件的更改感兴趣,可以比较不同版本之间的差异,以确认 --amend
是否修改了某些内容。
git diff <previous_commit_hash> <amended_commit_hash>
这将显示两个提交之间的变化,如果看到只有简单的补充而不是新开发的功能,那可能是一次 --amend
操作。
通过这些方法,你应该能够判断最近的提交是否通过 git commit --amend
修改过。
我用的方案2 git reflog
确定完已经执行过git commit --amend
并且已经确认中间没人push过,那就git push origin pre_release --force-with-lease
执行后,再次git reflog
一下,已经符合预期了
题外话:
git push origin <branch_name> --force-with-lease
加上“-with-lease
”和不加 什么区别?
git push --force-with-lease
和 git push --force
都用于强制推送更改,但它们在处理可能的冲突时存在重要区别。
git push --force
-
直接覆盖:
- 使用
--force
时,Git 不会检查远程分支的状态,它会直接用本地分支的状态替换远程分支。这意味着,无论远程分支是否已经被其他人更新过,都会被你的推送内容所覆盖。
- 使用
-
风险:
- 这种操作可能导致数据丢失,特别是在团队协作中,如果其他协作者在你之后往同一分支提交了新的更改,你的强制推送将删除他们的更改。
git push --force-with-lease
-
安全性检查:
--force-with-lease
增加了一层保护机制。它在强制推送之前,会检查远程分支的状态(即最后一次拉取时的状态)是否与当前预期一致。
-
通过一致性校验:
- 如果没有发生变化(即远程 HEAD 指针仍然指向你上次看到的提交),推送就会进行。
- 如果远程分支已被其他人更新,则推送会被拒绝,从而避免覆盖他人的更改。
实际使用中的选择
-
单人项目或紧急修复:在个人项目或确定没有其他人正在处理某个分支时,可以使用
--force
。 -
团队协作和公共分支:在有多人同时工作的环境中,建议使用
--force-with-lease
,因为它提供了额外的安全检查,有助于防止意外的数据覆盖和丢失。
总之,--force-with-lease
是一个更安全的选项,因为它在进行强制推送之前进行了额外的远程状态验证,减少了误操作对他人贡献的影响。