在文件内容的重大重组期间保持git历史

时间:2018-04-13 14:57:57

标签: git refactoring structure

我正在重组/重构一个更大的库,这意味着我需要重新分类和重新排序现有的功能。这包括在文件中移动代码,在文件之间移动

现在我有点担心这会弄乱项目的git历史。所以我的问题是:它真的会搞砸了吗?如果是这样,有什么方法可以阻止这种情况吗?

在我看来,这个过程将被git识别为一大堆添加和删除。这是正确的方法吗?或者一些非正统的方法,比如做一些较小的逐步提交有助于完成任务吗?

如果有人能给我一些关于这个过程的见解,那就太棒了。谢谢!

1 个答案:

答案 0 :(得分:0)

历史,在Git中,提交。或者更确切地说,提交历史。它就是它的全部内容:保留提交并保留历史记录。使用不同的提交,您有不同的历史记录。添加新提交,然后添加新历史记录。

  

在我看来,这个过程将被git识别为一大堆添加和删除。

Git不存储添加和删除。每次提交都是完整快照。您通过其哈希ID识别提交:a234567...或其他。当你(或任何人)提交提交时,这包含索引中的每个文件,因为Git只是通过将索引转换为快照来进行提交。

每个提交也有一些父母列表,通常只有一个提交:

$ git log --first-parent
commit fd2fb4aa0cc2a25a8e4ddf3f3c48880f317edcf4
Author: ...
   [snip]

commit 4bdd6e7ce33c72dfaa79c4139d30bd809ec8eda7
Author: ...
   [snip]

这里提交fd2fb4a...是提交4bdd6e7...。例如,历史记录4bdd6e7就在fd2fb4a之前。因此,如果您想查看fd2fb4a 的作者更改的内容,您可以告诉Git 4bdd6e7中的快照 - "之前"图片 - fd2fb4a中的快照。

比较会产生添加和删除。 (这种比较将提交转换为 changeset ,因为之前的一些提交 - 通常是它的直接父级。)然而,提交本身可以独立存在。

如果你想知道某个文件发生了什么,你会指示Git按顺序查看每个提交,看看发生了什么变化,但只有告诉你有关该提交的内容一个文件已更改。如果您重命名该文件,那么,现在你告诉Git要查找的一个文件有一个不同的名称,它将会查找错误的文件。< / p>

git log命令有一个标志--follow,它试图解决此问题。它查看每个父/子对并猜测哪些文件被重命名。如果其中一个文件是你告诉Git查看的那个文件,Git然后改变它正在寻找的一个名字。如果父/子关系中的更改只是文件重命名,则此过程效果最佳,但如果重命名文件,Git将做出最佳猜测使用&#34;相似性索引&#34;更改文件的内容。探测器。 (这比仅重命名和提交更慢,更准确。)

目前,这就是你能得到的一切。如果Git可以更好地跟踪多个文件名中的名称更改,那将是很好的,但如果您需要,则必须编写自己的工具。