首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >git重基,提交重复

git重基,提交重复
EN

Stack Overflow用户
提问于 2016-03-04 07:03:57
回答 1查看 2.8K关注 0票数 6

我正在我的回购的另一个分支工作,需要从主分支带来改变。我有做git rebase master的习惯,一切都很好。然而,在最近的几个项目中,我看到在日志中重复提交,而重基倾向于抱怨(大声):

代码语言:javascript
复制
$ git log --graph --abbrev-commit --decorate ...
*   4988d49 - (2 hours ago) Merge branch 'branchname' of ... 3
|\
| * e979be1 - (2 days ago) change verbiage 10
| *   93a1c80 - (2 days ago) Merge branch 'branchname' of ... 2
| |\
| | *   4e4e790 - (2 weeks ago) Merge branch 'branchname' of ... 1
| | |\
| | | * 87cc232 - (8 weeks ago) change verbiage 3
| | | * 3d5cf09 - (8 weeks ago) change verbiage 2
| | | * aea4cbd - (9 weeks ago) change verbiage 1
| | * | a7043ef - (2 weeks ago) change verbiage 6
| | * | fa3413b - (2 weeks ago) change verbiage 5
| | * | be038a7 - (2 weeks ago) change verbiage 4
| | * | 37cb1e6 - (8 weeks ago) change verbiage 3
| | * | 1ab71c6 - (8 weeks ago) change verbiage 2
| | * | c4560f4 - (9 weeks ago) change verbiage 1
| * | | d3211fd - (2 weeks ago) change verbiage 6
| * | | 72a2a4a - (2 weeks ago) change verbiage 5
| * | | ae1c123 - (2 weeks ago) change verbiage 4
| * | | 8328c08 - (8 weeks ago) change verbiage 3
| * | | e52588f - (8 weeks ago) change verbiage 2
| * | | 114cbec - (9 weeks ago) change verbiage 1
* | | | 38bd6ce - (2 hours ago) change verbiage 9
* | | | 5aaf360 - (2 hours ago) change verbiage 8
* | | | 2745790 - (2 days ago) change verbiage 7
* | | | 7bb613f - (2 weeks ago) change verbiage 6
* | | | 726a312 - (2 weeks ago) change verbiage 5
* | | | 771dd7f - (2 weeks ago) change verbiage 4
* | | | b451926 - (8 weeks ago) change verbiage 3
* | | | 484d5dc - (8 weeks ago) change verbiage 2
* | | | 630df34 - (9 weeks ago) change verbiage 1

(为了简单起见,我更改了提交消息。这里只显示一个分支,尽管有四条“管道”。)我在这个项目上做了一些重新定位,我认为可以根据(比如说)更改语句1的重复次数来跟踪它们。

我以为我是在做一个项目工作流的“最佳实践”的事情,通过重新定位到合并。我认为以前的重基至少有一次是用-no-ff完成的,但我看不出行为上有什么不同。

当提交被重放时,它们会发生冲突(很明显,将一个提交放在自身之上是有问题的),所以我被迫做一个交互式重基,删除所有重复的提交。

由于无法访问回购程序本身,这是我的工作流程中的问题吗?这是否意味着该部门还存在其他问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-04 07:56:38

为什么?

看起来,您修改了旧的提交和重基,另一个分支已经指向了。所以所发生的是:

你有一个看起来像这样的达格:

代码语言:javascript
复制
* abc123 (master) Most recent commit
|
| * f00ba12 (foo, HEAD) Some feature you're working on
| |
|/
* 192837 Fix the things
|
* 348cc87 Remove Peter's garbage code
|
* 000a0a WOOOORRRDDDDDSSSS

因此,您目前正在foo上做一些事情,但是您意识到仍然存在一些Peter的垃圾代码,并且希望删除它。作为一个优秀的程序员,您希望这些更改与其他更改一起在commit 348cc87中。所以,你做一个重新基地,回到那个点,并修改在。

这看起来很好对吧?问题是,你改变了348cc87,所以它不再是348cc87了。现在是它的111222,因为要记住,提交哈希是从项目的树中计算出来的。其他事情之一是父提交哈希(000a0a)。因此,由于348cc87现在是111222,“192837”被重新计算为999999f00ba12更改为ba12f00。所以现在你头上的木头看起来像

代码语言:javascript
复制
* ba12f00 (foo, HEAD) Some feature you're working on
|
|
* 999999 Fix the things
|
* 111222 Remove Peter's garbage code
|
* 000a0a WOOOORRRDDDDDSSSS

这成为一个问题,因为abc123仍然指向192837,这是因为提交对象192837仍然存在于git中。这是因为从git的角度来看,192837abc123有着明显的不同,而提交恰好具有相同的日志消息。

所以现在您的git dag看起来是:

代码语言:javascript
复制
* abc123 (master) Most recent commit
|
| * f00ba12 (foo, HEAD) Some feature you're working on
| |
| * 999999 Fix the things
* | 192837 Fix the things
| | 
| * 111222 Remove Peter's garbage code
* | 348cc87 Remove Peter's garbage code
|/
* 000a0a WOOOORRRDDDDDSSSS

现在,当您完成foo分支的工作并准备进行合并时,您将

代码语言:javascript
复制
* 5f93da (master) Merge 'foo' into 'master'
|\
* | abc123 Most recent commit
| |
| * f00ba12 (foo, HEAD) Some feature you're working on
| |
| * 999999 Fix the things
* | 192837 Fix the things
| | 
| * 111222 Remove Peter's garbage code
* | 348cc87 Remove Peter's garbage code
|/
* 000a0a WOOOORRRDDDDDSSSS

做很多这样的事情,你就会陷入当前的处境。

但凯尔,我该怎么解决这个?等一下,r2evans,我要到了。

如何解决问题

有几种方法可以解决这个问题,考虑到某些情况,我知道所有的方法都比较复杂。

  • 你可以把很多东西挤在一起,这样提交的次数就少了,但你失去了一些我不喜欢的历史。
  • 您可以使用更多的重定位魔法来更改您的“abc123”提交,让更新的999999提交作为它的父级。你可以用- for参数来做这个。根据在这种情况下提交的次数,这可能具有挑战性。
  • 你可以把它留在原处。只要师父的提示是正确的,这并不可怕,但很难回顾你的历史。

这有问题吗?

是。这看起来像是工作流中的一个问题。由于这个原因,编辑历史往往不是一个好主意,你通常应该避免它。

对我来说,master跟踪什么是公开的。这是代码,我和我的队友的基础,我们的变化。我从不修改掌握中的提交。第一,因为我们的内部git不允许我推动这样的变化(即使-强制),其次,因为这会扰乱我的队友的代码(并把他们放在你的位置)。

我为特定的特性在master上创建特性分支,所以我将分支foobarfizzbuzz作为独立的分支,而不是彼此分开。这使我可以独立地处理每一个问题。我通常不会从特性分支中分离,但当我这样做时,通常不会对提交历史进行任何编辑。这是因为在合并之前,我通常会清理分支,所以我不需要这样做。

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

https://stackoverflow.com/questions/35789982

复制
相关文章

相似问题

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