在git中更改分支的根目录

时间:2011-04-19 05:50:44

标签: git tags branch reset rebase

我正在使用git并希望更改现有分支的基础。这是由部署系统引起的,该系统将此显式分支拉入我的生产环境。在规划我的版本时,我每次想要上线时都会创建一个标签。但我的分支也有特殊的变化,因此git reset --hard v1.0将无效。

这是一个小例子。我想要这个

      C---D---E deploy
     /
A---B---F---G master
     \
      v1.0

成为这个

                          C---D---E deploy
                         /
A---B---F---G---H---I---J---K master
     \                   \
      v1.0                v1.1

也许git rebase正是我要找的,但是手册页对我没有帮助。谢谢你的回复!

4 个答案:

答案 0 :(得分:11)

git rebase应该像你说的那样,允许你改变部署的基础:

git checkout deploy
git rebase v1.1 # using the tag
(or:
 git rebase J # SHA1 of J
 or
 git rebase master~1
)

但你最终会得到

C'---D'---E' deploy

也就是说,deploy分支的提交部分的SHA1被重写,如果没有人克隆说deploy分支并且正在处理它,那就不错了。
由于它是一个部署分支,很可能就是这种情况(即没有人正在研究所述分支的克隆)。

答案 1 :(得分:3)

我不明白你为什么要失去原来的分支。在这种情况下我会做什么:

 # create a new branch from your 1.1 tag
 git checkout -b deploy1.1 v1.1 
 # merge your existing branch into this one
 git merge deploy

编辑:添加了架构

你最终会得到类似的东西

       C---D---E deploy
       /        \_______ 
      /                  F deploy1.1
     /                  /
A---B---F---G--H--I--J--K--L
     \                   \
    v1.0                 V1.1

答案 2 :(得分:3)

是的,你可以使用rebase来达到预期的效果。以下命令将检出deploy分支,并在v1.1之上重播所有无法通过v1.1访问的提交:

git rebase v1.1 deploy

(详细的方式是:git rebase --onto v1.1 v1.0 deploy

但为什么要改变和改变历史呢?您只需将开发主线更改为部署分支:

git checkout deploy
git merge v1.1

这将保留所有提交哈希值,您的历史记录将如下所示(M是合并提交):

      C---D---E-----------M deploy
     /                   /
A---B---F---G---H---I---J---K master
     \                   \
      v1.0                v1.1

由于在rebase期间以及合并期间可能会发生冲突,因此在使用基于合并的方法时,您将有合并冲突的历史记录。对于rebase运行期间,您没有冲突历史记录。使用基于合并的工作流,您可以稍后在合并提交的(组合)差异中查看您的冲突。

答案 3 :(得分:2)

git rebase应该适合你:

git checkout deploy
git rebase master~1

git rebase v1.1

看一下http://progit.org/book/ch3-6.html - 应该帮助你更好地理解rebase