我讀過在git中重命名文件時 ,應提交全部更改,執行重命名,而後暫存重命名的文件。 Git將從內容中識別文件,而不是將其視爲新的未跟蹤文件,並保留更改歷史記錄。 css
可是,今晚僅此一次,我最終恢復爲git mv
。 html
> $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: index.html #
將Finder中的樣式表從iphone.css
重命名爲mobile.css
git
> $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: index.html # # 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: css/iphone.css # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # css/mobile.css
因此git如今認爲我已經刪除了一個CSS文件,並添加了一個新文件。 不是我想要的,讓撤消重命名,讓git完成工做。 xcode
> $ git reset HEAD . Unstaged changes after reset: M css/iphone.css M index.html
回到我開始的地方。 服務器
> $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: index.html #
讓咱們改用git mv
。 iphone
> $ git mv css/iphone.css css/mobile.css > $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # renamed: css/iphone.css -> css/mobile.css # # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: index.html #
看起來咱們很好。 那麼,爲何在我使用Finder時git第一次沒有識別出重命名? spa
若是確實須要手動重命名文件,例如。 使用腳本批量重命名一堆文件,而後使用git add -A .
爲我工做。 code
對於Xcode用戶:若是在Xcode中重命名文件,則會看到徽章圖標更改成追加。 若是使用XCode進行提交,則實際上將建立一個新文件並丟失歷史記錄。 htm
解決方法很簡單,可是您必須在使用Xcode進行提交以前執行此操做: 索引
重命名:Project / OldName.h-> Project / NewName.h重命名:Project / OldName.m-> Project / NewName.m
而後返回到XCode,您將看到徽章從A更改成M,並保存以當即使用xcode進行進一步更改。
最好的辦法是本身嘗試一下。
mkdir test cd test git init touch aaa.txt git add . git commit -a -m "New file" mv aaa.txt bbb.txt git add . git status git commit --dry-run -a
如今git status和git commit --dry-run -a顯示兩個不一樣的結果,其中git status顯示bbb.txt做爲新文件/ aaa.txt被刪除,而--dry-run命令顯示實際的重命名。
~/test$ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: bbb.txt # # 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: aaa.txt # /test$ git commit --dry-run -a # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # renamed: aaa.txt -> bbb.txt #
如今,繼續辦理登機手續。
git commit -a -m "Rename"
如今您能夠看到該文件實際上已被重命名,而且git status中顯示的內容是錯誤的。
故事的寓意:若是不肯定文件是否已重命名,請發出「 git commit --dry-run -a」。 若是它顯示文件已重命名,那就很好了。
步驟1:將文件從舊文件重命名爲新文件
git mv #oldfile #newfile
步驟2:git commit並添加註釋
git commit -m "rename oldfile to newfile"
第三步:將此更改推送到遠程服務器
git push origin #localbranch:#remotebranch
您必須git add css/mobile.css
新文件和git rm css/iphone.css
,因此git知道它。 而後它將在git status
顯示相同的輸出
您能夠在狀態輸出(文件的新名稱)中清楚地看到它:
# Untracked files: # (use "git add <file>..." to include in what will be committed)
和(舊名稱):
# Changed but not updated: # (use "git add/rm <file>..." to update what will be committed)
我認爲git mv
在幕後只不過是一個包裝腳本,它確實作到了這一點:從索引中刪除文件並以不一樣的名稱添加它