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

Git: How to swap 2 branches both local and remote (Github)

有人可以给出一个清晰、简单的方法来交换 2 个分支上的名称 Git,Github 作为远程存储库吗?

场景如下:

  1. 我在 master 之外创建了一个 dev 分支。
  2. dev 上进行 1 次提交后,我创建了分支 exp(实验)。
  3. 我再次检查了 dev 并进行了 2 次提交。
  4. 然后我意识到我真的希望 exp 成为进行这 2 次提交的分支,所以我想交换 exp开发

我在这方面还很陌生,我已经浏览了一些可视化 Git 教程并搜索了该站点和 Google,但我仍然不清楚最好的或预期的在 Git 中解决这个问题的方法(特别是 - 使用 Github 远程仓库)


My Bad 试图解决此问题:

我已经尝试了一些东西,但弄得一团糟——用 Git 扩展重命名本地分支,但无法获得远程 Github 存储库以反映该更改。 我尝试创建新的分支,但不能总是让它们同时反映在本地和远程(无论我在哪里创建它们)。

我终于能够通过 Git Extensions main pull 函数和 "Prune remote branches" 获得我需要的一切,它似乎使用 [=34] =]fetch with --prune - 这将远程删除反映回本地,还有 push 函数与一些 force/delete 选项已启用。

一开始我想我可能只能 reset/move 两个分支(即将 exp 移到 dev,然后将 exp 重置回 dev 所在的提交(返回 2),但是当尝试在 Git 扩展中重置,它要求我选择软重置、混合重置或硬重置 - 这让我停下来尝试尝试 rename/create 新分支等的另一条路线。也许这是正确的track - 如果是这样,我应该进行软重置还是硬重置 - 或者在提交任何打开的更改后这无关紧要?我做了很多搜索,甚至了解工作目录、索引和分支,它仍然是我的情况很清楚。


问题

必须有更好的方法来完成这项工作 - 我如何轻松地交换两个分支(或重命名 2 个分支以便它们有效地交换),以一种所有更改都在本地和远程反映的方式(在 Github 上)?

如果您能深入了解为什么您的方法是正确或最简单的方法,我将不胜感激。谢谢!


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

重命名这两个分支只是为了重新定位一些提交听起来有点像拿起房子并旋转它只是为了拧开灯泡。

我认为这里最简单的做法是移动 提交 而不是尝试重命名分支。一种简单的方法是从 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 提交,在这种情况下,这将在功能上撤消要删除的 dev 上的两个提交。所以 dev 将以三个提交结束,但就好像 exp 上的两个提交从未在 dev.

上进行过一样

分别从 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 

假设您描述的提交历史如下:

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分支上有新的更改,你可以备份新分支中的更改,例如temp 首先是 git pull origin devgit checkout -b temp origin/dev。将本地 exp 交换为 dev 后,您可以挑选或合并其他开发人员的更改,从 tempdev