Git - 压扁整个分支 - 一行压扁命令

mas*_*roy 16 git squash git-squash

当我正在处理新代码时,我会做很多小提交来跟踪我的更改.但是,我的公司更喜欢在一次提交中提交每个功能.所以解决方案是将我的整个分支压缩到一个提交.

我怎么压扁整个分支而不使用git rebase --interactive,然后改变picksquash对所有提交?

mea*_*gar 16

我的首选方法是双线(不包括下面的步骤1和4).其优点是你不需要知道/记录任何提交的ID,你可以写一个简单的别名来执行所有涉及的步骤,以及你的实际移动你的整个分支到原点 /主,使得实际合并到主可以快速 - 前进,不存在任何冲突.

首先,我的假设:

  • 你正在做一个名为的分支my-feature-branch.这个分支与master几个提交有所不同; 这是签出的分支.
  • 你的本地master轨道远程分支origin/master
  • 您希望将所有my-feature-branch提交压缩到当前状态的原始状态/主数据上的单个提交(不是您的本地master,可能已过期)
  • 您的所有更改都已提交,您没有任何未经更改的更改(它们将在丢失期间丢失git reset --hard)

我的流程如下:

  1. 获取,origin/master当前是:

    $ git fetch
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过将其重置为指向,删除本地分支上的所有提交 origin/master

    $ git reset --mixed origin/master
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将所有旧更改从分支的先前状态合并到索引中

    $ git merge --squash HEAD@{1}
    
    Run Code Online (Sandbox Code Playgroud)
  4. 提交您的更改 - Git将使用提交消息预先填充您的编辑器,该消息包含来自压缩提交的所有提交消息

我提到的简单别名是:

alias squash="git fetch; git reset --mixed origin/master; git merge --squash HEAD@{1}"
Run Code Online (Sandbox Code Playgroud)


ian*_*ini 10

这是一个完美的用例git reset --soft

假设你有一个提交历史

D   Your latest patch
C   Your second patch
B   Your first patch
A   Someone else's work
Run Code Online (Sandbox Code Playgroud)

没有分阶段更改,并且git statusgit log或者git show告诉您当前处于提交 D。

然后,git reset --soft B将提交的累计变化CD和舞台他们提交。git commit --amend然后将这些更改“合并”到提交 B 中。

使用方法如下:

git reset --soft B
git commit --amend
Run Code Online (Sandbox Code Playgroud)

第二个命令将打开您的编辑器,并有机会编辑提交消息。

请注意,如果您在开始此过程之前已暂存更改(您已完成git add XXX但没有跟进git commit),那么这些暂存更改也将合并到提交中。

  • 我认为这是一个真正被低估的答案,并且不仅仅对合并有用。 (2认同)

twa*_*erg 8

可能最好的选择是git merge --squash在合并时使用.这将使你的分支开发,这通常更容易进行故障排除,因为你将有一些概念"我正在改变提交Z中的特定功能",并查看该特定提交,你有所有您对多个文件所做的任何更改的上下文 - 查看单个提交,这是您的开发路径的压扁结果使得它更难记住"哦,是的,我必须在另一个文件中更改另一个,也......".您还可以使用的好处git bisect,当你有你的整个路径-在所有它可以告诉你,在挤压的情况是"这个巨大的承诺打破了这里的东西".

使用的结果git merge --squash是您正在"合并"到分支上的单个提交,其中包含来自分支的累积更改,但它会单独保留原始分支.


小智 6

在启动分支之前找到提交的哈希值并将其复制到剪贴板中。然后重置为该哈希。

$ git reset [hash]
Run Code Online (Sandbox Code Playgroud)

然后只需在单个消息中重新添加并重新提交更改。

$ git add -A
$ git commit -m 'EVERYTHING SQUASHED'
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是你写:*软重置到那个散列*;那是误导。 (3认同)
  • 如果要进行软重置,则需要显式使用 `--soft` 标志(`git reset --soft <commit>`),因为默认情况下 Git 会执行混合重置。 (2认同)

mas*_*roy 3

编辑 git 配置文件~/.gitconfig并将以下内容添加到别名部分

[alias]
    squash = "!f(){ CUR=`git rev-parse HEAD` && git reset --soft ${1} && git commit -m \"$(git log --format=%B ${1}..${CUR})\"; };f"
Run Code Online (Sandbox Code Playgroud)

此别名获取当前 HEAD 提交哈希,重置回您指定的提交,并创建一个保留所有提交消息的新提交。

用法:

git squash <refspec>
Run Code Online (Sandbox Code Playgroud)

refspec 可以是任何有效的提交引用,例如提交哈希、分支名称、标记名称、HEAD^ HEAD~3