2013-08-20 125 views
2

我正在兩個不同的機器上的主分支上工作,並將代碼推送到其中一臺機器上的遠程存儲庫。如何判斷自上次git pull或git push以來我更改過的git pull會覆蓋哪些文件?

我試圖把代碼從其他機器遠程回購,但我得到的錯誤

! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to 'https://github.com/' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes (e.g. 'git pull') before pushing again. See the 
'Note about fast-forwards' section of 'git push --help' for details. 

我打算做一個$ git pull而是想知道是否有一種方法,我可以告訴哪些文件會被寫入,因爲從遠程回購的最後一個git或從遠程回購的git推送,我已經對本地進行了更改。

我對修改文件的完整列表不感興趣。

+0

你想,無論你和遠程對這個分支修改的文件列表? –

+0

是準確,感謝澄清 – user784637

+0

要在這裏接受的答案幫助嗎? http://stackoverflow.com/questions/9113280/diff-current-working-copy-of-a-file-with-another-branchs-committed-copy我可能有誤解。 – Chris

回答

0

我不知道任何git內部的方式來做到這一點(雖然我不會驚訝地發現有一個),但我相信下面應該做你想做的事情(在你獲取遠程至少改變)。

# Find merge base between the branch heads. 
mb=$(git merge-base master origin/master) 

# List of files changed by local master. 
git diff --name-only $mb master 

# List of files changed by origin/master. 
git diff --name-only $mb origin/master 

# List of files changed by both heads. 
comm -1 -2 <(git diff --name-only $mb master) <(git diff --name-only $mb origin/master) 

要找出哪個(本地修改和未提交的文件)與文件重疊的遠程分支嘗試改變:

# List of files locally changes (uncommitted). 
git diff --name-only 

# List of files changed in working directory and on remote branch. 
comm -1 -2 <(git diff --name-only) <(git diff --name-only $mb origin/master) 

應當注意的是,本地更改版本不會旗本地添加的文件(除非您使用git add -N來告訴他們的git)。

+0

我覺得可能更簡潔的方式是可行的,當我試圖從遠程回購拉,它告訴我是什麼地方的變化會通過拉覆蓋。 '*分支主 - > FETCH_HEAD''錯誤:您當地的下列文件中的更改將被合併覆蓋:''的public_html/index.php' – user784637

+0

這就是爲什麼我問你想要的東西。知道什麼提交的修改,你所做的觸摸相同的文件比知道你有什麼未提交的更改局部觸到相同的文件不同。我回答了承諾的版本。 –

3

我不確定如果我真的明白你想要什麼,所以我會列舉一些可能的情況和解決方案。

  1. 如果你想知道文件從遠程對應當地分行不同:

    git diff --name-status master origin/master 
    
  2. 如果你打算去拉,但想知道會被修改:

    git pull --no-commit 
    

    git會給你留下一個合併的工作樹,你可以通過像git status這樣的命令來檢查修改過的文件。

  3. 如果你想使一個乾淨的歷史,我建議(也許不是你計劃)

    git pull --rebase 
    

    將取回從遠程最新的代碼並在其上應用的局部變化。

+0

我想知道本地更改將被覆蓋覆蓋。 1)列出所有修改,添加和刪除。所以我只想要一個修改過的文件列表,這些文件也在本地進行了更改 – user784637

+0

@ user784637然後,你可以嘗試我的第二個答案:) – dyng

0

首先確保你做一個git fetch讓你知道你的遠程分支是最新的。然後,您可以使用這一行來獲得未提交文件和遠程文件的差異。

git status | grep "(modified|deleted)" | awk '{print $3}' | git diff <remote branch name> 

這個命令會將git status,發現修改過的文件,分析它們,以便它只有文件名。最後,它會使用這些文件名稱從源文件創建一個diff。

您將必須檢查差異的具體更改,但這會得到有關未提交更改的信息。