从一个范围中压缩历史:从最初的提交到另一个提交

时间:2017-03-23 20:18:45

标签: git github merge

我试图找出如何在一系列提交中压缩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  /

这是我尝试过的东西

  1. 通过git rev-list --max-parents=0 HEAD获取初始提交的SHA,以获取我要压缩范围的 下限 Source
  2. 通过git checkout <upper bound commit>
  3. 将HEAD分离到范围的 上限
  4. 软重置到下限并提交(替代git rebase -i):git reset --soft <lower bound commit> && git commitSource
  5. 合并到mastergit merge --no-ff master
  6. 我最终以这种方式获得了大量的合并冲突。我觉得我试图通过我遇到的命令实现的目标是可能的,但我不知道如何将它们串在一起以使其工作。

2 个答案:

答案 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)

  1. 不要这样做。
  2. 您可以创建一个新的存储库。因为这与在开始工作之前压缩所有提交完全相同。 # 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.
  3. 您创建一个没有父级的新提交作为“压缩”提交。 让我们假设真实的历史记录在一个名为“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...
    
  4. 我仍然认为你不应该这样做。

  5. 最后说明:我认为子树可能是一种选择。我尝试使用git subtree,但这不适用于--prefix=.