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

Man*_*ser 39 git github

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

所以我想做以下事情:

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

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

我的问题是:

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

wew*_*als 65

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

$ git branch old_master
Run Code Online (Sandbox Code Playgroud)

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

$ git checkout old_master
$ git push origin old_master
Run Code Online (Sandbox Code Playgroud)

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

$ git checkout master
$ git reset --hard 037hadh527bn
Run Code Online (Sandbox Code Playgroud)

合并来自上游主站的更改

$ git pull upstream master
Run Code Online (Sandbox Code Playgroud)

现在DELETE master远程repo

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

$ git push origin :master
Run Code Online (Sandbox Code Playgroud)

并重新创建它

$ git push origin master
Run Code Online (Sandbox Code Playgroud)

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


Phi*_*ler 9

这几乎是一种合理的方法,但你可能会把事情搞得一团糟.首先要做的是创建一个新的分支,其中包含您当前的master分数,这样您就不会失去对已经完成的工作的方便引用:

git branch mywork-orig master
Run Code Online (Sandbox Code Playgroud)

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

git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用预期的更改创建自己的分支:

git checkout -b mywork
Run Code Online (Sandbox Code Playgroud)

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


Tre*_*ris 5

这很晚了,但是没有人建议这种更简单的方法:

# 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
Run Code Online (Sandbox Code Playgroud)

您将本地更改保存到,tmp_master并已强制更新master以匹配最新版本upstream/master。现在origin/master看起来像upstream/master:

git push -f origin master
Run Code Online (Sandbox Code Playgroud)

现在继续cherry-pick进行提交,或rebase在当前基础之上进行更改master。之后,您将已经有了新的devel分支。

您想做的事情完全有可能,只是不按您要求的顺序进行。似乎其他人忘记了您可以在fetch不实际应用更改的情况下进行远程更改。使生活变得更加简单。