我想在Git中重命名/移动项目子树
/project/xyz
Run Code Online (Sandbox Code Playgroud)
至
/components/xyz
Run Code Online (Sandbox Code Playgroud)
如果我使用普通的git mv project components,那么所有的提交历史xyz project都会丢失.有没有办法移动这个以保持历史?
我在没有考虑的情况下手动移动了一堆文件,并且找不到让git认识到文件只是被移动而不是实际上不同的文件的方法.有没有办法做到这一点,除了删除旧的和添加新的(从而丢失历史),或使用git-mv重做所有更改?
我正在使用Git并手动重命名我已添加到存储库的文件.现在,我添加了"new"文件,我将其重命名为存储库,但Git抱怨"旧"文件已被删除.那么我怎么能让Git忘记旧文件呢?更好的是,我如何告诉Git"新"文件确实是"新"文件,以便我可以保持更改历史记录不变?
在学习了Git的几个障碍之后,我遇到了一个新的挑战:重命名目录(在本地,在工作目录中).
当我键入时git status,它会将旧目录名中的所有文件(在新目录中存在与新目录中完全相同的文件名)列为已删除,新目录名称为"未跟踪".
有没有办法告诉Git"它实际上是同一个目录,只是一个不同的名字"?
这样所有文件都只会被git status修改列出 ?
举例来说,这是git status我重命名整个目录时收到的输出:
git status
# On branch master
# Changes not staged for commit:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted: old-dir-name/file1
# deleted: old-dir-name/file2
# deleted: old-dir-name/file3
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# …Run Code Online (Sandbox Code Playgroud) 我在一个月前做了一个提交,涉及我创建新的文件夹和子文件夹,并在我们之间移动我的源代码文件.我从那时起第一次浏览我的历史并且意识到git已经"丢失"了历史,因为原始文件被删除然后重新添加,我想 - 即当我在我的git GUI中查看文件时(它是根据NDA,所以我不能直接讨论它,但是例如,这个存储库也在GitHub上被破坏.GitHub清楚地显示它将提交检测为一系列动作.)它只显示每个文件的历史记录,当项目文件夹时被重组了.
在阅读了几个问题(获取Git以确认以前移动的文件,如何使git标记为已删除文件和将新文件作为文件移动?)之后,我比起初时更加迷失.从那些答案中听起来我根本无法解决这个问题?我真的很感激这里的任何帮助.
我很清楚Git如何支持文件移动:因为它使用文件哈希,"添加"文件很容易被检测为与"删除"文件相同.
我的问题是关于重构:考虑到Java,包声明会发生变化,因此文件内容将不相同.在这种情况下,Git如何确定"添加"文件与"已删除"文件共享历史记录?它是否检查"最相似的内容",假设我只做了一些小改动,或类似的非确定性解决方案?
如果我在存储库中移动文件,例如从一个文件夹移动到另一个文件夹,git就足够聪明,知道这些文件是相同的文件,只是更新它对存储库中这些文件的引用,或新的提交实际上是否创建了这些文件?
我问,因为我想知道git对于存储二进制文件有多么有用.如果它将移动的文件视为副本,那么即使您实际上没有添加任何新文件,也可以轻松地获得非常大的存储库.
Git有推断出“重命名”时,我也没心思为它这样做(这个问题实际上是在相反的,比如说,如何使git的标记的删除,新的文件作为文件移动?):
git add. (我没有做 a git commit,因为在这个阶段我不想这样做。)git rm了另一个文件。git status报道renamed: old-file -> new-file。我还没有committed。这两个文件在同一个目录下,名称相似,内容有一定的共同点。不过,我故意没有做git mv,因为这是不改名,我想这两个文件分别跟踪。如果我想要重命名,我会做一个git mv而不是我故意的git add/ git rm。
活动git如何决定它是重命名,是否可以告诉它不要尝试推断我不想要的东西?
我有一些文件从根文件夹移动到lib/文件夹中。我还对这些文件进行了一些重大更改。
git 历史记录显示旧文件已删除,新文件已添加。但即使文件中有很多差异,我仍然希望它们被视为同一个文件。是否可以返回并告诉 git 这个文件是一个移动,而不是删除和添加?
在 git 工作树中,我有一个文件“foo”。我对该文件进行了重大修改,然后将其重命名为“bar”。Git 将此检测为已删除/新文件。根据这个答案,为了让 git 检测到它们是同一个文件,应该先提交移动,然后是修改。鉴于文件已被修改和移动(但尚未暂存或提交),首先提交移动操作然后进行修改(确保我不会在此过程中丢失我的修改)要遵循的程序是什么?
同样,如果移动/修改已经在单个提交中提交,那么执行此操作的程序是什么?
我正在对一个项目进行几次重构。因此,有时我需要重命名文件扩展名,例如index.js -> index.ts,并更改该文件上的许多行。
由于 git 错误地将其标记index.js为已删除并index.ts标记为新文件,因此这可能会对代码审查和日志造成不良影响。
有没有办法明确地对 git 说“嘿,我重命名index.js为index.ts”?
使用的方法git add / git rm / git mv不起作用,因为 git 仍然说我创建了一个新文件并删除了其他文件。
另外,我不应该使用两次提交(一次用于重命名,一次用于更新其内容),因为第一次提交将被破坏,因为文件的构建步骤与文件.js不同.ts