清理git master分支并将一些提交移动到新的分支?

我在Github上有一个repo的克隆,我在其中为上游创build了一个新的特性。 问题是,我在我的主分支中也是这样,它也包含了其他我从其他克隆中抽取的东西。 这完全打破了我创造合理的拉动要求的能力。

所以我想要做到以下几点:

  1. 恢复我的主分支是完全一样的上游主。
  2. 创build一个新的分支。
  3. 将我的一些旧提交移到新分支。
  4. 在分支上创build一个拉取请求。

而且,将来我会在分支机构做所有的工作,并且在离开我的主分支的同时创build请求,并且合并来自上游的任何东西。

我的问题是:

  1. 这是一个合理的方法吗?
  2. 我将如何做第一步和第三步?

做一个新的分支拿东西

$ git branch old_master 

发送到远程备份(只是incase)

 $ git checkout old_master $ git push origin old_master 

在开始修改东西之前,将本地主人重置为提交

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

合并来自上游主机的更改

 $ git pull upstream master 

现在删除主远程回购

在github上,如果没有首先进入fork的pipe理部分,并且临时设置默认分支到除master之外的其他部分,则github将无法工作,因为他们尝试并保护您不会将东西吹走。

 $ git push origin :master 

并重新创build它

 $ git push origin master 

在github上,你现在应该把默认分支设置回主

这几乎是一个合理的方法,但是你可能会把事情搞乱。 首先要做的是创build一个新的分支,让你现在的master ,这样你就不会失去对已经完成的工作的方便的引用:

 git branch mywork-orig master 

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

 git reset --hard origin/master 

那么你可以使你自己的分支与预期的变化:

 git checkout -b mywork 

做出你想要的改变(樱桃,从我的工作orig从他们等),并发送拉请求。

  1. git reset origin/master
  2. git checkout -b new-branch
  3. git cherry-pick <hash>为每个提交
  4. 创build你的拉请求。

或者你可以这样做:

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

这是晚了,但没有看到任何人提出这个更简单的方法:

 # 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提交,或者重新设置当前master上的更改。 之后,您将已经拥有新的devel分支。

你想要做的是完全可能的,只是不按照你问的顺序。 而且似乎别人忘记了你可以在不实际应用的情况下fetch远程更改。 使生活更简单。

根据git推你可以使用git push origin +dev:master来:

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

我不确定这是否适用于github。 我现在没有任何东西需要消灭。 🙂

它应该允许你使用git rebase -i来使你的本地主人看起来像你想要的,然后把结果推到github。


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

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

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

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

如果你想强制“主人”看起来像“遥控/起源/主”,你可以做一个强制拉。

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

@Novelocratbuild议几乎完全一样的方法,我会做的。 从master分支的当前位置明确创build一个备份分支:

 git branch mywork-orig master 

在你的情况下,我认为origin是你的github分叉, upstream是你分叉的地方。 出于这个原因,当你有你的当地master签出你应该这样做:

 git reset --hard upstream/master 

这将重置到upstreammaster 。 那么你也必须把它推到github上的fork上:

 git push origin +master 

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

 git checkout -b mywork 

因为您在旧的master分支上进行了很多合并,所以您可能无法在您创build的新function分支上进行大量select。 樱桃挑选你可以,然后简单地(或不那么简单)重新创build那些你不能轻易樱桃采摘。

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

  • 您必须有权强制更新来源于原点。
  • 它假设没有其他人拉动任何要删除的节点。
  • 当您在本地修复主分支时,您可以防止更新源主分支。

移动/重命名本地坏主分支到我的坏主。

 git branch -m master my-bad-master 

更新您的本地主分支以匹配原点的主分支。

 git pull origin master:master 

将原始的主分支保存到名为old-master的分支

 git branch old-master master 

为了安全起见,将旧主分支推到原点

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

对主分支进行任何更改。 !!!! 确保没有任何改变是由原来的主分支,直到你完成!

完成后,强制新的主分支到达原点。

 git push -f origin master:master