如何在不进行提取的情况下预览git-pull?


204

可能吗

基本上,有一个远程存储库,我可以使用它来提取:

git pull

现在,我想预览一下此拉动将发生的变化(差异),而无需碰到我这边的任何东西。原因是我要拉的东西可能不是“好”,并且我希望其他人在将存储库设置为“脏”之前对其进行修复。


4
您的编辑很奇怪。进行“ git fetch”并不会以任何方式改变您的工作树,因此,如果您未提交本地更改,也没有关系。尚不清楚您要撤消的访存工作中的部分内容,因为它不会影响您的工作树。
dkagedal

感谢dkagedal,我在完全了解Git的工作原理之前就写了这篇文章。我删除了该修改。
米兰·巴布斯科夫(MilanBabuškov),2010年

Answers:


233

执行完之后git fetch,请执行a git log HEAD..origin/master以显示您的最后一个公共提交和源的master分支之间的日志条目。要显示差异,请使用git log -p HEAD..origin/master来显示每个色块,或git diff HEAD...origin/master(三个点而不是两个点)来显示单个差异。

通常有没有任何需要撤消取,因为做一个只获取更新远程分支,没有的你的分支机构。如果您不准备在所有远程提交中进行拉取和合并,则可以git cherry-pick用来仅接受所需的特定远程提交。稍后,当您准备好获取所有内容时,a git pull将合并在其余的提交中。

更新:我不确定您为什么要避免使用git fetch。git fetch所做的全部工作就是更新远程分支的本地副本。此本地副本与您的任何分支都没有任何关系,并且与未提交的本地更改没有任何关系。我听说有人在Cron工作中运行git fetch,因为它很安全。(不过,通常我不建议您这样做。)


我想我在阅读文档时错过了“与我的分支无关”的那部分。谢谢。
米兰·巴布斯科夫,

1
由于某种原因,这对我不起作用。我尝试了git diff HEAD ... origin / master,它没有列出任何更改,但是当我执行“ pull origin master”操作时,它会获取并合并更改。那是因为我使用git remote add设置了远程存储库吗?
screenm0nkey 2011年

@ screenm0nkey:我不知道(不知道更多信息)。如果您仍然不确定,建议您打开一个新问题,询问有关此问题。
Greg Hewgill 2011年

1
什么对我
有用

2
git diff ...@{u}就像git diff HEAD...origin/master原点/母版是上游分支一样
优美

47

我认为git fetch是您想要的。

它将拉出更改和对象,而无需将其提交到本地存储库的索引中。

以后可以使用git merge合并它们

手册页

编辑:进一步的解释

直接来自Git- SVN速成课程 链接

现在,您如何从远程存储库获得任何新更改?您获取它们:

git fetch http://host.xz/path/to/repo.git/ 

此时,它们已在您的存储库中,您可以使用以下方法检查它们:

git log origin 

您也可以比较更改。您还可以使用git log HEAD..origin来查看分支中没有的更改。然后,如果要合并它们-请执行以下操作:

git merge origin

请注意,如果您未指定要提取的分支,它将方便地默认为跟踪远程服务器。

老实说,阅读手册页将使您对选项以及如何使用它有最好的了解。

我只是想通过示例和记忆来做到这一点,我目前没有一个可以测试的盒子。您应该看一下:

git log -p //log with diff

可以使用git reset --hardlink)撤消获取,但是树中所有未提交的更改以及已获取的更改都将丢失。


如果您解释两件事,那可能很好:1.如何撤消git-fetch?2.我如何看差异?
米兰·巴布斯科夫,

1
1)撤消git-fetch?2)git diff HEAD..origin
Chris

就像克里斯蒂安所说的那样,比较已经完成,可以使用git reset --hard撤消获取,但是树中所有未提交的更改以及已获取的更改都将丢失。
Brian Gianforcaro

您在寻找git reset --soft还是--mixed?检查联机帮助页。
亚里斯多德·帕加尔兹

1
如果我理解正确,则无需撤消“ git fetch”,因为它不会接触您的工作副本,也不会涉及您的存储库。“ git fetch”将对象和引用存储在.git / FETCH_HEAD中
Thorsten Niehues

21

您可以从远程仓库中获取内容,查看差异,然后进行合并。

这是一个称为远程回购origin和一个称为master跟踪远程分支的分支的示例origin/master

git checkout master                                                  
git fetch                                        
git diff origin/master
git pull --rebase origin master

8

我创建了一个自定义的git别名来为我做这件事:

alias.changes=!git log --name-status HEAD..

这样,您可以执行以下操作:

$git fetch
$git changes origin

这将为您提供一个不错的,简便的方法,让您可以在预览之前预览更改merge


你是上帝 这应该在git本身之内
Z. Khullah

3

我使用这两个命令,可以看到要更改的文件。

  1. 首先执行git fetch,它给出这样的输出(输出的一部分):

    ...
    72f8433..c8af041开发->起源/开发
    ...

此操作为我们提供了两个提交ID,第一个是旧的提交ID,第二个是新的提交ID。

  1. 然后使用git diff比较这两个提交

    git diff 72f8433..c8af041 | grep“ diff --git”

此命令将列出将要更新的文件:

diff --git a/app/controller/xxxx.php b/app/controller/xxxx.php
diff --git a/app/view/yyyy.php b/app/view/yyyy.php

例如,app / controller / xxxx.phpapp / view / yyyy.php将被更新。

使用git diff比较两次提交会打印出所有更新的文件,其中包含更改过的行,但是使用grep它将搜索并仅从输出中获取包含diff --git的行。


3

我可能迟到了聚会,但这太让我烦恼了。以我的经验,我宁愿要查看哪些更改尚待处理,而不是更新我的工作副本并处理这些更改。

这在~/.gitconfig文件中:

[alias]
        diffpull=!git fetch && git diff HEAD..@{u}

它获取当前分支,然后在工作副本和此获取的分支之间进行区分。因此,您应该只看到随之而来的更改git pull


1
您可以换掉ref字符串HEAD..@{u}吗?它更简单,并且不需要将远程命名为“ origin”或将您的分支命名为与远程上相同的名称。
Michael-Clay Shirky在哪里,

这是一个做得很好的别名,但是我不确定为什么首先要这样做。您将不得不在某个时候处理更改,对吗?git pull如果您不喜欢合并的内容,则应该可以中止合并的一部分。因此,我不确定这样做的用例是什么。
Marnen Laibow-Koser '19

我知道我必须在某个时候处理这​​些更改,但是正如我所写的那样,有时我不想这么做。我只想知道是否有什么要中断的,所以我必须为此保留更多的时间-或者我是否可以git pull稍后再做。我也认为那是op的问题。
安迪·P

-1

如果您不希望git-fetch更新本地.git,只需将本地回购复制到temp dir并在其中进行拉取。这是一个简单的手:

$ alias gtp="tar -c . | (cd /tmp && mkdir tp && cd tp && tar -x && git pull; rm -rf /tmp/tp)"

例如:

$ git status
# On branch master
nothing to commit (working directory clean)

$ gtp
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master
Updating 32d61dc..05287d6
Fast-forward
 subdir/some.file       |    2 +-
 .../somepath/by.tes    |    3 ++-
 .../somepath/data      |   11 +++++++++++
 3 files changed, 14 insertions(+), 2 deletions(-)

$ git status
# On branch master
nothing to commit (working directory clean)

$ git fetch
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master

$ git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
#
nothing to commit (working directory clean)

需要在.git所在的本地仓库的根目录中执行'gtp'。
AX Labs

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.