我在Github上有一个repo的克隆,我在其中为上游创建了一个新功能。问题是,我在我的主分支中做了那个,它还包含我从其他克隆中提取的其他内容。这完全打破了我创建合理拉取请求的能力。
所以我想做以下事情:
而且,将来,我将在分支机构中完成所有工作,并在离开我的主分支机构的同时创建拉取请求,并将所有来自上游的内容合并。
我的问题是:
答案 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)
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
答案 4 :(得分:2)
根据git push,您可以使用git push origin +dev:master
:
使用dev分支更新源存储库的主分支,允许非快进更新。这可能会在原始存储库中悬挂未引用的提交。
我不确定这是否适用于github。我现在没有任何需要消除的东西。 :)
它应该允许您使用git rebase -i
使您的本地主机看起来像您想要的那样,然后将结果推送到github。
或者,您可以delete the master branch on github(git 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)
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