【问题标题】:Cleanup git master branch and move some commit to new branch?清理 git master 分支并将一些提交移动到新分支?
【发布时间】:2011-05-06 19:49:14
【问题描述】:

我在 Github 上有一个 repo 的克隆,我在其中为上游创建了一个新功能。问题是,我在我的 master 分支中这样做了,该分支还包含我从其他克隆中提取的其他内容。这完全破坏了我创建合理拉取请求的能力。

所以我想做以下事情:

  1. 将我的 master 分支恢复为与上游 master 完全相同。
  2. 创建一个新分支。
  3. 将我的一些旧提交移至新分支。
  4. 从分支创建拉取请求。

而且,在未来,我将在分支中完成我的所有工作,并从它们创建拉取请求,同时不理会我的主分支并合并来自上游的任何内容。

我的问题是:

  1. 这是一种合理的方法吗?
  2. 我将如何实际执行第 1 步和第 3 步?

【问题讨论】:

  • 我现在有了一个新分支,里面有我的旧东西,我真的只想摆脱我的 origin/master 并通过从上游/master 获取所有内容并将其推送到我的 master 来创建它...我该怎么做..这一切都没有运气。

标签: git github


【解决方案1】:

新建一个分支来存放东西

$ git branch old_master

发送到远程进行备份(以防万一)

$ git checkout old_master
$ git push origin old_master

在你开始修改之前将本地 master 重置为提交

$ git checkout master
$ git reset --hard 037hadh527bn

合并来自upstreammaster的更改

$ git pull upstream master

现在删除远程仓库上的 master

在 github 上,如果不先进入 fork 的管理部分并将默认分支暂时设置为 master 以外的其他内容,因为他们试图保护你不被吹走,这将无法工作。

$ git push origin :master

然后重新创建它

$ git push origin master

在 github 上,您现在应该将默认分支设置回 master

【讨论】:

  • +1 获取该 github 提示。有一天我可能会感谢他们试图拯救我的背后,但这一次我需要的是围绕他们的保护工作;)
  • 我在git pull upstream master 部分有点困惑。我最后做了以下似乎对我有用的事情。 git pull https://github.com/project/project.git master
  • 如何在 github 上找到 admin 部分?
【解决方案2】:

这几乎是一种合理的方法,但您可能会让事情有些混乱。首先要做的是创建一个新的分支,你当前的master 指向,这样你就不会丢失对你已经完成的工作的方便参考:

git branch mywork-orig master

之后,您可以将master 重置为上游的视图(假设您已签出master):

git reset --hard origin/master

然后您可以使用预期的更改创建自己的分支:

git checkout -b mywork

进行您想要的更改(从 mywork-orig 等中挑选它们),并为此发送拉取请求。

【讨论】:

  • 重置无效。然后我尝试对上游/主服务器进行重置,因为这就是我想要的。我想在本地 master 分支中拉入 upstream/master,然后将其推送到 o origin/master (这是我的克隆 github 本身)。
  • 别忘了git reflog 让你摆脱困境!
【解决方案3】:

这已经晚了,但没有看到有人建议这个更简单的方法:

# make sure we're in master
git checkout master
# create new branch from current master
git branch tmp_master
# grab most recent changes from upstream w/o applying them
git fetch upstream
# force reset local master to match upstream/master
git reset --hard upstream/master

您已将本地更改保存到 tmp_master 并强制更新 master 以匹配最新的 upstream/master。现在让origin/master 看起来像upstream/master

git push -f origin master

现在继续cherry-pick 提交,或者rebase 在当前master 之上进行更改。之后,您将拥有新的开发分支。

你想做的事是完全有可能的,只是没有按照你要求的顺序。似乎其他人忘记了您可以fetch 远程更改而无需实际应用它们。让生活变得更简单。

