231

甚至可能吗?

基本上,有一个远程存储库,我只使用:

git pull

现在,我想预览一下这个拉动会改变什么(一个差异),而不涉及我身边的任何东西。原因是我要拉的东西可能不是“好”的,我希望其他人在使我的存储库“变脏”之前修复它。

4

10 回答 10

267

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

通常不需要撤消提取,因为执行提取只会更新远程分支,而不会更新您的分支。如果您不准备在所有远程提交中进行拉取和合并,则可以使用git cherry-pick仅接受您想要的特定远程提交。稍后,当您准备好获取所有内容时, agit pull将合并到其余的提交中。

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

于 2008-10-07T20:53:18.810 回答
51

我认为git fetch是你要找的。

它将拉取更改和对象,而不将它们提交到本地存储库的索引。

它们可以稍后与git merge 合并

手册页

编辑:进一步解释

直接来自Git-SVN Crash Course 链接

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

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 ) 撤消获取,但是树中所有未提交的更改以及您获取的更改都将丢失。

于 2008-10-07T20:45:40.573 回答
23

您可以从远程仓库获取,查看差异,然后拉取或合并。

这是一个名为远程 repoorigin和一个名为mastertracking the remote branch的分支的示例origin/master

git checkout master                                                  
git fetch                                        
git diff origin/master
git pull --rebase origin master
于 2011-03-21T11:02:03.000 回答
11

我创建了一个自定义 git 别名来为我做到这一点:

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

有了它,你可以这样做:

$git fetch
$git changes origin

这将为您提供一种在执行merge.

于 2011-08-18T07:32:58.230 回答
4

我可能会迟到,但这件事困扰了我太久。根据我的经验,我宁愿查看哪些更改未决,也不愿更新我的工作副本并处理这些更改。

这在~/.gitconfig文件中:

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

它获取当前分支,然后在工作副本和获取的分支之间进行比较。所以你应该只看到随之而来的变化git pull

于 2018-02-14T10:06:55.907 回答
4

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

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

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

这个操作给了我们两个提交 ID,第一个是旧的,第二个是新的。

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

    混帐差异 72f8433..c8af041 | grep“差异--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的行。

于 2018-02-15T05:39:03.673 回答
1

下面这个有用的命令是我从这个链接https://gist.github.com/jtdp/5443297中挑选出来的。感谢https://gist.github.com/jtdp

git fetch origin

# show commit logs of changes
git log master..origin/master

# show diffs of changes
git diff master..origin/master

# apply the changes by merge..
git merge origin/master

# .. or just pull the changes
git pull
于 2021-06-24T11:51:25.980 回答
0

如果您不希望git-fetch更新您的本地 .git,只需将本地存储库复制到临时目录并在那里拉取即可。这是一个简写:

$ 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)
于 2020-01-14T16:24:27.277 回答
0

13 年后,你现在有一个prefetch任务在“ git maintenance男人

预取任务使用来自所有已注册远程的最新对象更新对象目录。

对于每个遥控器,git fetch都会运行一个命令。
refmap 是自定义的,以避免更新本地或远程分支(在refs/headsor中的那些refs/remotes)。
相反,远程参考存储在refs/prefetch/<remote>/.
此外,标签不会更新。

这样做是为了避免破坏远程跟踪分支
最终用户希望这些 refs 保持不动,除非他们启动 fetch。

然而,使用预取任务,已经获得了完成稍后真正提取所需的对象,因此真正的提取会更快。
在理想情况下,它只是对一堆远程跟踪分支的更新,没有任何对象传输。

从 Git 2.32 (Q2 2021) a 开始git fetch --prefetch,您也可以这样做,而无需修改您的上一次获取状态。

请参阅Derrick Stolee ( ) 的提交 32f6788提交 cfd781e提交 2e03115(2021 年 4 月 16 日)和提交 a039a1f(2021 年 4 月 6 日(由Junio C Hamano 合并 -- --d250f90 提交中,2021 年 4 月 30 日)derrickstolee
gitster

fetch: 添加--prefetch选项

帮助者:Tom Saeger
帮助者:Ramsay Jones
签字者:Derrick Stolee

--prefetch'prefetch' 维护任务将使用该选项,而不是通过命令行显式发送 refspec。
目的是修改 refspec 以将所有结果放入refs/prefetch/而不是其他任何地方。

创建辅助方法filter_prefetch_refspec()来修改给定的 refspec 以适应预取任务的预期规则:

  • 负面的参考规范被保留。
  • 没有目的地的 Refspecs 被删除。
  • 源以 " " 开头的 Refspecsrefs/tags/将被删除。
  • 其他 refspecs 放在“ refs/prefetch/”中。

最后,我们添加 ' force' 选项以确保根据需要替换预取引用。

有一些有趣的案例值得测试。

此更改的早期版本i--从删除 refspec 项并将剩余条目向下移动的循环中删除了“”。
这允许不修改某些参考规范。
第一个--prefetch测试的微妙之处在于refs/tags/*refspec 直接出现在 refs/heads/bogus/* refspec 之前。
如果没有那个“ i--”,这个排序将删除“ refs/tags/*” refspec 并保留最后一个不修改,将结果放在“ refs/heads/*”中。

可能有一个空的 refspec。
这通常适用于除源之外的远程,用户想要获取特定标签或分支。
为了正确测试这种情况,我们需要进一步删除本地分支的上游远程。
因此,我们正在测试一个将被删除的 refspec,没有任何东西可以获取。

fetch-options现在在其手册页中包含:

--prefetch

修改配置的 refspec 以将所有 refs 放入 refs/prefetch/命名空间。

于 2021-05-02T00:01:20.390 回答
-2

将 repo 克隆到别处怎么样,然后在真正的结帐和新的克隆上执行 git log 以查看是否得到相同的东西。

于 2017-06-19T14:58:21.153 回答