Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git:如何交换本地和远程两个分支(Github)_Git_Github_Version Control_Git Extensions - Fatal编程技术网

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作为远程存储库吗?

以下是场景:

  • 我从master创建了一个dev分支
  • dev上提交1次后,我创建了分支exp(实验)
  • 我再次签出了dev,又提交了两次
  • 然后我意识到我真的希望exp成为进行这两次提交的分支,所以我想交换expdev
  • 在这方面我是个新手,我已经阅读了一些可视化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-谢谢。这超出了我的示例所需的范围,但这显示了如何完全交换两个分支。