假设一切都干净,当你做了git merge
,你可以简单地git reset --hard HEAD^
于未执行合并,并git remote remove upstream
删除远程和所有upstream/*
远程分支机构。 (您选择的提交了做git fetch upstream
加上合并仍然会在你的仓库,但除了占用磁盘空间,他们应该是无害的。最后,没有引用剩下的,他们将垃圾收集。)
请记住,虽然git merge
在工作目录中做了很多工作,但最终,就存储库而言,它所做的只是创建一个新的提交,它具有作为其第一个父代的前一个提示您所在的分支以及其父母的其余部分,您合并分支的小费:
before merge:
...--o--o--T <-- HEAD=your-branch
...--o--o--o <-- upstream/master
after merge:
...--o--o--T
\
M <-- HEAD=your-branch
/
...--o--o--o <-- upstream/master
其中T
是您的上一个分支提示,M
是合并提交。名称HEAD^
的意思是“查找当前分支的提示” - 这是提交M
- “并备份到它的第一个父母”:这是提交T
,通过合并的定义。然后,git reset --hard <sha-or-other-identifier>
告诉git做两件事:
- 更改当前分支提示指向给定的提交。在这种情况下,这意味着:将
your-branch
的提示设置为提交T
。
- 清理工作目录以使其看起来像给定的提交(的
--hard
部分)。
第1步,使提交图形看起来就像这样:
...--o--o--T <-- HEAD=your-branch
\
M [abandoned]
/
...--o--o--o <-- upstream/master
一旦做到这一点,合并提交M
留在库中,但没有分支机构或其他标签指向它,所以是我喜欢称之为“废弃”的东西。当reflog条目到期并且提交被垃圾收集时,它将在30天后真正消失。如果你也然后将其删除upstream/master
,垃圾收集M
导致提交的整个下链也成为收集好,你让你的所有磁盘空间了。
当然,而且,作为它的“树”,这次合并提交了合并后的工作目录的内容。
我的意思是标签的方式,引用日志条目不是标签本身。他们作为临时参考;它们默认持续30到90天,到期时间由两个配置项控制。较短的(30天)期满适用于引用日志指向是不从尖端到相应的参考点可达提交项。
上面是复杂的,但它意味着,例如,如果你在分支devel
,你做了一些提交,那些提交进入devel
reflog。假设你做了4次提交,然后git reset --hard HEAD^
“撤消”最后一次提交。分支devel
的提示现在指向您的第三次提交。第三次提交指向第二次,第二次提到第一次。这三个reflog条目现在被认为比第四次提交的条目“更有价值”:如果您从提交devel
名称开始,则不能前进到第四次提交,只能向后移动。
因此,其中三个reflog条目将在您的配置中保留90天,或者任何值在gc.reflogexpire
之间。第四个只会持续30天,或者任何价值在gc.reflogexpireunreachable
。
我刚刚注意到git的新版本(哪些?)用gc.pattern.reflogexpire
和gc.ref.reflogexpireunreachable
对此进行了扩充。这意味着,例如,您可以设置gc.refs/stash.reflogexpireunreachable
以保持“上一级”挡板(如[email protected]{2}
)大于默认的30天,而不会保留其他更长时间段的引用日志条目。
真棒!效果很好,细节+1 – jwags