【问题标题】:Move a file/directory but still merge changes easily?移动文件/目录但仍能轻松合并更改?
【发布时间】:2010-12-16 21:32:44
【问题描述】:

我在各种常见问题解答中看到git 没有明确跟踪重命名/移动,而是更喜欢寻找相同(或在某些情况下类似?)的文件。这很好,但它能否应对这种情况:朋友的远程存储库有一个新功能 (i18n),其中涉及一些位于 debian/po/*.po 的新文件。我有我自己的这个项目的分支,并且想合并这个功能,但把文件放在po/*.po (我可以做两次提交,或者任何必要的)。我希望远程仓库将继续接收该功能的更新,我只想合并/挑选这些提交并将它们应用于我新位置的文件。 git 可以做到这一点,也许是“这些文件现在已经移到这里”的某种映射?还是它比它的价值更痛苦,我应该接受我的回购中稍微奇怪的debian 路径吗?

【问题讨论】:

    标签: git merge rename


    【解决方案1】:

    使用git mv,一切都会正常。

    为什么不直接尝试而不是询问?您可以随时在 git 中轻松重置。 :)

    【讨论】:

    • 好吧,我只是想看看是否有人指出如果远程仓库中发生了我没有尝试过的奇怪事情并且我没有弄错正确的魔法鸡,那么以后可能会出现任何问题当我进行移动或合并时。我只使用了几个星期的 git,并且仍然有(不)健康剂量的偏执狂从较小的 VCS 中遗留下来。 :-)
    • 如果文件大相径庭,那么跟踪更改将有困难,但是无论您是否重命名它都会有这个问题;)
    • 谢谢,到目前为止看起来确实一切正常。
    • 仅供参考:“git mv”与自己重命名文件并提交类似的更改没有什么不同。这更容易。
    • 有一些陷阱,请参阅:git.661346.n2.nabble.com/…
    【解决方案2】:

    Git 缺乏一种机制来表明您希望在进行两个项目/分支等之间的差异时会有 路径 重命名和更新。

    有各种可用的文件重命名选项(例如 -M 和 --patience),但速度可能很慢。

    如前所述,路径重命名不会影响存储库本身,因为它只是您的内容(blob)和结构(树节点)的快照。如果您所做的只是添加了一个额外的顶级目录,那么下面的所有树和 blob 都不会改变,并且需要零额外存储。您只需要一个用于提交的树节点和一个用于新 tld 的树节点。容易死。 Git 处理这部分没有问题。

    只有当您想要进行比较(以及任何补丁)时才重要。最好有一个 -P 选项来表示您期望一些路径重命名,并且 diff 可以轻松应对。看到 200 个文件删除和 200 个新文件并不好 ;-)

    了解如何添加 -P 选项是我的另一个“待办事项”列表项(我希望我能抽出一些时间)。

    【讨论】:

      【解决方案3】:

      或者,使用mv 重命名文件,并调用git add --all 来暂存所有删除操作并添加未跟踪的文件(新文件名)。如果没有--all,您必须分别显式暂存删除操作和新文件名。也不要使用git add --update,因为这将暂存所有删除操作,但不会添加新文件名。

      请注意,您可能希望在本地分支中执行这些操作,这样您就不会无意中将它们 push 发送到您朋友的主分支,或者您的朋友不会 pull 将它们发送到他的主分支。

      【讨论】:

        猜你喜欢
        • 2019-11-29
        • 1970-01-01
        • 2010-10-07
        • 2019-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-10
        相关资源
        最近更新 更多