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 add.
和git rebase--继续。它将为此创建一个新的临时提交temp commit hash
temp commit hash
之上重新设置当前分支的基础。可能会有进一步的冲突,您必须再次手动解决这些冲突。完成后,您再次继续使用git add.
和git rebase--继续
,然后您成功地在新的基本分支
的顶部重新设置了当前分支注意:如果你开始搞砸了,那么你可以在重设基础的过程中随时进行git重设基础--abort,然后回到起点。我知道这个问题已经很老了,但如果它对某人有帮助,请分享 我的情况和我从不同的基础分支机构提出PR的情况相同,更改基础分支机构和重新基址显示出200多个文件冲突 甚至解决它也会显示我不想要的旧提交。所以我所做的是
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
-对分支进行简单重命名。