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