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

时间:2008-10-07 20:30:31

标签: git version-control

甚至可能吗?

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

git pull

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

10 个答案:

答案 0 :(得分:209)

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

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

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

答案 1 :(得分:42)

我认为 git fetch 正是您所寻找的。

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

稍后可以将它们与 git merge 合并。

Man Page

编辑:进一步探索

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

  

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

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

答案 2 :(得分:18)

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

这是一个名为origin的远程仓库和一个名为master的分支跟踪远程分支origin/master的示例:

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

答案 3 :(得分:7)

我为我创建了一个自定义git别名:

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

你可以这样做:

$git fetch
$git changes origin

这将为您提供一种在执行merge之前预览更改的简便方法。

答案 4 :(得分:2)

我可能会迟到了,但这是让我误会了太长时间的事情。 根据我的经验,我宁愿看到哪些更改待处理,而不是更新我的工作副本并处理这些更改。

这可以在~/.gitconfig文件中找到:

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

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

答案 5 :(得分:1)

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

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

    ...
    72f8433..c8af041  develop -> origin/develop
    ...
  2. 此操作为我们提供了两个提交ID,第一个是旧的,第二个是新的。

    1. 然后使用 git diff

      比较这两个提交
      git diff 72f8433..c8af041 | grep "diff --git"
    2. 此命令将列出将要更新的文件:

      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

答案 6 :(得分:0)

13 年后,您现在在“git maintenance(man)中拥有prefetch 任务> <块引用>

预取任务使用来自所有注册遥控器的最新对象更新对象目录。

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

这样做是为了避免中断远程跟踪分支
最终用户希望这些引用保持不动,除非他们发起提取。

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

而且您也可以这样做,因为 Git 2.32(2021 年第 2 季度)git fetch --prefetch,无需修改您的最后一次获取状态。

参见 commit 32f6788commit cfd781ecommit 2e03115commit a039a1f(2021 年 4 月 16 日)和 Derrick Stolee (derrickstolee)(2021 年 4 月 6 日)。
(2021 年 4 月 30 日在 Junio C Hamano -- gitster --commit d250f90 合并)

<块引用>

fetch:添加--prefetch选项

帮助:Tom Saeger
帮助:拉姆齐琼斯
签字人:Derrick Stolee

<块引用>

“预取”维护任务将使用 --prefetch 选项,而不是通过命令行显式发送参考规范。
目的是修改 refspec 以将所有结果放在 refs/prefetch/ 而不是其他任何地方。

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

  • 保留负的引用规范。
  • 删除没有目的地的参考规范。
  • 删除以“refs/tags/”开头的引用规范。
  • 其他参考规范放置在“refs/prefetch/”中。

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

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

此更改的早期版本从循环中删除了“i--”,该循环删除了 refspec 项并将其余条目下移。
这允许一些引用规范不被修改。
第一个 --prefetch 测试的微妙部分是 refs/tags/* refspec 直接出现在 refs/heads/bogus/* refspec 之前。
如果没有那个“i--”,这个排序将删除“refs/tags/*”refspec 并保持最后一个不变,将结果放在“refs/heads/*”中。

可能有一个空的引用规范。
这通常适用于除原点以外的遥控器,用户希望获取特定标签或分支。
为了正确测试这种情况,我们需要进一步删除本地分支的上游远程。
因此,我们正在测试一个将被删除的 refspec,不会留下任何可获取的内容。

fetch-options 现在包含在其 man page 中:

<块引用>

--prefetch

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

答案 7 :(得分:0)

下面这个有用的命令是我从这个链接 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

答案 8 :(得分:-1)

如果您不希望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)

答案 9 :(得分:-2)

如何在其他地方克隆回购,并在真正的结账和新鲜克隆上进行git登录,看看你是否有同样的事情。