【问题标题】:git: can merge handle copies as it does renames?git:可以在重命名时合并处理副本吗?
【发布时间】:2013-01-23 04:27:50
【问题描述】:

在 mercurial 中,我可以hg copy 一个文件,当我更改旧分支中的原始文件并将其合并到我当前的分支时,文件的原始文件和副本都会合并更改在

我知道 git 在合并时可以很好地处理重命名。如果我将文件originalfile 重命名为newfile,在一个分支中更改为originalfile 并将该分支合并,然后git 会将对originalfile 所做的更改应用到newfile

我不能让它做的是处理副本。 Git 可以检测副本,但如果我将originalfile 复制newfile 并进行与上述相同的合并,那么只有originalfile 被更改,而不是副本。

在这方面有没有办法让 git 像 mercurial 一样工作?

【问题讨论】:

  • “更改旧分支中的文件”。在 Git 用语中,这听起来像是修改作为复制操作的祖先的提交,因此听起来您希望副本更改,因为您“及时返回”并在复制之前更改了原始文件。正确的? (我对 mercurial 不是很熟悉。)
  • 所以,originalfile 在 'master' 上,我执行 'git checkout -b somebranch' 并进行复制、提交,然后执行 'git checkout master',更改 originalfile 并尝试合并 master进入某个分支。没有进行任何修改。
  • 这与其说是一个文件 copy,不如说是一个文件 fork。您似乎在想,如果我将一个文件的十几个副本以不同的名称复制,那么git 会在我更改原始文件时使所有文件保持最新,尽管对副本进行了任何其他更改。在某些情况下,这可能有用,但 git 并非旨在以这种方式做事。
  • @twalberg,不幸的是,我开始认为你是对的。我认为 mercurial 有这种能力,也许有办法让 git 做同样的事情。特别是因为您可以使用 --find-copies-harder 和 git diff 来识别文件副本。如果这是一个答案,我会接受你的评论。

标签: git version-control merge


【解决方案1】:

合并是基于每个分支的。由于文件副本位于不同的分支上,Git 将它们视为不同的文件以进行合并。 (一次只能合并到一个分支。)

【讨论】:

  • 如果我重命名/移动分支上的文件,git 合并没有问题,因为它将重命名的文件视为同一个文件。所以它与分支本身无关。只是我希望副本的处理方式与对待移动的方式相同。
猜你喜欢
  • 2019-08-13
  • 2012-10-29
  • 2011-02-11
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
相关资源
最近更新 更多