[英]Cleanup git master branch and move some commit to new branch?
我在Github上有一个repo的克隆,我在其中为上游创建了一个新功能。 问题是,我在我的主分支中做了那个,它还包含我从其他克隆中提取的其他内容。 这完全打破了我创建合理拉取请求的能力。
所以我想做以下事情:
并且,在将来,我将在分支机构中完成所有工作并创建拉取请求,同时离开我的主分支,只需合并来自上游的任何内容。
我的问题是:
建立一个新的分支来容纳东西
$ git branch old_master
发送到远程进行备份(只是加入)
$ git checkout old_master
$ git push origin old_master
在开始修改内容之前,将本地主服务器重置为提交
$ git checkout master
$ git reset --hard 037hadh527bn
合并来自上游主站的更改
$ git pull upstream master
现在DELETE master远程repo
在github上,如果没有先进入fork的admin部分并将默认分支暂时设置为master以外的其他东西,这将无法工作,因为它们会尝试保护您不要吹掉东西。
$ git push origin :master
并重新创建它
$ git push origin master
在github上,您现在应该将默认分支设置回master
这几乎是一种合理的方法,但你可能会把事情搞得一团糟。 首先要做的是创建一个新的分支,当前的master
分支,这样你就不会失去对你已经完成的工作的方便引用:
git branch mywork-orig master
之后,您可以将master
重置为上游视图(假设您已检出master
):
git reset --hard origin/master
然后,您可以使用预期的更改创建自己的分支:
git checkout -b mywork
进行你想要的更改(从mywork-orig等中挑选它们),并发送拉取请求。
这已经很晚了,但是没有人看到这么简单的方法:
# 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
。 之后你就已经有了新的devel分支。
你想做的事情是完全可能的,只是不按你要求的顺序。 似乎其他人忘了你可以在不实际应用它们的情况下fetch
远程更改。 让生活变得更加简单。
git reset origin/master
git checkout -b new-branch
git cherry-pick <hash>
或者你可以这样做:
git checkout -b new-branch
git rebase -i origin/master
git checkout master
git reset origin/master
根据git push你可以使用git push origin +dev:master
来:
使用dev分支更新原始存储库的主分支,允许非快进更新。 这可能会在源存储库中悬挂未引用的提交。
我不确定这是否适用于github。 我现在没有任何需要消除的东西。 :)
它应该允许你使用git rebase -i
让你的本地主人看起来你想要,然后将结果推送到github。
或者,您可以删除github上的主分支 ( git push origin :master
),然后从本地更正的主服务器重新填充它。 我有一种感觉,github可能会阻止你这样做,如果它是默认分支(可能是主人 )。 如果是这种情况,请进入存储库的“管理”部分,并将默认值更改为另一个分支。
您可以使用git push
命令将任意更改集推送到git存储库中的任意ref。 在这种情况下,您需要确定要还原到的变更集的哈希值,并将其设置为远程存储库中主分支的头部。 假设该远程存储库被称为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)
@Novelocrat建议我几乎采用相同的方法。 最终从master
分支的当前位置创建备份分支:
git branch mywork-orig master
在你的情况下,我认为origin
是你的github fork,而upstream
是你分叉的地方。 因此,当您签署本地master
时,您应该:
git reset --hard upstream/master
这将把它重置为upstream
master
位置。 然后你还必须把它推到你的github上的fork:
git push origin +master
然后从新重置的master
分支创建新分支,现在应该与upstream/master
分支相同:
git checkout -b mywork
因为您在旧的master
分支上进行了很多合并,所以您可能不会对您创建的新功能分支进行大量选择。 樱桃选择你可以做的提交,然后简单地(或不那么简单;)重新创建你不能轻易挑选的那些。
我有一种合乎逻辑且尽可能安全的方法。 假设:
将本地坏主分支移动/重命名为my-bad-master。
git branch -m master my-bad-master
更新本地主分支以匹配原始主分支。
git pull origin master:master
将origin的master分支保存到名为old-master的分支
git branch old-master master
为安全起见,将旧主分支推送到原点
git push origin old-master:old-master
checkout master
对主分支进行任何更改。 !!!! 在完成之前,请确保不会对主分支进行更改!
完成后,强制新的主分支到达原点。
git push -f origin master:master
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.