在Git中,是否有一种方法可以将所有变更从一个分支合并到另一个分支,同时压缩到单个提交中?
我经常在一个单独的分支中处理一个新特性,并定期提交/推送——主要是为了备份或将我正在做的工作转移到另一台机器上。大多数提交的内容都是“功能xxx WIP”或一些多余的内容。
一旦工作完成,我想将WIP分支合并回master,我想放弃所有那些中间提交,只需要一个干净的提交。
有什么简单的方法吗?
或者,如果一个命令从分支所在的位置开始压缩分支上的所有提交呢?
在Git中,是否有一种方法可以将所有变更从一个分支合并到另一个分支,同时压缩到单个提交中?
我经常在一个单独的分支中处理一个新特性,并定期提交/推送——主要是为了备份或将我正在做的工作转移到另一台机器上。大多数提交的内容都是“功能xxx WIP”或一些多余的内容。
一旦工作完成,我想将WIP分支合并回master,我想放弃所有那些中间提交,只需要一个干净的提交。
有什么简单的方法吗?
或者,如果一个命令从分支所在的位置开始压缩分支上的所有提交呢?
当前回答
2020年更新
使用——squash标志,它看起来像两个平行的分支,没有关系:
排序与日期相关的提交如下:
就我个人而言,我不喜欢——挤压选项,试试这个技巧,也许它适合你的需求,我用它来做小项目:
git init Git checkout -b dev 开发中的多次提交 当你在dev中做了一些很棒的提交后(但还没有合并到master分支),如果你不希望所有的提交都复制到master分支,那么故意改变master分支中的一些内容(在README文件中添加一些空行并在master分支中提交), Git合并开发 它导致合并冲突(README中的空行),解决它,提交您想要的新消息,然后就完成了。这是它的视觉表现。
Null提交故意合并冲突,命名为任何你喜欢
其他回答
发现它!合并命令有一个——squash选项
git checkout master
git merge --squash WIP
此时,所有内容都已合并,可能存在冲突,但尚未提交。所以我现在可以:
git add .
# git add -u # might be preferable, see below
git commit -m "Merged WIP"
2020年更新
使用——squash标志,它看起来像两个平行的分支,没有关系:
排序与日期相关的提交如下:
就我个人而言,我不喜欢——挤压选项,试试这个技巧,也许它适合你的需求,我用它来做小项目:
git init Git checkout -b dev 开发中的多次提交 当你在dev中做了一些很棒的提交后(但还没有合并到master分支),如果你不希望所有的提交都复制到master分支,那么故意改变master分支中的一些内容(在README文件中添加一些空行并在master分支中提交), Git合并开发 它导致合并冲突(README中的空行),解决它,提交您想要的新消息,然后就完成了。这是它的视觉表现。
Null提交故意合并冲突,命名为任何你喜欢
尝试git rebase -i master在你的特性分支上。然后,你可以将除一个“pick”以外的所有“pick”更改为“squash”,以合并提交。参见使用rebase压缩提交
最后,您可以从主分支进行合并。
使用git merge——squash <feature branch>作为接受的答案可以达到这个目的,但它不会显示合并的分支是实际合并的。
因此,更好的解决方案是:
从最新的主分支创建一个新分支,在特性分支发起的主分支中提交。 使用git Merge—squash将<feature branch>合并到上面 将新创建的分支合并到master中。这样,特性分支将只包含一次提交,合并将在一个简短而整洁的插图中表示。
这个维基详细解释了这个过程。
在下面的例子中,左边的截图是qgit的结果,右边的截图是:
git log --graph --decorate --pretty=oneline --abbrev-commit
两个屏幕截图都显示了同一存储库中相同的提交范围。尽管如此,由于南瓜的存在,右眼更紧凑。
随着时间的推移,主分支偏离了db。 当db特性准备就绪时,一个名为tag的新分支会在master的提交中创建,db的根也在这个提交中。 从标签开始执行一个git merge -squash db,然后所有的更改都被分阶段提交,并在一次提交中提交。 从master,标签已合并:git合并标签。 分支搜索是不相关的,没有以任何方式合并。
另一个选项是git merge——squash <feature branch>,然后最后做一个git提交。
从内部
——南瓜 ——no-squash 生成工作树和索引状态,就像真正的合并一样 发生了(除了合并 信息),但实际上并不制造 提交或移动HEAD,也不记录 $GIT_DIR/MERGE_HEAD导致下一个 Git commit命令创建一个合并 提交。这允许您创建一个 在当前的基础上进行单次提交 效果相同的分支 合并另一个分支(或更多分支) 章鱼的例子)。