清理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