繁体   English   中英

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

[英]Cleanup git master branch and move some commit to new branch?

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

所以我想做以下事情:

  1. 恢复我的主分支与上游主分支完全相同。
  2. 创建一个新分支。
  3. 将我的一些旧提交移动到新分支。
  4. 在分支机构上创建拉取请求。

并且,在将来,我将在分支机构中完成所有工作并创建拉取请求,同时离开我的主分支,只需合并来自上游的任何内容。

我的问题是:

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

建立一个新的分支来容纳东西

$ 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远程更改。 让生活变得更加简单。

  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 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM