【问题标题】:git reset upstream branchgit 重置上游分支
【发布时间】:2021-01-27 10:10:57
【问题描述】:

所以我的上游仓库的主分支有点乱。

上游分支的提交如下所示。

A - Latest commit
|
B
|
C - Bad commit
|
D - Commit I want the upstream master branch to be at.

在我的分叉分支上,我可以执行git reset --hard D。但是如何将这些更改应用回上游主分支。从分叉分支到上游分支创建 PR(拉取请求)时,没有显示任何更改。

注意:禁止在上游分支上直接提交,必须使用 Fork 的 Pull Request 来完成。

编辑 这就是我克隆远程存储库的方式。

git clone http://myrepo.git
git remote add upstream http://main-repo.git

现在 origin 和 upstream 如下所示。

origin - http://myrepo.git
upstream - http://main-repo.git

分叉存储库基本上是远程存储库的镜像克隆。在 bit bucket UI 上,有一个选项可以创建一个 fork 并在 origin 和 upstream 之间启用 fork 同步。

当我说分叉分支时,它意味着分叉存储库上的分支。

【问题讨论】:

  • 上游仓库是什么意思?您是否有权强制推送?如果上游仓库不是你的,那你为什么要重置别人的仓库?
  • @ChuckLu - origin 将是我的分叉存储库,upstream 是远程存储库。
  • @ChuckLu 并且没有权限强制推送上游仓库。
  • 仍然对你的描述感到困惑,你所说的分叉分支是什么意思?第一次听说,才知道github上fork repository的概念。
  • 其实对于repository的概念,比如user1在github上有一个repository1,比如user1/repository1。 user2 fork了user1的repository1,user2会在github user2/repository1上得到一个fork的repository。 User2 可以将分叉的 user2/repository1 克隆到本地文件夹 repository1。这里,user1/repository1 应该是上游仓库,user2/repository1 是一个简单的远程仓库。现在您可以在描述中明确说明您要更改哪个远程存储库(重写历史记录)?

标签: git github bitbucket


【解决方案1】:

如果需要通过拉取请求进行更改,则不能删除提交。

相反,您会想要还原;这会创建一个新的提交,它会逆转坏提交的影响。这两项更改都将成为历史的一部分。

像往常一样创建一个新分支,然后运行命令:git revert hash_of_C(在此替换提交 C 的哈希)。审核更改,如果需要,使用git commit --amend 微调提交消息,然后正常推送审核。

如果您绝对需要删除提交,则需要与项目负责人讨论。编辑已经属于上游master 的历史记录是对整个团队的重大干扰,很可能您会被告知要恢复。如果项目负责人同意提交 C 不能成为历史的一部分,他们可能会自己删除它,很可能是暂时允许自己直接推送到 master。整个团队也需要得到提醒。

【讨论】:

  • 同意您恢复单个提交的观点。git revert -m has_of_C 就像合并提交一样工作。但我正在考虑恢复所有提交,即 C、B、A 以便上游存储库是干净的并且在提交 D 时。可以实现这样的事情。在我现在的场景中,A 和 D 之间大约有 32 个提交,其中也包括合并,而直接提交只是包更新。所以恢复所有的提交是没有异议的。
  • 这需要强制推送到已经发布的主分支。只有项目负责人才能批准。
【解决方案2】:

您想要的操作是带有 --force 的 git push,因为您没有执行此操作的权限。
然后替代操作可能是还原操作,并且有一个优雅的解决方案可以让您还原多次提交。
How to revert multiple git commits?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2016-01-27
    • 2020-09-26
    • 1970-01-01
    • 2020-10-11
    • 2023-01-14
    • 1970-01-01
    相关资源
    最近更新 更多