我正在使用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
正是我要找的,但是手册页对我没有帮助。谢谢你的回复!
答案 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)
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