我已经重命名并在git中移动了一个文件。我拿了bar.js
文件,广泛编辑了内容,并将它移到目录中。
这是git status
向我展示的内容:
$ git status
On branch feature/bar-chart
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: js/journey-graph/bar.js
Untracked files:
(use "git add <file>..." to include in what will be committed)
js/bar-chart/bar.js
我想创建一个包含重命名和编辑的单一提交,并保留附加到文件的历史记录。
这可以用git吗?
请注意:我不想自动依赖git发现文件类似,并猜测它们已被重命名而不是手动添加和删除。我想告诉git究竟发生了什么。 (这是因为我实际上有很多编辑过的文件,我很担心git让他们感到困惑。)
答案 0 :(得分:1)
Git commit不关心重命名。
Commit只是写一个记录工作树完整状态的提交(加上通常的其他提交数据)。 &#34;工作树的状态&#34;从来没有任何重命名。它只有文件。文件a.js
存在,或者不存在。文件b.js
存在,或者不存在。
当你要求git 比较两棵树的时候(和仅时)重命名。例如,您可以请求git在最新提交中比较&#34;树&#34;在工作目录中使用&#34;树&#34;。这是git status
的作用。
你也可以让git比较两个不同提交的树:
git diff HEAD~7 HEAD~2 # what changed between "7 commits ago" and "2 ago"
和git diff
采用选项 - -M
,-C
等等,让您可以控制git在重命名和复制检测方面的积极程度。 git status
命令没有此选项;它的重命名检测器永久设置为中等水平。
关键的一点是,当你运行其他命令时,所有这些都会发生: git commit
只是记录一棵树,它就是这样的。稍后(以及之前!),使用其他 git命令,git会尝试确定是否重命名和/或复制了这些内容。
答案 1 :(得分:1)
你可以去
git mv file newname # Rename
edit, edit, edit, ... # Mangle
git add newname # Make *sure* the last version gets saved
git commit # Away we go
在提交之前,没有真正记录任何更改。并且git mv
与删除旧文件并创建具有相同内容的新文件完全相同,就git而言。 内容如何从一个地方移动到另一个地方并不是git的关注。