忘提交文件,想合并提交,git commit --amend

问题背景:

  • 发版时 更新VersionInfo后直接commit push了,忘了修改changlog文件,想把changlog的修改和上次push合并在一起。

解决方案

如果你已经进行了提交并且忘记包含一个文件,但希望将这个文件合并到之前的一次提交中,可以使用 git commit --amend 来进行修改。以下是步骤:

  1. 添加文件到暂存区

    • 首先,确保你在工作目录中包含了想要添加的文件,然后将其添加到暂存区。
    git add <file_name>
    
  2. 使用 --amend 修改最后一次提交

    • 接下来,运行下面的命令来修改上一次提交,并包含新添加的文件。
    git commit --amend
    
  3. 编辑提交信息(可选)

    • 默认情况下,这将打开你的默认文本编辑器,允许你修改提交信息。如果不需要修改提交信息,可以直接保存并关闭编辑器。
  4. 强制推送到远程仓库(如果已推送过)

    • 如果你已经将原始提交推送到远程仓库,那么你需要使用 --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-leasegit push --force 都用于强制推送更改,但它们在处理可能的冲突时存在重要区别。

git push --force
  • 直接覆盖

    • 使用 --force 时,Git 不会检查远程分支的状态,它会直接用本地分支的状态替换远程分支。这意味着,无论远程分支是否已经被其他人更新过,都会被你的推送内容所覆盖。
  • 风险

    • 这种操作可能导致数据丢失,特别是在团队协作中,如果其他协作者在你之后往同一分支提交了新的更改,你的强制推送将删除他们的更改。
git push --force-with-lease
  • 安全性检查

    • --force-with-lease 增加了一层保护机制。它在强制推送之前,会检查远程分支的状态(即最后一次拉取时的状态)是否与当前预期一致。
  • 通过一致性校验

    • 如果没有发生变化(即远程 HEAD 指针仍然指向你上次看到的提交),推送就会进行。
    • 如果远程分支已被其他人更新,则推送会被拒绝,从而避免覆盖他人的更改。

实际使用中的选择

  • 单人项目或紧急修复:在个人项目或确定没有其他人正在处理某个分支时,可以使用 --force

  • 团队协作和公共分支:在有多人同时工作的环境中,建议使用 --force-with-lease,因为它提供了额外的安全检查,有助于防止意外的数据覆盖和丢失。

总之,--force-with-lease 是一个更安全的选项,因为它在进行强制推送之前进行了额外的远程状态验证,减少了误操作对他人贡献的影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值