我有一个关于如何将我的更改从一个分支合并到另一个分支的问题。这是事情的方案:
有三个分支:Master(M),Feature(F)和Development(D)
D在创建F之前从M创建,再次关闭M.理想情况下,D应该是从F创建的,具有层次结构:
table{
cursor: pointer;
}
th {
cursor: hand;
}
M始终更新至其他提交的更改。
现在在我的D分支上,更改包含一系列提交,我想将其合并为F作为一个提交。我怎么做?这反过来将在稍后合并到M.
请注意,D和F可能在M的不同提交中分支。
谢谢!
答案 0 :(得分:7)
现在在我的D分支上,更改包含一系列提交,我希望将其合并为F作为一个提交
git checkout F
git merge --squash D
git commit
答案 1 :(得分:2)
您正在寻找git rebase
命令。对于简单的情况,请执行
git checkout D
git rebase F
或者,做
git rebase D F
这不会压缩成单个提交。要做到这一点,可能最不容易出错的选项是进行交互式提交:
git checkout D
git rebase -i F
这将显示一个编辑器,其中D
中的提交将被重新定位。它看起来像这样:
pick 293a24d Some commit message
pick a015bbe Some commit message
pick e19f4fa Some commit message
pick 40ae959 Some commit message
pick fba6b72 Some commit message
# Rebase 419206d..fba6b72 onto de95063
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
按照说明操作,将第一行以外的所有内容更改为squash
而不是pick
。这将为您提供在保存和退出编辑器后合并消息的选项。
或者,您可以将契约pick
更改为reword
,将剩余的契约更改为fixup
。这只会显示第一个提交消息。如果您想完全丢弃所有旧的提交消息,则此选项更简单。
最后,如果你感觉非常冒险,你可以自动过滤提交列表,绕过rebase的第一个交互部分:
EDITOR='sed -i -e "2,$s/pick/squash/"' git rebase -i F
通过pick
而不是通常的交互式编辑器过滤编辑器文件,这将从第二行开始自动将squash
更改为sed
。
答案 2 :(得分:1)
现在在我的D分支上,更改包含一系列提交,我想将其合并为F作为一个提交。我怎么做?
git checkout D
git rebase -i F # pick "squash" for every commit
git checkout F
git merge D
请参阅http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html以获得一个好例子(但它确实不是很复杂,git help rebase
也应该足够了)。基本上,您编辑git rebase -i
提供给您的文件,并在所有行上输入“squash”。
这又将在稍后合并到M.
git checkout M
git merge F