在git repo中更改文件名

git如何处理文件名更改?

将文件名更改检测为修改或将有一个“丢失”的文件,需要被删除,然后新的文件需要添加与git add

它会自动被检测为修改,“新”文件将被添加到索引,所以你只需要一个命令:

 $ git mv application.py newApplication.py $ git status # On branch buildServer # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # renamed: application.py -> newApplication.py 

当然还有一个提交

在每一次提交中,gitlogging了你的源代码树的状态,而不是是否有重命名(或其他)产生的状态。 所以,如果你只是正常的重命名一个文件(而不是使用git mv ), git status的输出将会是这样的:

 # On branch master # Changed but not updated: # (use "git add/rm <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # deleted: foo.txt # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # bar.txt no changes added to commit (use "git add" and/or "git commit -a") 

如果您决定要重新命名该文件来logging树的状态,可以使用以下命令来更改该更改:

  git rm foo.txt git add bar.txt 

…然后git status会显示你:

 # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # renamed: foo.txt -> bar.txt 

…你可以像平常一样提交git commit

 git commit -m "Renamed foo.txt to bar.txt" 

重要的一点是要记住,当git告诉你一个文件在查看历史时已经被重命名了,那是因为通过比较树的状态从一个版本到另一个版本来确定重命名已经发生了 – 它并不意味着在历史中logging了重命名操作。

正如前面的答案所解释的那样,Git从源代码树中的内容更改派生出一个文件重命名操作。 为了logging重命名操作,Git同时存储一个删除和添加操作,而不是重命名操作本身。

正如Magnus Skog 指出的那样, git mv <filename1> <filename2>告诉Git将<filename1>的内容添加到<filename2>并从文件树中删除<filename1>

正如Mark Longair所 解释的那样 ,如果使用shell命令mv <filename1> <filename2>而不是git mv ,Git将不会检测到重命名操作,直到您调用git rm <filename1>git add <filename2>

不过,另一种告诉Git使用mv重命名操作的方法是使用git add --all 。 该命令指示Git检测并准备提交工作空间中与存储库中不同的所有文件,包括那些已经重命名的文件:

 $ ls abcd $ mv de $ git status # On branch master # Changed but not updated: # (use "git add/rm <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # deleted: d # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # e no changes added to commit (use "git add" and/or "git commit -a") $ git add --all $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # renamed: d -> e # 

例如,使用脚本或批量重命名工具, git add --all可以非常方便地提交大量在工作区中重命名的文件。

git mv

这保持历史和移动文件。 之后需要做一个提交,所以回购是最新的。

Git还会在提交时(有时)提取在文件系统中移动的文件,在删除文件并创build新的(但相似的)文件时偶尔会出现误报。

它也将移动文件系统中的文件(这可以被覆盖)。 所以不需要做一个git add