首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除不在主服务器上的所有提交

删除不在主服务器上的所有提交
EN

Stack Overflow用户
提问于 2019-08-06 00:30:54
回答 2查看 204关注 0票数 3

我有一个带有几个分支的本地git存储库。我想在本地删除所有非主分支,以及不在主分支上的提交。如何删除不在主分支上的所有提交?

我后来做了一个樱桃挑选,但失败了,因为它到达了一个合并的提交,所以它有两个父级。我需要做什么才能使它只有一个父分支(来自主分支)?

EN

回答 2

Stack Overflow用户

发布于 2019-08-06 00:34:23

代码语言:javascript
复制
git branch | grep -v "master$" | xargs git branch -D 

上面的代码将获取所有分支,过滤掉包含"master“的分支,然后删除它们。

当Git下一次执行垃圾回收时,现在孤立的提交将被删除。如果你想现在强制这样做,你可以运行:

代码语言:javascript
复制
git gc --prune=now --aggressive
票数 4
EN

Stack Overflow用户

发布于 2019-08-06 02:54:00

你的问题中关于删除所有非主分支的部分已经回答了。但是:

我后来做了一个樱桃挑选,但失败了,因为它到达了一个合并的提交,所以它有两个父级。我需要做什么才能使它只有一个父分支(来自主分支)?

你对此无能为力。任何现有的提交都不能改变:你不能改变,Git也不能改变。如果你删除分支名称,认为这可能也会改变现有的提交,那么它不会:它所做的只是不可能找到一些现有的提交。

一旦提交是无法找到的(在技术术语中是无法到达的),git gc将(最终)将其完全删除。但是,合并提交及其两个父级使两个父级都可以找到:查找合并-通过从某个分支名称开始并向后遍历历史-自然会找到两个父级,然后是父级的父级,依此类推。

有关这方面的(更多)信息,请参阅Think Like (a) Git

您可能想要做的是以下两件事之一,而不是试图修改现有的提交:

  • 根本就不要挑剔合并。而是选择合并后面的所有提交(在合并的两个分支/两端)。
  • 或,确实选择合并,但使用git cherry-pick -m number指定哪个父级将为合并生成差异

您可以将git cherry-pick视为含义:获取我命名的快照(提交),并将其转换为更改(与其父对象不同),然后将这些相同的差异应用于我当前的提交。不过,这只是一个近似值。

您可能会有一系列的提交,可以像这样绘制:

代码语言:javascript
复制
          o--o--A--B--o--...--o   <-- branch1
         /
...--o--*
         \
          o--o--o--C   <-- branch2 (HEAD)

在这里,您当前的提交是提交C (C代表它的实际散列),并且您在分支branch1上。如果你使用git cherry-pick B,Git会比较AB,并合并AC之间的差异。因此,樱桃-pick实际上是一种合并,而不是一种比较和应用;这就是有时会导致奇怪的合并冲突的原因。

在任何情况下,这显然只适用于非合并提交,因为合并有两个父级:

代码语言:javascript
复制
       o--...--A
      /         \
...--*           M--...
      \         /
       o--...--B

如果你要求精挑细选M,Git应该将MA比较,还是与B比较?将AB中的哪一个与您当前的提交进行比较?

cherry-pick命令的-m开关允许您进行选择。如果您选择A,Git将合并AM的更改和AHEAD的更改。其效果是接受合并引入的所有更改,这是因为提交B!因此,这意味着您不再需要在B后面挑选一些提交。您得到了相对于merge base commit *-or的所有“他们”(B)更改,所有执行合并到A的人认为应该保留的更改。

请注意,您可能仍然希望在A后面提交,包括提交*本身和更早的内容。或者你可能不会,这取决于你到底在做什么。Git提供的主要是工具,而不是解决方案;您可以随意使用这些工具。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57362621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档