在一次提交中,可靠地在git中提交重命名和编辑的文件?

时间:2014-04-24 19:41:02

标签: git github

我已经重命名并在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让他们感到困惑。)

2 个答案:

答案 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的关注。

相关问题