3

我正在两台不同机器上的主分支上工作,并将代码推送到其中一台机器上的远程存储库。

我正在尝试将代码从另一台机器推送到远程仓库,但出现错误

 ! [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 pull 或从远程仓库 git push 以来我已经对本地进行了更改的文件将被覆盖。

我对修改文件的完整列表不感兴趣。

4

3 回答 3

4

我不确定我是否真的理解你想要什么,所以我会列举一些可能的情况和解决方案。

  1. 如果您想知道本地分支与远程分支不同的文件:

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

    git pull --no-commit
    

    git 会给你留下一个合并的工作树,你可以通过命令检查修改过的文件,例如git status.

  3. 如果你想创造一个干净的历史,我建议(也许你不打算这样做)

    git pull --rebase
    

    它将从远程获取最新代码并在其上应用您的本地更改。

于 2013-08-20T13:30:12.057 回答
0

首先确保你做了一个git fetch,这样你就知道你的远程分支是最新的。然后,您可以使用此单线来获取未提交文件和远程文件的差异。

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

该命令获取git status并找到修改后的文件,解析它们,使其只有文件名。最后,它使用这些文件名创建与源的差异。

您将不得不检查特定更改的差异,但这会为您提供有关未提交更改的信息。

于 2013-08-20T13:50:37.083 回答
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)。

于 2013-08-20T13:01:45.317 回答