【讨论】:

    【解决方案4】:
    1. git reset origin/master
    2. git checkout -b new-branch
    3. git cherry-pick <hash> 每次提交
    4. 创建您的拉取请求。

    您也可以这样做:

    • git checkout -b new-branch
    • git rebase -i origin/master
    • (挑选并选择您的提交)
    • git checkout master
    • git reset origin/master

    【讨论】:

    • git rebase -i 是一件了不起的事情。一开始可能会有点不知所措,但非常值得学习。
    • Rebase 让我陷入了合并和冲突的困境,最后我在本地有一个无法正常工作的主分支,但我的提交中仍然有一些我不想要的旧东西。
    • 规则一:永远不要直接在master中工作。这样,如果(何时)你把事情搞砸了,只需在 master 上创建一个新分支并重试是一件简单的事情。如果您注意到,Talljoe 的说明明确告诉您签出一个新分支来执行此操作,并将本地 master 重置为远程 master 所在的位置。
    • 是的.. 但问题是我在 github 上的远程主机都搞砸了,我需要将它重置为与上游主机相同......然后我可以按照建议工作,但是如何让我在 github 上的主人变得干净??
    【解决方案5】:

    根据git push,您可以使用git push origin +dev:master

    使用 dev 分支更新原始存储库的主分支,允许非快进更新。这可能会使原始存储库中未引用的提交悬而未决。

    我不确定这是否适用于 github。我现在没有什么需要清除的。 :)

    它应该允许您使用git rebase -i 使您的 本地 master 看起来像您想要的那样,然后将结果推送到 github。


    或者,您可以delete the master branch on github (git push origin :master) 然后从您的本地、已更正的主人重新填充它。我有一种感觉,如果它是默认分支(可能是 master ),github 可能会阻止你这样做。如果是这种情况,请进入存储库的管理部分并暂时将默认设置更改为另一个分支。

    【讨论】:

    • 用另一个替换主分支的非常有效和简单的方法。非常感谢!
    【解决方案6】:

    @Novelocrat 提出了与我几乎完全相同的方法。明确地从您的master 分支的当前位置创建一个备份分支:

    git branch mywork-orig master
    

    在您的情况下,我认为 origin 是您的 github 分叉,upstream 是您从哪里分叉的。因此,当您签出本地 master 时,您应该这样做:

    git reset --hard upstream/master
    

    这会将其重置为upstreammaster 所在的位置。然后你还必须将它推送到你在 github 上的 fork:

    git push origin +master
    

    然后从新重置的master 分支创建新分支,现在应该与upstream/master 相同:

    git checkout -b mywork
    

    因为您已经在旧的 master 分支上进行了如此多的合并,所以您可能无法在您创建的新功能分支上挑选太多。挑选你可以挑选的提交,然后简单地(或不那么简单;)重新创建那些你不能轻易挑选的提交。

    【讨论】:

    • git reset --hard upstream/master 似乎无法正常工作。我已经做到了,该项目现在甚至没有构建,即使我可以构建上游的本地克隆就好了。东西还在。不同。
    • 提示:保持gitk --all & 始终打开,在您运行的每个 CLI 命令之间刷新它。这样可以很好地了解每个头的位置以及每个命令的作用。
    • 谢谢..顺便说一句。 wewals的答案是解决方案。即将向您发送拉取请求。下一个版本?
    【解决方案7】:

    您可以使用git push 命令将任意更改集推送到 git 存储库中的任意引用。在这种情况下,您需要确定要恢复到的变更集的哈希值,并将其设置为远程存储库中主分支的头部。假设该远程存储库名为origin,您可以使用以下内容,其中XXXX 是您要恢复到的更改的哈希:

    git push -f origin XXXX:refs/heads/master
    

    -f 开关将强制更改,因为默认情况下 git 不允许您将非快进更改推送到远程存储库,因为如果从您的存储库克隆了其他存储库,这可能会导致严重问题。

    【讨论】:

    • 所以 XXXX 将是我想镜像到我的远程主控的上游主控的最新参考,对吗?这会杀死我从 master 制作的分支,还是不会保留该分支中的旧状态?
    • 是的,XXXX 将是您想成为新的远程主控头的最新参考上游主控。我不确定它会对您创建的分支做什么。它很可能会保留,因为 git 存储库将包含所有旧信息,即使它没有在任何地方引用。为了安全起见,您始终可以在进行这些更改时克隆您关心的所有内容并将其离线存储,这样如果它不起作用,您就有备份。
    【解决方案8】:

    如果您想强制“master”看起来像“remotes/origin/master”,您可以强制拉取。

    $ git pull +master:master
       From git://github.com/matthewmccullough/hellogitworld
       + 1d22ca0...2a52e96 master     -> master  (forced update)
    

    【讨论】:

      【解决方案9】:

      我有一种合乎逻辑且尽可能安全的方法。假设:

      • 您必须有权强制更新到 master on origin。
      • 它假定没有其他人拉出任何即将被删除的节点。
      • 在本地修复 master 分支时,您可以阻止更新 master 分支。

      将本地坏 master 分支移动/重命名为 my-bad-master。

      git branch -m master my-bad-master
      

      更新您的本地 master 分支以匹配源的 master 分支。

      git pull origin master:master
      

      将 origin 的 master 分支保存到名为 old-master 的分支

      git branch old-master master
      

      为了安全起见,将 old-master 分支推送到 origin

      git push origin old-master:old-master
      checkout master
      

      对主分支进行任何更改。 !!!!确保在完成之前不对 master 分支的原点进行任何更改!!!!

      完成后,强制新的 master 分支上升到原点。

      git push -f origin master:master
      

      【讨论】:

        猜你喜欢
        • 2011-03-11
        • 2011-04-12
        • 2022-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-30
        • 1970-01-01
        相关资源
        最近更新 更多