我有一个带有几个分支的本地git存储库。我想在本地删除所有非主分支,以及不在主分支上的提交。如何删除不在主分支上的所有提交?
我后来做了一个樱桃挑选,但失败了,因为它到达了一个合并的提交,所以它有两个父级。我需要做什么才能使它只有一个父分支(来自主分支)?
发布于 2019-08-06 00:34:23
git branch | grep -v "master$" | xargs git branch -D 上面的代码将获取所有分支,过滤掉包含"master“的分支,然后删除它们。
当Git下一次执行垃圾回收时,现在孤立的提交将被删除。如果你想现在强制这样做,你可以运行:
git gc --prune=now --aggressive发布于 2019-08-06 02:54:00
你的问题中关于删除所有非主分支的部分已经回答了。但是:
我后来做了一个樱桃挑选,但失败了,因为它到达了一个合并的提交,所以它有两个父级。我需要做什么才能使它只有一个父分支(来自主分支)?
你对此无能为力。任何现有的提交都不能改变:你不能改变,Git也不能改变。如果你删除分支名称,认为这可能也会改变现有的提交,那么它不会:它所做的只是不可能找到一些现有的提交。
一旦提交是无法找到的(在技术术语中是无法到达的),git gc将(最终)将其完全删除。但是,合并提交及其两个父级使两个父级都可以找到:查找合并-通过从某个分支名称开始并向后遍历历史-自然会找到两个父级,然后是父级的父级,依此类推。
有关这方面的(更多)信息,请参阅Think Like (a) Git。
您可能想要做的是以下两件事之一,而不是试图修改现有的提交:
git cherry-pick -m number指定哪个父级将为合并生成差异您可以将git cherry-pick视为含义:获取我命名的快照(提交),并将其转换为更改(与其父对象不同),然后将这些相同的差异应用于我当前的提交。不过,这只是一个近似值。
您可能会有一系列的提交,可以像这样绘制:
o--o--A--B--o--...--o <-- branch1
/
...--o--*
\
o--o--o--C <-- branch2 (HEAD)在这里,您当前的提交是提交C (C代表它的实际散列),并且您在分支branch1上。如果你使用git cherry-pick B,Git会比较A和B,并合并A和C之间的差异。因此,樱桃-pick实际上是一种合并,而不是一种比较和应用;这就是有时会导致奇怪的合并冲突的原因。
在任何情况下,这显然只适用于非合并提交,因为合并有两个父级:
o--...--A
/ \
...--* M--...
\ /
o--...--B如果你要求精挑细选M,Git应该将M与A比较,还是与B比较?将A和B中的哪一个与您当前的提交进行比较?
cherry-pick命令的-m开关允许您进行选择。如果您选择A,Git将合并A到M的更改和A到HEAD的更改。其效果是接受合并引入的所有更改,这是因为提交B!因此,这意味着您不再需要在B后面挑选一些提交。您得到了相对于merge base commit *-or的所有“他们”(B)更改,所有执行合并到A的人认为应该保留的更改。
请注意,您可能仍然希望在A后面提交,包括提交*本身和更早的内容。或者你可能不会,这取决于你到底在做什么。Git提供的主要是工具,而不是解决方案;您可以随意使用这些工具。
https://stackoverflow.com/questions/57362621
复制相似问题