git - Squash 在 master 上提交但在功能分支上单独提交?

标签 git

假设我正在开发一个功能,在一个名为 foo_baz 的分支中。

我在处理该功能时多次提交。

我定期将远程跟踪分支 foo_baz 推送到远程仓库。 IE origin/foo_baz.

我想将所有提交从 foo_baz merge 到 master 并推送到 origin/master。这是问题:

我能否将 foo_baz merge 到 master 中,这样所有提交在 foo_baz 的历史中仍然是分开的,但在 master 中 的历史,它们都是一个,压扁的提交?

编辑:

我是一个 git 新手,所以如果我遗漏了一些非常明显的东西,请原谅我。我在网上四处搜寻,但找不到我的问题的直接答案。

最佳答案

您可能确实在寻找 --squash (与其他答案一样),但您可能正在寻找 --no-ff相反。

这是两者之间的区别。假设您从两个提交开始:

A --- B                <-- branch "master", when you start

然后在你的新分支上再做两个foo_baz :

A --- B                <-- master
        \
          C --- D      <-- foo_baz

现在(回到 master ),您有这两个选项(以及其他选项)。你可以git merge --squash foo_baz && git commit这将为您提供以下内容:

A --- B ----------- E  <-- master
        \
          C --- D      <-- foo_baz

或者你可以 git merge --no-ff :

A --- B ----------- E  <-- "master" after merge --no-ff
        \         /
          C --- D      <-- foo_baz

两者都给你一个新的提交 E —在第一种情况下,来自单独的 git commit命令——但是第一个抑制了多父操作,所以最后,当你一年后回顾这个命令时,看起来你只是从分支复制了所有更改。 (您在 git checkout 分支中获得的所有文件)在 D 中都是相同的和 E (无论如何,在这种特殊情况下, merge 操作之前 master 上的 B 没有更改),但它们是不同的提交。

与直线的区别git merge就是后者一般会产生“快进”,长这样:

A --- B
        \
          C --- D      <-- foo_baz, master

可以 pull 直斜线的位置,为您提供两个分支看起来完全相同的历史记录。

关于git - Squash 在 master 上提交但在功能分支上单独提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17456422/

相关文章:

git - 在 npm 包中使用非 npm-package git 子模块

ruby-on-rails - 我应该如何使用 git 子模块在 Heroku 应用程序之间共享代码?

linux - 使用公钥时 Git "ERROR:gitosis.serve.main:Repository read access denied"

git - 如何使用非 root 用户为 git 部署配置 ssh 代理服务和 key ?

git - 当我更改分支时,Netbeans 文件不会刷新

git - 可以使用 Android Studio 克隆 TFS 项目

android - git issue Android studio-致命:不是git存储库(或任何父目录):.git

git - 仅在 Git 中导出/归档更改的文件

git - 在我的本地仓库副本上运行 git reset --hard 时出现奇怪的行为

git - 如何在所有文件、所有分支、所有存储库中搜索(grep)?