如何在不进行提取的情况下预览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 --hard(link)撤消获取,但是树中所有未提交的更改以及已获取的更改都将丢失。


如果您解释两件事,那可能很好: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.php和app / 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.