在Git中,有没有办法将所有更改从一个分支合并到另一个分支,但是同时压缩到一个提交?
我经常在一个单独的分支中处理一个新功能,并且会定期提交/推送 - 主要用于备份或将我正在处理的内容转移到另一台机器上.大多数提交说"功能xxx WIP"或多余的东西.
一旦完成该工作并且我想将WIP分支合并回master,我想丢弃所有这些中间提交,并且只需要一个干净的提交.
是否有捷径可寻?
或者,一个命令如何压缩分支上的所有提交,因为它是分支的点?
fse*_*eto 551
另一个选择是git merge --squash <feature branch>最后做一个git commit.
来自Git合并
--squash
--no-squash生成工作树和索引状态,就好像发生了真正的合并(合并信息除外),但实际上没有提交或移动
HEAD,也没有记录$GIT_DIR/MERGE_HEAD导致下一个git commit命令创建合并提交.这允许您在当前分支之上创建单个提交,其效果与合并另一个分支(或章鱼的情况下更多)相同.
Bra*_*son 203
找到了!合并命令有一个--squash选项
git checkout master
git merge --squash WIP
Run Code Online (Sandbox Code Playgroud)
此时所有内容都已合并,可能存在冲突,但未提交.所以我现在可以:
git add .
git commit -m "Merged WIP"
Run Code Online (Sandbox Code Playgroud)
fse*_*eto 25
试试git rebase -i master你的功能分支.然后,你可以将除了一个'pick'之外的所有内容更改为'squash'来组合提交.请参阅使用rebase压缩提交
最后,您可以从master分支进行合并.
rar*_*iru 12
使用git merge --squash <feature branch>已接受的答案可以解决问题,但它不会将合并的分支显示为实际合并。
因此,更好的解决方案是:
<feature branch>到上面使用git merge --squash这个 wiki详细解释了这个过程。
在下面的例子中,左手截图是结果,qgit右手截图是结果:
git log --graph --decorate --pretty=oneline --abbrev-commit
Run Code Online (Sandbox Code Playgroud)
两个屏幕截图都显示了同一存储库中相同范围的提交。尽管如此,由于--squash.
master分支偏离了db。db功能准备好了,一个叫新的分支tag在同一创建提交的master是db有其根源。tagagit merge --squash db执行,然后所有更改都在单个提交中暂存和提交。master,tag合并:git merge tag。search无关紧要,不会以任何方式合并。有了--squash标志,它看起来就像两个没有关系的平行分支:
排序与日期相关的提交看起来像:
就个人而言,我不喜欢 --squash 选项,试试这个技巧,也许它适合你的需求,我将它用于小型项目:
有意合并冲突的空提交,将其命名为您喜欢的任何名称
我创建了自己的 git 别名来做到这一点。我正在呼唤它git freebase!它将采用您现有的混乱的、不可rebasable的功能分支并重新创建它,以便它成为一个具有相同名称的新分支,其提交被压缩为一个提交并重新基于您指定的分支(默认为master)。最后,它将允许您为新的“基于自由”的分支使用您喜欢的任何提交消息。
通过在 .gitconfig 中放置以下别名来安装它:
[alias]
freebase = "!f() { \
TOPIC="$(git branch | grep '\\*' | cut -d ' ' -f2)"; \
NEWBASE="${1:-master}"; \
PREVSHA1="$(git rev-parse HEAD)"; \
echo "Freebaseing $TOPIC onto $NEWBASE, previous sha1 was $PREVSHA1"; \
echo "---"; \
git reset --hard "$NEWBASE"; \
git merge --squash "$PREVSHA1"; \
git commit; \
}; f"
Run Code Online (Sandbox Code Playgroud)
通过运行以下命令从功能分支中使用它:
git freebase <new-base>
我只对此进行了几次测试,因此请先阅读它并确保您想要运行它。作为一个小安全措施,它会打印起始 sha1,因此如果出现任何问题,您应该能够恢复旧分支。
我将在 github 上的 dotfiles 存储库中维护它: https: //github.com/stevecrozz/dotfiles/blob/master/.gitconfig
| 归档时间: |
|
| 查看次数: |
158769 次 |
| 最近记录: |