`git push --force` 的其他后果?

2024-02-03

关于强制执行的问题和解答git push不难找到(here https://stackoverflow.com/questions/11184267/how-to-push-to-repo-after-doing-git-commit-amend are two https://stackoverflow.com/questions/5509543/how-to-properly-force-a-git-push)。标准答案是这样的:

如果你必须强制git push,从技术上讲你can--force选项,但程序上你不应该因为可能有人已经拉了,小猫就会死在某个地方。

我认为这通常是明智的建议 - 更安全的方法是再次提交,修复你破坏的任何东西。但是,举例来说,我知道(神奇地)还没有人拉取提交。或者更好的是,这是一个私人仓库,因此一开始就不存在破坏其他人克隆的危险。

有没有other[负面]后果--force推动,特别是技术后果?也许它会在远程造成一些额外的垃圾,或者它破坏了 X Corps 分析工具的 1.2.3 版本,或者它使以后的变基变得更加混乱,等等。有什么吗?

EDIT 1:我有自己的轶事证据表明--force推送私人仓库不会seem造成任何问题。不过,我对感知不感兴趣;我正在寻找此类参考资料和/或证据。


为了补充托雷克的出色答案:

强制推送可能会导致以后的合并出现问题。

问题:

如果您强制推送分支 A,则会从该分支中​​删除一些现有的提交(否则您不需要强制)。如果(如 torek 的答案中所述)这些提交也从另一个分支 B 引用,那么它们将保留在该分支中。如果稍后合并两个分支 A 和 B,A 将包含“新”(强制)提交,B 将包含“旧”提交。

在这个情况下git merge可能不会做你想做的事。在最好的情况下,您会遇到合并冲突。最坏的情况是,你不会,但结果仍然是错误的。例如,如果您使用以下命令从 A 中删除了提交 c1git rebase -i,如果 c1 也在 B 中,如果您合并 A 和 B,它将被重新引入。这可能会默默地重新引入错误:-(。

因此,如果您强制推送,请确保您删除的提交未被其他分支/标签引用(或者也强制推送这些分支/标签)。


已删除提交“返回”的插图

运行下面的 bash 脚本。该脚本创建一个 git 存储库,并使用以下提交分支 master、branch1:

  • 良好的承诺(分支1)
  • 错误提交(主)
  • Initial

Then it:

  • uses git reset --hard丢弃来自 master 的“错误提交”
  • 将branch1合并到master中

脚本的输出:

Initialized empty Git repository in ....
[... creating commits ...]
### Bad commit in history:
* 7549dcc (HEAD, master) bad commit
* 31afec8 Initial
### Removing bad commit:
HEAD is now at 31afec8 Initial
### Bad commit no longer in history:
31afec8 (HEAD, master) Initial
### Merging branch1:
Updating 31afec8..be801e5
Fast-forward
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 b
 create mode 100644 c
### Bad commit is back!
be801e5 (HEAD, master, branch1) good commit
7549dcc bad commit
31afec8 Initial

正如您所看到的,“错误提交”已从 master 中删除,使用git reset --hard。然而,“bad commit”仍然包含在branch1中,因此当branch1合并到master时,“bad commit”返回。

Note:这个示例实际上并不强制推送,但如果您使用上游存储库,则必须在删除错误提交后强制推送 - 结果将是相同的。

剧本:

#!/bin/bash
set -e
if [ -e gitrepo ]; then echo "Please remove gitrepo"; exit 1; fi

git init gitrepo; cd gitrepo; git config core.pager cat
touch a; git add a; git commit -m Initial
touch b; git add b; git commit -m "bad commit"
git checkout -b branch1; touch c; git add c; git commit -m "good commit"
git checkout master

echo "### Bad commit in history: "
git log --oneline --decorate

echo "### Removing bad commit: "
git reset --hard HEAD~1

echo "### Bad commit no longer in history: "
git log --oneline --decorate

echo "### Merging branch1: "
git merge branch1

echo "### Bad commit is back!"
git log --oneline --decorate
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

`git push --force` 的其他后果? 的相关文章

  • 如何使用 ClearCase 执行递归结帐?

    我想查看指定文件夹的所有子目录中的所有文件 使用 GUI 来执行此操作很痛苦 因为没有递归结帐选项 请注意 ClearCase 以文件为中心 而不是以存储库为中心 如 SVN 或 CVS 这意味着签出所有文件很少是一个好的解决方案 并且使用
  • gitlab 上的权限被拒绝(公钥)

    我的问题是我无法从 GitLab 推送或获取 不过 我可以克隆 通过 HTTP 或通过 SSH 当我尝试推送时出现此错误 权限被拒绝 公钥 致命 无法从远程存储库读取 从我看过的所有线程中 这是我所做的 在我的计算机上设置 SSH 密钥并将
  • 无法从我的电脑上使用 traefik 后面的 gitlab 进行 git 克隆

    这是我的 gitlab 和 traefik 配置 version 3 7 services gitlab web image gitlab gitlab ce latest restart always hostname gitlab ro
  • Visual Studio Code 内置故事,用于查看 git 提交历史记录并对其内容进行比较

    In this https stackoverflow com questions 37899765 how can i view the git history in visual studio code 60013101 noredir
  • gitlab 请求将分支 A 合并到开发中(落后 3 次提交)我应该担心吗?

    在 gitlab 中创建合并请求时 我经常收到一条消息 请求将分支 A 合并到开发中 x 提交落后 gitlab想告诉我什么 我应该担心还是需要修复某些东西 什么 一段时间后合并请求在项目中打开时 由于其他人合并了自己的更改 您尝试合并到的
  • 致命:不是 git 存储库(或任何父目录):.git [重复]

    这个问题在这里已经有答案了 当我尝试推送 github com 上的现有存储库时 当我输入命令时 网站提示我将其输入终端 我收到了以下致命错误消息 Not a git repository or any of the parent dire
  • git Blame:合并后正确的作者

    GIT 合并引入了新的提交 这会导致 git Blame 问题 合并的行似乎是由进行合并的开发人员提交的 我可以理解这种情况冲突的变化 因为他解决了冲突 但是有没有办法让非冲突线路不发生这种情况呢 一些 git Blame 的选择 如果没有
  • 如何将 GIT 调用的输出获取到批处理脚本中的变量中?

    我有一个 git 命令来获取当前存储库的最新 SHA 如下所示 git log pretty format H n 1 我有一个 Windows 批处理脚本 我想按如下方式使用它 SET CURRENT SHA 但我不知道如何将从 git
  • 您的分支比“origin/master”领先 3 个提交

    我在运行时收到以下信息git status Your branch is ahead of origin master by 3 commits 我读过其他一些帖子 解决这个问题的方法是运行git pull rebase但是 rebase
  • 如何禁用 GitHub 中的拉取请求?

    我试图了解如何禁用 github 中的 拉取请求 问题一 我们正在尝试使用变基工作流程 这意味着如果不是快速推进 那么使用拉取请求可能会有害 一种解决方案 为我想要禁用拉取请求的分支设置分支权限 或者将我添加为任何进入 master 的内容
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • Jenkins GIT 包含从未构建过的区域

    我正在尝试使用包含区域在 Jenkins 中构建我的工作 但每当选中此选项时 民意调查结果总是说未检测到任何更改 我尝试了许多不同的路径 以及使用工作区进行 不进行强制轮询 结果是轮询从未检测到任何更改 但一旦我删除这些选项 它们就会在下一
  • SSL 适用于浏览器、wget 和curl,但不适用于 git

    我有一个网站 用于托管 redmine 和几个 git 存储库 这非常适合 http 但我无法使用 https 进行克隆 即 git clone http mysite com git test git 工作正常 但是 git clone
  • Spring Cloud Config - 不允许使用 git-upload-pack

    我有一个在 docker 环境中运行的 spring boot 应用程序 它连接到 Git 存储库以获取应用程序的配置 我的问题是 当尝试获取 properties 文件时 应用程序有时会出错 这很奇怪 因为如果我更改用户和密码 同一个应用
  • 为别名命令添加“git help”?

    我已经实现了一个 Git 命令并使用 git 别名将其连接到 Git 但是有没有办法连接 Git 帮助 我在 Windows 上运行 如果我发出git help mycmd我收到一个弹出窗口 告诉我 Git 找不到 git mycmnd h
  • Git:以新名称签出旧版本的目录

    如何以新名称查看目录的先前版本 我一直都有一个目录foo在我的仓库中 我想创建一个目录foo old在我当前的工作树中 其内容是HEAD 2 foo 我同时需要两个版本 以确保它们给出相同的结果 测试这需要相当多的代码 并且需要同时提供两个
  • 如何恢复已删除的远程分支

    我们的远程主分支被删除 我有主存储库的本地副本 但它已经过时了 我可以通过将最后一个已知的提交哈希值插入 URL 来查看 github 中的分支 但未能成功恢复它 我尝试了几个步骤来恢复它 git reset hard 16deddc05c
  • 如何获取 git 存储库中所有文件的计数?

    如何获取 git 存储库中当前所有文件的计数 您可以使用以下命令获取 git 存储库中所有跟踪文件的计数 git ls files wc l 命令分解 The git ls files命令本身打印出存储库中所有跟踪文件的列表 每行一个 Th
  • Android repo 脚本创建的 .repo/projects/ 中的裸 git 存储库的用途是什么?

    The 安卓源码 http android git kernel org 由以下人员管理repo http source android com source version control html 使用 repo 同步时 一个名为 re
  • 删除 Xcode 项目的源代码控制

    我在 Xcode 项目上使用源代码控制已经有一段时间了 但现在我不想使用源代码控制 如何从 Xcode 中的项目中删除源代码控制 有三种方法 方法 1 将禁用所有项目的源代码管理 方法 2 将删除所有项目的单个存储库的链接 方法 3 将删除

随机推荐