Git:如何交换2个本地和远程分支(Github)

m1m5dgzv  于 2023-05-05  发布在  Git
关注(0)|答案(4)|浏览(206)

有人能给予一个清晰,简单的方法来交换2个分支的名称与Git,与Github作为远程仓库?

情况是这样的:
1.我在master上创建了一个dev分支。
1.在dev上提交1次后,我创建了分支exp(experiment)。
1.我再次检查了dev,并提交了2次。
1.然后我意识到我真的想让exp成为提交这两个提交的分支,所以我想交换expdev
我在这方面是相当新的,我已经通过了一些可视化的Git教程,并搜索了这个网站和谷歌,但我仍然不清楚在Git中解决这个问题的最佳或预期的方法(特别是-使用Github远程仓库)

My Bad attempts to fix this:

我尝试了一些东西,但把它弄得一团糟-用Git扩展重命名本地分支,但无法让远程Github仓库反映出这一变化。我试着创建新分支,但不能总是让这些分支反映在本地和远程(不管我在哪里创建它们)。
我终于能够用Git Extensions的main pull 函数和“Prune remote branches”来获得我所需要的一切,它似乎使用了 fetch--prune -这反映了远程删除回到本地,以及启用了一些强制/删除选项的 push 函数。
一开始我以为我可以重置/移动两个分支(即。将exp上移到dev,然后将exp重置回dev所在的提交(2 back),但是当尝试在Git扩展中重置时,它要求我选择软重置、混合重置或硬重置-这让我停下来并尝试重命名/创建新分支等其他路线。也许这是正确的轨道-如果是这样,我应该做一个软或硬重置-或者在提交任何开放的更改后没有关系?我做了大量的搜索,甚至了解工作目录,索引和分支,它仍然不清楚在我的情况下。

提问

必须有更好的方法来完成这一点-我如何才能轻松地交换两个分支(或重命名两个分支,使它们有效地交换),以一种方式,所有的变化都反映在本地和远程(在Github上)?
我会很感激任何关于为什么你的方法是正确的或最简单的方法的见解。谢谢!

**注意:**我确实发现了this question关于重命名master(或任何分支)的内容-但那里有很多步骤。我可以这样做两次,但我很难相信这是最好的方法。

aelbi1ox

aelbi1ox1#

分别从expdev创建两个新分支exp2dev2

$ 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

删除本地和远程devexp分支。

$ 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

exp2创建一个新的本地分支dev并推送到远程。

$ 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

现在,如果一切正常,则删除本地exp2dev2分支。(可选)

$ git branch -D dev2      # delete local 'dev2' branch
$ git branch -D exp2      # delete local 'exp2' branch
vkc1a9a2

vkc1a9a22#

假设提交历史如下所述:

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 devgit checkout -b temp origin/dev备份新分支上的更改,如temp。在将本地exp交换为dev之后,您可以选择或合并其他开发人员从tempdev的更改。

rkue9o1l

rkue9o1l3#

重命名两个分支只是为了重新定位一些提交,听起来有点像拿起一座房子,旋转它只是为了拧下一个灯泡。
我认为在这里最简单的方法是移动 commits,而不是尝试重命名分支。一个简单的方法是将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中删除两个提交:

git checkout dev
git reset --hard HEAD~2

请注意,如果你已经将dev推送到GitHub *,并且 * 其他人可能已经拉取了分支,那么你应该恢复这两个提交:

git checkout dev
git revert A^..B

这里A是第一次提交,B是第二次提交。请注意,git revert添加了一个 new commit,在本例中,它将在功能上撤消您想要删除的dev上的两个提交。所以dev最终会有三次提交,但就好像现在在exp上的两次提交从来没有在dev上进行过一样。

mjqavswn

mjqavswn4#

这个过程要简单得多,只需要在重命名时使用一个 * 临时 * 分支名称,例如:todo-dev

git branch --move exp todo-dev
git branch --move dev exp
git branch --move todo-dev dev
git push <remote> exp --set-upstream exp   # upstream was `dev` before  
git push <remote> dev --set-upstream dev   # upstream was `exp` before  

# Repeat the `push` commands for any other remote repos.

以上所有命令都不受 checkout 分支的影响,并且不影响 working-dirindex(与checkoutresetcherry-pick命令不同)。
整个过程是相同的,无论远程git服务器(即。GitHub、GitLab或只是本地存储库)。

相关问题