【问题标题】:Rewriting remote git branch without force push or delete permissions在没有强制推送或删除权限的情况下重写远程 git 分支
【发布时间】:2020-06-11 18:31:24
【问题描述】:

我编写了一个 C# .NET 核心程序的初稿作为概念证明,它作为 master 和 dev 分支上传。不幸的是,我忘记使用 .gitignore 文件,它上传了所有调试和发布构建文件。

从那以后,我重写了整个程序以提高工作效率,我想用它来重新定位/替换整个 master/dev 分支。我们正在使用 DevOps,但我一直使用 TFS,我不明白为什么 git “拒绝”推送我的分支。它希望我删除所有过时的远程开发工作,然后在我这样做时不合并它们。还尝试删除远程开发分支中的每个文件,所以它现在在 DevOps 站点上是空的。管理员不会给我强制推送和分支删除权限,可能是因为我不熟悉命令。

如何用我的本地代码重写 dev 和 master 分支?

推送我的代码(我在 dev 分支上并且已经完成了“git add.”和“git commit -m “Comment”):

git push -f origin dev
Total 0 (delta 0), reused 0 (delta 0)
To [remote repository]
 ! [remote rejected] dev -> dev (TF401027: You need the Git 'ForcePush' permission to perform this action. Details: identity 'a7cf8844-7bf6-48af-88cc-3063f00ff148\[my credentials]', scope 'branch'.)
$ git pull origin dev
From [remote repository]
 * branch            dev        -> FETCH_HEAD
fatal: refusing to merge unrelated histories

来自一个新的克隆:

git clone [remote repository]
Cloning into 'MyProject'...
remote: Azure Repos
remote: Found 407 objects to send. (316 ms)
Receiving objects: 100% (407/407), 6.47 MiB | 332.00 KiB/s, done.
Resolving deltas: 100% (61/61), done.

$ cd MyProject

$ git checkout -b dev
Switched to a new branch 'dev'

$ git pull origin dev
From [remote repository]
 * branch            dev        -> FETCH_HEAD
fatal: refusing to merge unrelated histories

【问题讨论】:

  • 抱歉,问题到底是什么?如果不使用某种force,就无法推送重写的历史记录,就是这样。那么你到底做了什么,你想做什么?显示实际的 git 命令和 git 回复你的内容。
  • 嗯,“拒绝合并无关历史”的问题很容易解决,就说--allow-unrelated-histories
  • @matt 是解决方法的催化剂,感谢您的帮助。
  • @secretclean 如果您的问题得到解决,请尽可能Accept your reply as an Answer,这对阅读此主题的其他社区成员会有所帮助。
  • @CeceDong-MSFT 我所有的问题和答案都被否决了。显然我只是个白痴,所以我认为这对任何人都没有好处。

标签: git azure-devops


【解决方案1】:

Git(实际上是服务器)不允许这样做。

Git 拒绝所有不只是向分支添加提交的推送。

如果要改写历史,需要强制推送。

如果您重写并强制推送某些内容并且有基于它的工作,那么这些人也需要在他们的机器上修复它,因为他们有未重写的版本。

我还建议您使用--force-with-lease 而不是正常的强制推送,因为如果遥控器包含您不知道的工作,它会拒绝。

【讨论】:

  • 你第一次更正确:“Git 不允许这样做”。服务器上运行的东西与本地计算机上运行的东西(git)完全相同。我们可以谈论“我们的” git 和“他们的” git,或者“本地” git 和“远程” git,但这里禁止推送的只是普通的旧 git。 — 另外,请注意,当 git 拒绝推送时,它关心的不是它“不只是将提交添加到分支”,它关心的是不应允许现有的引用提交变为未引用。
  • 我想说服务器端是问题所在。我知道这就是 git 的工作原理。
【解决方案2】:

成功地重写了远程分支,而无需通过以下方式强制推送:

  1. 备份本地开发仓库。

  2. 在本地重新创建远程仓库:

git clone [remote repository]

$ cd MyProject

$ git checkout -b dev

$ git pull origin dev --allow-unrelated-histories
  1. 用本地文件备份替换新的开发仓库文件。

  2. 提交更改并再次推送:

$ git add .

$ git commit -m "Comments"

$ git push origin dev

【讨论】:

  • 请注意,这并没有重写任何东西。
猜你喜欢
  • 2023-02-02
  • 2016-06-23
  • 2013-12-05
  • 2022-01-15
  • 2011-09-10
  • 2016-07-08
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
相关资源
最近更新 更多