Answers:
git merge --squash <feature branch>
然后,另一个选择是最后做一个git commit
。
--squash
--no-squash
产生工作树和索引状态,就好像发生真正的合并一样(合并信息除外),但实际上不进行提交或移动
HEAD
,也不记录$GIT_DIR/MERGE_HEAD
导致下一个git commit
命令创建合并提交。这使您可以在当前分支的顶部创建一个提交,其作用与合并另一个分支的作用相同(对于章鱼,则更多)。
rebase --squash
找到了!合并命令有一个--squash
选项
git checkout master
git merge --squash WIP
此时,所有内容都已合并,可能会发生冲突,但尚未提交。所以我现在可以:
git add .
git commit -m "Merged WIP"
git add .
办?
git add .
会在当前目录中添加所有不可忽略的文件,因此请谨慎选择这种方式。
git add .
您可以git add -u
用来仅添加已经添加到树中的文件。
尝试git rebase -i master
您的功能分支。然后,您可以将除一个“ pick”之外的所有内容都更改为“ squash”以合并提交。查看使用rebase压缩提交
最后,您可以从master分支进行合并。
使用git merge --squash <feature branch>
作为可接受的答案可以解决问题,但不会将合并的分支显示为实际合并的分支。
因此,更好的解决方案是:
<feature branch>
到上面使用git merge --squash
该Wiki详细解释了该过程。
我已经创建了自己的git别名来做到这一点。我在叫它git freebase
!它将使用您现有的混乱,无法修复的功能分支并重新创建它,以使其成为具有相同名称的新分支,其提交被压缩为一次提交并重新基于您指定的分支(默认为master)。最后,它将允许您将喜欢的任何提交消息用于新的“基于Freefree”的分支。
通过在您的.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"
通过运行以下命令从功能分支中使用它:
git freebase <new-base>
我只测试了几次,所以请先阅读并确保您要运行它。作为一点安全措施,它确实会打印起始sha1,因此,如果出现任何问题,您应该能够恢复旧分支。
我将在github上的dotfiles仓库中维护它:https : //github.com/stevecrozz/dotfiles/blob/master/.gitconfig
git merge --squash <feature branch>
是一个不错的选择。“ git commit”告诉您所有功能分支提交消息,并选择保留它。
对于较少的提交合并。
git merge做x次--git reset HEAD ^ --soft然后git commit。
风险删除的文件可能会回来。
您可以使用“ rebase”命令执行此操作。让我们将分支称为“ main”和“ feature”:
git checkout feature
git rebase main
rebase命令将重播“功能”上的所有提交,作为父级等于“主要”的一次提交。
如果自创建“功能”以来(或自最近的合并以来)“ main”已更改git merge main
,git rebase main
则可能要先运行。这样,如果发生合并冲突,您仍然拥有完整的历史记录。
重新设置基准后,可以将分支合并到main,这将导致快速合并:
git checkout main
git merge feature