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

时间:2011-05-06 19:49:14

标签: git github

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

所以我想做以下事情:

  1. 将我的主分支恢复为与上游主分支完全相同。
  2. 创建一个新分支。
  3. 将我的一些旧提交移至新分支。
  4. 从分支机构创建拉取请求。
  5. 而且,将来,我将在分支机构中完成所有工作,并在离开我的主分支机构的同时创建拉取请求,并将所有来自上游的内容合并。

    我的问题是:

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

9 个答案:

答案 0 :(得分:64)

建立一个新分支来保存东西

$ git branch old_master

发送到远程进行备份(只是加入)

$ git checkout old_master
$ git push origin old_master

在开始修改内容之前将本地主服务器重置为提交

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

合并来自upstream

的更改
$ git pull upstream master

现在在远程仓库上删除master

在github上,如果没有首先进入fork的admin部分并将默认分支暂时设置为master以外的其他东西,这将无法工作,因为它们会尝试保护您不要吹掉东西。

$ git push origin :master

重新创建

$ git push origin master

在github上,您现在应该将默认分支设置回主

答案 1 :(得分:8)

这几乎是一种合理的方法,但你可能会把事情搞得一团糟。首先要做的是创建一个新的分支,当前master点,这样你就不会失去对你已经完成的工作的方便参考:

git branch mywork-orig master

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

git reset --hard origin/master

然后,您可以根据预期的更改建立自己的分支:

git checkout -b mywork

进行你想要的更改(从mywork-orig等中挑选它们),并发送拉取请求。

答案 2 :(得分:4)

这已经很晚了,但是没有人看到这么简单的方法:

# 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之上的更改。之后你就已经有了新的开发分支。

你想做的事情是完全可能的,只是不按你要求的顺序。并且似乎有人忘了你可以fetch远程更改而不实际应用它们。让生活变得更加简单。

答案 3 :(得分:3)

  1. git reset origin/master
  2. git checkout -b new-branch
  3. 每次提交
  4. git cherry-pick <hash>
  5. 创建您的拉取请求。
  6. 或者你可以这样做:

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

答案 4 :(得分:2)

根据git push,您可以使用git push origin +dev:master

  

使用dev分支更新源存储库的主分支,允许非快进更新。这可能会在原始存储库中悬挂未引用的提交。

我不确定这是否适用于github。我现在没有任何需要消除的东西。 :)

它应该允许您使用git rebase -i使您的本地主机看起来像您想要的那样,然后将结果推送到github。


或者,您可以delete the master branch on githubgit push origin :master)然后从您当地的,已更正的主人那里重新填充。我有一种感觉,如果github是默认分支(可能是 master ),github可能会阻止你这样做。如果是这种情况,请进入存储库的“管理”部分,并暂时将默认值更改为另一个分支。

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:1)

如果你想强制“主人”看起来像“遥控器/原点/主人”你可以强行拉。

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

答案 7 :(得分:1)

@Novelocrat建议我几乎采用相同的方法。最终从master分支的当前位置创建备份分支:

git branch mywork-orig master

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

git reset --hard upstream/master

这会将其重置为upstream的{​​{1}}所在的位置。然后你还必须把它推到github上的fork:

master

然后从新重置的git push origin +master 分支创建新分支,现在该分支应与master相同:

upstream/master

因为您在旧的git checkout -b mywork 分支上进行了很多合并,所以您可能无法对您创建的新功能分支进行大量选择。樱桃挑选你可以做的提交,然后简单地(或不那么简单地)重新创建你不能轻易挑选的那些。

答案 8 :(得分:0)

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

  • 您必须有权强制更新以掌握原点。
  • 它假定没有其他人拉出任何要删除的节点。
  • 您可以在本地修复主分支时阻止对原始分支的更新。

将本地坏主分支移动/重命名为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