我试图找出如何在一系列提交中压缩Git中的提交。我的具体情况是我分叉了一个存储库,并在其上添加了几个工作提交;但是我想把所有分叉的repo的提交压缩到一次提交以保持历史清洁。
7e8d7f7 - (HEAD) My commit
809fc8b - My commit
e04692c - Forked repo's commit \
2674323 - Forked repo's commit > Turn these into a single commit
4e79731 - Forked repo's initial commit /
git rev-list --max-parents=0 HEAD
获取初始提交的SHA,以获取我要压缩范围的 下限 (Source)git checkout <upper bound commit>
git rebase -i
):git reset --soft <lower bound commit> && git commit
(Source)master
:git merge --no-ff master
我最终以这种方式获得了大量的合并冲突。我觉得我试图通过我遇到的命令实现的目标是可能的,但我不知道如何将它们串在一起以使其工作。
答案 0 :(得分:3)
首先,我会避免这样做。
Git历史是一件很美好的事情,你回购的未来用户可能想知道你分叉的确切位置。
或者您可能希望稍后从遥控器中提取其他提交内容,如果您不想忘记共享历史记录,这可能会更容易。
那就是说,这对你有用:
git checkout e04692c -b squashing_branch
git reset --soft $(git rev-list --max-parents=0 HEAD)
git commit --amend -m "Forked repo as one big commit"
git cherry-pick e04692c..master
答案 1 :(得分:0)
# Get the original git repository somehow
$ git clone URL
# Delete the old repo
$ cd your-repo; rm -rf .git/
$ git init # create new repo.
$ git add -a
$ git commit -m 'Forked repo from X and squashed all commits'
# Now start working.
# Again, I think this whole undertaking is misguided.
您创建一个没有父级的新提交作为“压缩”提交。 让我们假设真实的历史记录在一个名为“long_history”的分支上。
git checkout master # assuming on master is the complete history.
# Create a new branch without any history. A new root so to speak.
git checkout --orphan squashed_master
# All the files from the original 'master' will be already added
# to the index.
git commit -m 'Squashed all of the previous history as cloned from X'.
# Delete the master branch and create it again
git branch -D master
git branch master
git push --force -u origin master # Assuming that 'origin' is the remote of your fork and not the original repository. Change accordingly...
我仍然认为你不应该这样做。
最后说明:我认为子树可能是一种选择。我尝试使用git subtree
,但这不适用于--prefix=.
。