如何正确强制执行 Git Push

如何正确强制执行 Git Push

技术背景

在使用 Git 进行版本控制时,有时我们需要强制推送本地的提交到远程仓库。例如,当我们错误地推送了敏感数据,或者想要覆盖远程仓库的历史记录时。然而,强制推送是一个危险的操作,可能会导致其他人的提交丢失,因此需要谨慎使用。

实现步骤

基本的强制推送命令

如果要强制推送本地分支到远程仓库,可以使用以下命令:

1
git push origin <your_branch_name> --force

或者指定特定的仓库地址:

1
git push https://git.... --force

-f--force 的简写,所以以下命令同样有效:

1
git push origin <your_branch_name> -f

使用 push --delete

如果 push --force 不起作用,可以尝试 push --delete

1
2
3
git reset --hard HEAD~3  # 重置当前分支到 3 个提交之前
git push origin master --delete # 删除远程分支
git push origin master # 正常推送

使用 push --force-with-lease

git push --force-with-lease 是一个更安全的强制推送选项,它会检查远程分支是否在你上次获取后被修改过,如果被修改过则会报错并停止推送:

1
git push <remote> <branch> --force-with-lease

本地分支 A,强制推送本地分支 B 到远程分支 C

1
git push --force origin B:C

处理敏感数据泄漏

如果错误地推送了敏感数据,可以尽快强制推送覆盖:

1
git push --force origin <your_branch_name>

但要注意,数据可能仍然存在于远程仓库,除非进行垃圾回收或其他清理操作。

合并分支并强制推送

1
2
3
4
5
6
7
git fetch desiredOrigin
git checkout -b master desiredOrigin/master # 获取远程 master 分支
git checkout currentBranch # 切换到目标分支
git merge -s ours master # 使用 ours 策略合并 master 分支
git checkout master # 切换到 master 分支
git merge currentBranch # 将解决后的更改合并到 master 分支
git push desiredOrigin master

核心代码

强制推送当前分支

1
git push origin <your_branch_name> --force

安全的强制推送

1
git push <remote> <branch> --force-with-lease

撤销最近 3 个提交并强制推送

1
2
git reset HEAD~3
git push origin master --force

最佳实践

  • 避免在公共仓库强制推送:强制推送会覆盖远程仓库的历史记录,可能会导致其他人的提交丢失,因此在公共仓库中应尽量避免使用。
  • 使用 push --force-with-lease:如果确实需要强制推送,建议使用 push --force-with-lease 来避免覆盖他人的更改。
  • 使用撤销操作:如果需要撤销之前的提交,建议使用 git revert 而不是强制推送。
1
2
3
git revert -n HEAD~3..HEAD  # 准备一个新的提交来撤销最近 3 个提交
git commit -m "sorry - revert last 3 commits because I was not careful"
git push origin master # 正常推送

常见问题

强制推送导致他人提交丢失

强制推送会覆盖远程仓库的历史记录,导致其他人的提交丢失。为了避免这种情况,应尽量使用 push --force-with-lease 或撤销操作。

push --force 不起作用

如果 push --force 不起作用,可以尝试使用 push --delete 先删除远程分支,然后再正常推送。

敏感数据已被推送

如果错误地推送了敏感数据,应尽快强制推送覆盖,并进行垃圾回收或其他清理操作。但要注意,数据可能已经被其他人获取,因此应及时通知相关人员。