2013-08-20 83 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。

您将必须检查差异的具体更改,但这会得到有关未提交更改的信息。