Git:如何交换本地和远程两个分支(Github)
有人能给出一个清晰、简单的方法,用Git交换两个分支上的名称,用Github作为远程存储库吗? 以下是场景:Git:如何交换本地和远程两个分支(Github),git,github,version-control,git-extensions,Git,Github,Version Control,Git Extensions,有人能给出一个清晰、简单的方法,用Git交换两个分支上的名称,用Github作为远程存储库吗? 以下是场景: 我从master创建了一个dev分支 在dev上提交1次后,我创建了分支exp(实验) 我再次签出了dev,又提交了两次 然后我意识到我真的希望exp成为进行这两次提交的分支,所以我想交换exp和dev 在这方面我是个新手,我已经阅读了一些可视化Git教程,并搜索了这个网站和Google,但我仍然不清楚用Git(尤其是Github remote repo)解决这个问题的最佳或预期方法
我的错误尝试解决了这一问题: 我尝试了一些事情,但把事情弄得一团糟——用Git扩展重命名本地分支,但无法让远程Github repo反映出这种变化。 我尝试创建新的分支,但不能总是让它们同时反映在本地和远程(无论我在哪里创建它们) 我终于能够通过Git Extensions的主拉函数“Prune remote branchs”获得我所需要的一切,它似乎使用了fetch with--Prune,这反映了远程删除返回到本地,以及启用了一些强制/删除选项的push函数 起初我认为我可能只是能够重置/移动两个分支(即,将exp向上移动到dev,然后将exp重置回dev所在的提交(返回2个),但当尝试在Git扩展中重置时,它要求我选择软重置、混合重置或硬重置,这让我停下来,转而尝试重命名/创建新分支,等等。也许这是正确的方法-如果是,我应该进行软重置还是硬重置-或者在提交任何打开的更改后,这不重要吗?我做了大量搜索在这一点上,即使理解了工作目录、索引和分支,在我的例子中仍然不清楚
问题: 必须有更好的方法来实现这一点-我如何轻松地交换两个分支(或者重命名两个分支以便它们有效地交换),以使所有更改都在本地和远程(在Github上)反映出来? 如果您能深入了解为什么您的方法是正确或最简单的方法,我将不胜感激。谢谢
注意:我确实找到了有关重命名主机(或任何分支)的信息-但有很多步骤。我可以做两次,但我觉得很难相信这是最好的方法。重命名两个分支只是为了重新定位几个提交,听起来有点像捡起一座房子,旋转它只是为了拧下一个灯泡 我认为这里最简单的方法是移动提交,而不是尝试重命名分支。一种简单的方法是将
dev
中的两个提交挑选到exp
,然后从dev
中删除这两个提交
git checkout exp
git cherry-pick <SHA-1 of first dev commit>
git cherry-pick <SHA-2 of first dev commit>
请注意,如果您已经将dev
推送到GitHub,而其他人可能已经拉到了该分支,那么您应该恢复这两个提交:
git checkout dev
git revert A^..B
这里,
A
是第一次提交,B
是第二次提交。请注意,git revert
添加了一个新的提交,在本例中,它将在功能上撤消您要删除的dev
上的两次提交。因此,dev
将以三次提交结束,但这两次提交现在就好像ex>上的两次提交一样p
从未在dev
上创建过。分别从exp
和dev
创建两个新分支exp2
,dev
$ git checkout exp
$ git branch exp2 # create new branch 'exp2' from 'exp'
$ git checkout dev
$ git checkout -b dev2 # create and checkout to `dev2` branch
删除本地和远程dev
和exp
分支
$ git branch -D dev # delete local 'dev' branch
$ git push origin :dev # delete remote 'dev' branch
$ git branch -D exp # delete local 'exp' branch
$ git push origin :exp # delete remote 'exp' branch
从dev2
创建一个新的本地分支exp
,然后推送到远程
# make sure you are in 'dev2' branch
$ git checkout -b exp
$ git push origin exp
$ git checkout exp2 # checkout to 'exp2' so, current branch is 'exp2'
$ git checkout -b dev # create new branch 'dev'
$ git push origin dev # push 'dev' branch to remote
从exp2
创建一个新的本地分支dev
,然后推送到远程
# make sure you are in 'dev2' branch
$ git checkout -b exp
$ git push origin exp
$ git checkout exp2 # checkout to 'exp2' so, current branch is 'exp2'
$ git checkout -b dev # create new branch 'dev'
$ git push origin dev # push 'dev' branch to remote
现在,如果一切正常,则删除本地exp2
和dev2
分支。(可选)
假设您描述的提交历史记录如下:
A---B---… master
\
C---D---E dev
|
exp
您可以使用以下命令:
git checkout exp
git merge dev
git push origin exp
git checkout dev
git reset --hard head~2
git push -f origin dev
然后提交历史记录将为:
A---B---… master
\
C dev
\
D---E exp
当然,您可以重命名分支名称,但这种方法更有效
注意:如果您与其他人合作,并且在
dev
分支上有新的更改,您可以通过git pull origin dev
和git checkout-b temp origin/dev
备份新分支中的更改,例如temp
,然后将本地exp
替换为dev
,然后您可以一个樱桃选择或合并其他开发者从<代码> TEMP >代码>到代码> DEV/<代码> 我想你应该添加一个CAVIAT,以防代码> DEV/<代码>已经被公开播放。@ TimiGeeleSeEN OK,谢谢提醒,我补充了这个情况。谢谢-我甚至没有考虑别人已经拉过的复杂。你能解释一下为什么在重置中使用--hard选项吗?@LightCC执行硬重置时会将分支头移回twk提交,并将stage和working目录重置为该提交。因此,这实际上就像是对两个提交进行核操作。好的,提交已经“安全”了因为它们位于exp分支中,但从开发分支的角度来看,您希望完全重置为exp~2,而不进行任何阶段性或未阶段性更改。如果相反,我希望保留这两个提交值的更改,以便进行更改、重新启动和重新提交(作为新开发分支的一部分,与exp分开),然后我可以使用--soft,对吗?@LightCC是的,假设当前工作目录为空,stage也为空,则执行软重置将是稍后重新提交这两个提交的一种方法,可能会添加一些新的更改。嗨,Sajib-谢谢。这超出了我的示例所需的范围,但这显示了如何完全交换两个分支。