如何最好地压缩旧提交

时间:2016-01-11 23:57:46

标签: git git-squash

最近离开的一位开发人员在几个月前的回购邮件中留下了大量的提交,就像更新了#39;理想情况下,我想将它们压缩成一个提交,但我只是为最近的提交做了这个。

我如何做以下提交(假设从2个月前开始意味着有数百个)?

....来自2个月前

aabbcc updated
aabbdd updated
aabbee updated
aabbff updated

不想/需要任何花哨的东西,只是一个简单的解决方案。这些提交尚未被公开分享(除了我今天之外)所以没有任何问题会让其他人的提交历史感到不安。

3 个答案:

答案 0 :(得分:3)

为了做一个git squash,请按照以下步骤操作:

// X is the number of commits you wish to squash
git rebase -i HEAD~X

一旦你压缩你的提交 - 选择s进行squash =它会将所有提交合并为一个提交。

enter image description here

如果需要,还有--root标志

尝试:git rebase -i --root

- root

Rebase all commits reachable from <branch>, instead of limiting them with
an <upstream>.

This allows you to rebase the root commit(s) on a branch.  
When used with --onto, it will skip changes already contained in `<newbase>`   
(instead of `<upstream>`) whereas without --onto it will operate on every 
change. When used together with both --onto and --preserve-merges, all root 
commits will be rewritten to have `<newbase>` as parent instead.`

答案 1 :(得分:2)

提交的年龄并不重要,压缩提交正在压缩提交。

如果rebasing不适合你,或者你想要压缩成千上万的提交并且不能被它打扰,你可以轻轻地重置为第一个提交哈希并重新承诺一切:

$ git reset aabbff 
$ git commit -m "This commit now contains everything from the tip until aabbff"

然后你只有一个提交,与rebase相同 - &gt;壁球。

答案 2 :(得分:0)

我知道这已经是一个古老的问题,但是我需要一个解决方案。

长话短说,我的本地git repo(在NFS上,没有上游)可以作为某些文件的备份,并且我希望它最多可以进行50次提交。由于文件很多并且备份经常发生,因此我需要自动压缩历史记录的文件,因此我创建了一个脚本,既备份文件又压缩历史记录。

#!/bin/bash

# Max number of commits preserved
MAX_COMMITS=50

# First commit (HEAD~<number>) to be squashed
FIRST_SQUASH=$(echo "${MAX_COMMITS}-1"|bc)

# Number of commits until squash
SQUASH_LIMIT=60

# Date and time for commit message
DATE=$(date +'%F %R')

# Number of current commits
CURRENT_COMMITS=$(git log --oneline|wc -l)

if [ "${CURRENT_COMMITS}" -gt "${SQUASH_LIMIT}" ]; then

    # Checkout a new branch 'temp' with the first commit to be squashed
    git checkout -b temp HEAD~${FIRST_SQUASH}

    # Reset (soft) to the very first commit in history
    git reset $(git rev-list --max-parents=0 --abbrev-commit HEAD)

    # Add and commit (--amend) all the files
    git add -A
    git commit --amend -m "Automatic squash on ${DATE}"

    # Cherry pick all the non-squashed commits from 'master'
    git cherry-pick master~${FIRST_SQUASH}..master

    # Delete the 'master' branch and rename the 'temp' to 'master'
    git branch -D master
    git branch -m master

fi

因此,脚本的基本作用是(我删除了备份部分):

  1. 如果提交超过60个,它将把50至60+的所有提交压缩为一个提交。
  2. 它基于提交创建并签出新分支
  3. Cherry从主服务器(从#1到#49)中选择剩余的提交到分支机构
  4. 删除主分支
  5. 将新分支重命名为master。