一位开发人员最近离开了,他在几个月前的回购中留下了大量的提交,就像“更新”一样。理想情况下,我想将它们压缩成一个提交,但我只为最近的提交做了这个。
我将如何处理以下提交(假设从 2 个月前开始意味着有数百个)?
.... 从 2 个月前
aabbcc updated
aabbdd updated
aabbee updated
aabbff updated
不想要/不需要任何花哨的东西,只是一个简单的解决方案。这些提交尚未公开共享(除了今天与我分享),因此不会影响其他人的提交历史。
一位开发人员最近离开了,他在几个月前的回购中留下了大量的提交,就像“更新”一样。理想情况下,我想将它们压缩成一个提交,但我只为最近的提交做了这个。
我将如何处理以下提交(假设从 2 个月前开始意味着有数百个)?
.... 从 2 个月前
aabbcc updated
aabbdd updated
aabbee updated
aabbff updated
不想要/不需要任何花哨的东西,只是一个简单的解决方案。这些提交尚未公开共享(除了今天与我分享),因此不会影响其他人的提交历史。
为了做一个 git squash 遵循这些步骤:
// X is the number of commits you wish to squash
git rebase -i HEAD~X
一旦你压缩你的提交 - 选择s
for squash = 它会将所有提交合并为一个提交。
如果需要,您还有 --root 标志
尝试:git rebase -i --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.`
我知道这已经是一个古老的问题,但我需要一个解决方案。
长话短说,我的本地 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
所以,脚本的基本作用是(我删除了备份部分):
提交的年龄无关紧要,压缩提交就是压缩提交。
如果rebase不适合您,或者实际上有数千个您想要压缩并且无法打扰它的提交,您可以轻柔地重置为第一个提交哈希并重新提交所有内容:
$ git reset aabbff
$ git commit -m "This commit now contains everything from the tip until aabbff"
然后,您将只有一个提交,与 rebase -> squash 相同。