清理git master分支并将一些提交移动到新的分支?
我在Github上有一个repo的克隆,我在其中为上游创build了一个新的特性。 问题是,我在我的主分支中也是这样,它也包含了其他我从其他克隆中抽取的东西。 这完全打破了我创造合理的拉动要求的能力。
所以我想要做到以下几点:
- 恢复我的主分支是完全一样的上游主。
- 创build一个新的分支。
- 将我的一些旧提交移到新分支。
- 在分支上创build一个拉取请求。
而且,将来我会在分支机构做所有的工作,并且在离开我的主分支的同时创build请求,并且合并来自上游的任何东西。
我的问题是:
- 这是一个合理的方法吗?
- 我将如何做第一步和第三步?
做一个新的分支拿东西
$ 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从他们等),并发送拉请求。
-  git reset origin/master
-  git checkout -b new-branch
-   git cherry-pick <hash>为每个提交
- 创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 
 这将重置到upstream的master 。 那么你也必须把它推到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