在git中處理文件重命名

我讀過在git中重命名文件時 ,應提交全部更改,執行重命名,而後暫存重命名的文件。 Git將從內容中識別文件,而不是將其視爲新的未跟蹤文件,並保留更改歷史記錄。 css

可是,今晚僅此一次,我最終恢復爲git mvhtml

> $ 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 mviphone

> $ 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


#1樓

若是確實須要手動重命名文件,例如。 使用腳本批量重命名一堆文件,而後使用git add -A . 爲我工做。 code


#2樓

對於Xcode用戶:若是在Xcode中重命名文件,則會看到徽章圖標更改成追加。 若是使用XCode進行提交,則實際上將建立一個新文件並丟失歷史記錄。 htm

解決方法很簡單,可是您必須在使用Xcode進行提交以前執行此操做: 索引

  1. 在您的文件夾上執行git Status。 您應該看到分階段的更改是正確的:

重命名:Project / OldName.h-> Project / NewName.h重命名:Project / OldName.m-> Project / NewName.m

  1. 提交-m'名稱更改'

而後返回到XCode,您將看到徽章從A更改成M,並保存以當即使用xcode進行進一步更改。


#3樓

最好的辦法是本身嘗試一下。

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」。 若是它顯示文件已重命名,那就很好了。


#4樓

步驟1:將文件從舊文件重命名爲新文件

git mv #oldfile #newfile

步驟2:git commit並添加註釋

git commit -m "rename oldfile to newfile"

第三步:將此更改推送到遠程服務器

git push origin #localbranch:#remotebranch

#5樓

您必須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在幕後只不過是一個包裝腳本,它確實作到了這一點:從索引中刪除文件並以不一樣的名稱添加它

相關文章
相關標籤/搜索