重写整个git历史

时间:2016-11-08 18:05:05

标签: git github

很久以前,我在github上分了一个repo并对几个不相关的功能进行了一些修改,当时我基本上对git一无所知,所以我的提交基本上只是“无论我碰巧从事过什么工作每当我记得最后一次承诺是“。我想在上游贡献一些我的更改,但是当我的repo处于当前状态时,这是不可能的。既然我实际上已经使用git足够长的时间来熟悉它,并且更加了解良好实践,是否有可能重写我的整个提交历史记录以便分解少量的大型提交,每个提交包含许多不相关的更改,进入较小的个人提交,只包含相关的变化?如果没有别的,我可以删除Github上的fork,重新分叉,使用我当前的本地副本覆盖所有内容并运行一堆部分提交,但是如果有更好的方法会很好。

2 个答案:

答案 0 :(得分:0)

使用git命令彻底修改提交历史记录rebase。 Git提供了强大的工具来操作git历史记录,但是你的问题太宽泛了,无法真正提供有用的答案:

  

是否可以重写我的整个提交历史记录?

是的,你可以。

但你到底想要做什么?人们需要一个例子和一个你需要帮助的具体问题。

创建历史记录的一个示例选项,其中每个提交添加每个文件:

我假设您当前的HEAD位于master,具有最终所需的代码状态。

git rev-list --max-parents=0 HEAD | tail -1 # gets commits with no parents

应该返回第一次提交的SHA。 checkout表示SHA。

git checkout $(git rev-list --max-parents=0 HEAD | tail -1)
git checkout -b rewritten-history

现在,对于处于最终所需代码状态的每个文件:

git checkout master -- <<filepath>> # gets file and adds to git index
git commit -m "Added <<filepath>>"

完成此操作后,masterrewritten-history应该相同:

git diff rewritten-history master # should return no differences

现在,您可以将master移至新历史记录的顶部:

git checkout master
git reset --hard rewritten-history
git branch -d rewritten-history # optional, since you don't need this anymore

如果您认为这需要做很多工作,那么您可能是对的。就像不断/迭代地重构一致的代码质量一样,保持git历史清理要比回过头来修复历史要容易得多。

答案 1 :(得分:0)

是的,可以重写整个历史记录......但对于您的情况,您不必这样做。你只需要重写你工作的位。这可能只是对IHeartbeatService分支的更改。为此,您可以为mastermaster之间的所有更改执行交互式rebase,这是他们上游的。

要执行此操作,请首先结帐主服务员,然后origin/master。这将引导您进入编辑器,您可以在其中选择如何处理每个提交。您可能想要编辑它们(git rebase -i origin/master)。保存文件后,Git将依次检查每个更改,您可以使用它来执行您喜欢的操作。

如果要拆分提交,请使用git add -p and git add -i将更改一次添加到暂存区域,然后e只提交更改的一部分。

有关详细信息,请阅读Rewriting History in Pro Git和Github About Git Rebase