0

我一直很懒,把我所有的提交都放到了主分支中。我现在想做的是像本指南所说的那样构建我的 git 存储库:http: //nvie.com/posts/a-successful-git-branching-model/

我现在要做的是将我在 master 中的所有提交移动到一个名为 master-cleanup 的新分支。然后我想将 master-cleanup 与 master 合并,这样我在 master 中只有一个提交。我想这样做的原因是 master 中的所有提交都占用了大量空间,如果我将所有提交移动到清理分支,我想我可以在本地机器上删除该分支,并且只将它放在服务器。这样,当我签出我的主分支时,我只会下载最新的提交而不是所有的历史记录,对吗?

我尝试通过首先创建新分支然后将 master 重置为第一个提交来做到这一点。之后,我使用 no-ff 与 master-cleanup 合并:

git branch master-cleanup
git reset --hard 4f8d90cc225288bf889090f80103cfa0887a4742
git merge --no-ff master-cleanup

我认为这会将我的所有提交移动到新的 master-cleanup 分支,但是当我执行合并时,我也会导入所有提交。我认为 --no-ff 会阻止这种情况并强制合并成为对主人的新单一提交?现在我 git 整个提交日志加上新的合并提交......

关于如何解决我想做的任何想法?

4

3 回答 3

1

--no-ff意味着没有快进。即使合并的分支直接跟随您的顶部,它也可以确保您获得 2-parent 合并提交。没有你只会得到一个线性历史,而不会暗示合并的一堆提交属于一起。

要将提交合并到您使用的提交merge -- squash中,或者如果已经存在,您可以使用rebase -i并询问壁球。或reset --soft更低点,并提交索引。


至于问题的另一部分,历史确实占据了一些空间,但在来源方面很少值得一提。如果您只是对处理过去不感兴趣,请不要理会 repo。只需对其进行浅层克隆。继续阅读git clone --depth 1。就算不用来练习,也可以做出这样的克隆,看看大小差异,决定不值得摆弄。

于 2013-06-27T08:39:34.793 回答
0

无需创建新分支。有很多方法可以做到这一点。让我先弄清楚这一点。您想将所有提交合并到一个提交中。这是你的问题对。

试试这些命令

git log --oneline //Show all your commits. (Note down the SHA of your first commit)
git rebase --interactive 22dacee where 22dacee is the SHA you noted in above step.

现在,将弹出一个编辑器并向您显示类似这样的内容

pick aasad23 X
pick a434fsa Y
... a long list follows.

# Rebase adrtec..ds3452 onto adrtec
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.

现在,只需将除第一个单词之外的所有pick单词替换为。s并保存文件。新编辑器将再次弹出,并显示哪些提交将被合并。只需重新检查一次并再次保存。你会看到现在只有一个提交。

于 2013-06-27T08:38:10.693 回答
0

您需要--squashgit merge. 有关更多信息,请参阅答案。

于 2013-06-27T08:06:58.277 回答