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

时间:2017-08-07 03:58:25

标签: git github version-control git-extensions

有人能用一种清晰,简单的方法将两个分支上的名称与Git交换,Github作为远程存储库吗?

以下是该方案:

  1. 我创建了一个 dev 分支。
  2. dev 上提交1次后,我创建了分支 exp (实验)。
  3. 我再次检查了 dev 并再提交了两次提交。
  4. 然后我意识到我真的希望 exp 成为进行这两次提交的分支,所以我想交换 exp dev
  5. 我是相当新的,我已经浏览了一些视觉Git教程并搜索了这个网站和谷歌,但我仍然不清楚在Git中解决这个问题的最佳或有意方式(特别是 - 使用Github远程仓库)

    我的错误尝试解决此问题:

    我已经尝试了一些东西并搞砸了它 - 用Git Extensions重命名本地分支,但是无法获得远程Github仓库来反映这种变化。 我尝试创建新的分支,但不能总是让它们反映在本地和远程(无论我在哪里制作)。

    我终于能够通过Git Extensions主要 pull 功能和“Prune远程分支”来获取我需要的所有内容,它似乎使用 fetch --prune - 这反映了远程删除回本地,以及启用了一些强制/删除选项的推送功能。

    我一开始认为我可能只能重置/移动两个分支(即将exp移动到dev,然后将exp重置回dev开启的提交(2返回),但是当尝试在Git Extensions中重置时,它要求我选择一个柔和,混合或硬重置 - 这让我停下来走另一条路线试图重命名/创建新的分支,等等。也许这是正确的轨道 - 如果是这样,我应该做一个软重写或硬重置 - 或者在提交任何开放更改后不重要?我做了很多搜索,甚至理解工作目录,索引和分支,在我的情况下仍然不清楚。

    问题

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

    如果您的方法是正确或最简单的方法,我将不胜感激。谢谢!

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

3 个答案:

答案 0 :(得分:3)

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

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的更改。

答案 1 :(得分:2)

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

$ 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

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

# make sure you are in 'dev2' branch

$ git checkout -b exp
$ git push origin exp

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

$ 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 

答案 2 :(得分:1)

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

我认为最简单的方法是移动提交,而不是尝试重命名分支。一种简单的方法是从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会添加提交,在这种情况下,会在功能上撤消要删除的dev上的两个提交。因此,dev最终会有三次提交,但就好像现在exp上的两次提交从未在dev上进行。