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
Git 更改分支库_Git - Fatal编程技术网

Git 更改分支库

Git 更改分支库,git,Git,我有一棵这样的树: (commit 1) - master \-- (commit 2) - (commit 3) - demo \-- (commit 4) - (commit 5) - PRO 我必须把专业分支移到master (commit 1) - master |-- (commit 2) - (commit 3) - dem

我有一棵这样的树:

(commit 1) - master
                \-- (commit 2) - (commit 3) - demo
                                                \-- (commit 4) - (commit 5) - PRO
我必须把专业分支移到master

(commit 1) - master
                |-- (commit 2) - (commit 3) - demo
                \-- (commit 4) - (commit 5) - PRO
我试过PRO branch的一个
git rebase master
,但什么也没发生


澄清:我在master工作,然后我不得不做一个产品演示(
git checkout-b演示
和一些提交)。然后,由于错误,我从demo创建了另一个分支(
git checkout-b PRO
和一些提交),现在我需要将PRO分支移动到master并保持demo不变。最后,demo和PRO都将挂起master。

假设
newBase
是您要将提交移动到的分支,
oldBase
是分支的旧基础,您可以使用:

git rebase --onto newBase oldBase feature/branch
鉴于你的情况:

git checkout PRO # Just to be clear which branch to be on.
git rebase --onto master demo PRO

基本上,您将从
demo
PRO
(包括
PRO
)的所有提交重新设置到
master
提交上。

签出到
PRO
分支,复制此分支的最旧(commit4)和最新(commit5)提交哈希值,并粘贴到其他地方:

$ git checkout PRO
$ git log            # see the commit history
# copy the oldest & latest commit-hash 
删除
PRO
分支(为安全起见保留备份)。从
master
创建并签出到新的
PRO
分支:

$ git branch PRO.bac    # create a new branch PRO.bac = PRO as backup

$ git checkout master
$ git branch -D PRO     # delete the local PRO branch
$ git checkout -b PRO   # create and checkout to a new 'PRO' branch from 'master'
将以前的
PRO
分支的提交范围(cherry pick)放入新的
PRO
分支:

$ git cherry-pick commit4^..commit5   # cherry-pick range of commits
# note the '^' after commit4
$ git log                  # check the commit history

$ git push -f origin HEAD  # replace the remote PRO by local PRO branch history
# git branch -D PRO.bac    # delete local PRO.bac branch
现在,如果一切正常,则强制(-f)按下
远程PRO
分支并删除本地
PRO.bac
分支:

$ git cherry-pick commit4^..commit5   # cherry-pick range of commits
# note the '^' after commit4
$ git log                  # check the commit history

$ git push -f origin HEAD  # replace the remote PRO by local PRO branch history
# git branch -D PRO.bac    # delete local PRO.bac branch

我使用了一种稍微不同的方法,即使用重置和隐藏,以避免删除和重新创建分支,并消除切换分支的需要:

$ git checkout PRO
$ git reset commit4 # This will set PROs HEAD to be at commit 4, and leave the modified commit 5 files in ur working index
$ git stash save -m "Commit message"
$ git reset commit3
$ git stash save -m "Commit message"
$ git reset master --hard
$ git stash pop
$ git stash pop
$ git push --force # force if its already been push remotely

通过逐个提交地重置分支,您基本上只需一次提交一个分支历史。

我将尽可能做到通用。首先,确保您位于所需的分支上:

git checkout current-branch
然后使用以下命令(其中
new base branch
是您希望成为新基地的分支,
current base branch
是您当前基地的分支。)

如果你没有冲突,那就太好了——你完蛋了。如果您这样做(在大多数情况下),请继续阅读。

可能会出现冲突,您必须手动解决这些冲突。Git现在尝试在
当前分支
当前基本分支
新基本分支
之间进行“三方合并”。git的内部工作方式大致如下:

  • Git将首先在
    新基本分支
    之上重新设置当前基本分支的基础。可能会有冲突,;您必须手动解决此问题。完成后,通常执行
    git add.
    git rebase--继续。它将为此创建一个新的临时提交
    temp commit hash

  • 在此之后,Git现在将在
    temp commit hash
    之上重新设置当前分支的基础。可能会有进一步的冲突,您必须再次手动解决这些冲突。完成后,您再次继续使用
    git add.
    git rebase--继续
    ,然后您成功地在
    新的基本分支
    的顶部重新设置了当前分支



  • 注意:如果你开始搞砸了,那么你可以在重设基础的过程中随时进行git重设基础--abort,然后回到起点。

    我知道这个问题已经很老了,但如果它对某人有帮助,请分享

    我的情况和我从不同的基础分支机构提出PR的情况相同,更改基础分支机构和重新基址显示出200多个文件冲突

    甚至解决它也会显示我不想要的旧提交。所以我所做的是

  • 从本地删除分支
  • 创建同名的新分支,确保这次选择了正确的基本分支
  • Cherry pick commit id,如果您有
  • 最后在命令下运行

    git push origin +branchName:branchName
    
    在上面的这里,您也可以使用
    -f
    而不是
    +

    上面的命令使我的分支处于一种状态,而不会影响我的拉取请求。

    如果情况正好相反,那么这也是可能的重复吗?==我从master的第二个分支签出-b,但我想从第一个分支签出。所以我做了
    git-rebase——在第一个分支上,在第二个分支上,在第二个分支上,但是我没有得到syntax@Fla在这种情况下,它将是
    git-rebase--on-first-branch-master-second-branch
    我在
    上读到了这篇文章--on-on
    ,他们是如何编写的帮助我将git rebase重新设置为newBase-oldBase-feature/branch
    @PhilipRego,这是不正确的
    origin/newBase
    是分支的名称,就像我的示例中的
    newBase
    一样。这将取决于您是重新定位到本地存储库中存在的分支(
    newBase
    ),还是远程存储库中存在的分支(
    origin/newBase
    newBase
    是本地分支的名称,
    origin/newBase
    是远程分支的名称。你想要哪一个取决于你在重定基准。这并不是说一个人能行,一个人不行,而是他们在不同的事情上重新定位。最初的问题从来没有提到过远程,因此在我的示例中使用远程与所问的问题不匹配。发布的
    rebase
    命令只会给出“致命:无效的上游“当前基本分支”。还有,为什么甚至有必要告诉GIT当前分支的当前父分支是什么?它不应该已经知道了吗?@ARK简单的解释。非常感谢。为我工作。您是否应该删除第4行“提交”和“3”之间的空格?请注意,您应该更新代码,以进行备份并删除原始代码,您可以这样做:
    git branch-m PRO.bac
    -对分支进行简单重命名。