如何预览git-pull?

这可能吗?

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

git pull

现在,我想在不接触任何东西的情况下预览一下这个拉力会改变什么(一个差异)。原因是我正在拉取的东西可能不是“好的”,我希望其他人在使我的存储库“脏”之前修复它。

142991 次浏览

我认为git获取是你要找的。

它将拉出更改和对象,而不将它们提交到本地回购的索引中。

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

Man Page .

编辑:进一步解释

直接从Git- SVN速成班 链接

现在,如何从远程存储库获得新的更改呢?你把它们拿来:

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

此时,它们在你的存储库中,你可以使用以下命令检查它们:

git log origin

您还可以区分这些更改。你也可以使用git日志头..起源来查看分支中没有的更改。然后如果想合并它们-只需做:

git merge origin

注意,如果您没有指定要获取的分支,它将方便地默认为跟踪远程。

阅读手册页可以让您更好地理解选项以及如何使用它。

我只是想通过例子和记忆来做这个,我目前没有一个盒子来测试。你应该看看:

git log -p //log with diff

读取可以用Git重置——很难 (链接)来撤销,但是你的树中所有未提交的更改都会丢失,你已经读取的更改也会丢失。

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

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

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

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

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

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

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

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

你可以这样做:

$git fetch
$git changes origin

这将为你提供一个在执行merge之前预览更改的好方法。

在其他地方克隆repo,并在真正的checkout和新的克隆上执行git log,看看是否得到了相同的东西。

我可能迟到了,但这件事已经困扰我太久了。 根据我的经验,我宁愿看到哪些更改正在等待,而不是更新我的工作副本并处理这些更改

这是在~/.gitconfig文件中:

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

它获取当前分支,然后在工作副本和这个获取的分支之间做一个差异。所以你只能看到git pull带来的变化。

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

  1. 首先执行git获取,它会给出如下输出(输出的一部分):

    ...
    72f8433..c8af041  develop -> origin/develop
    ...

This operation gives us two commit IDs, first is the old one, and second will be the new.

  1. Then compare these two commits using git diff

    git diff 72f8433..c8af041 | grep "diff --git"

This command will list the files that will be updated:

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

例如,应用程序/控制器/ xxxx.php应用程序/视图/ yyyy.php将被更新。

使用git diff比较两次提交会打印所有更新的文件 改变了行,但是使用grep,它只搜索并获得行

.输出包含diff - git

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

13年后,你现在有一个prefetch任务在"git maintenance"

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

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

< p > 这样做是为了避免中断远程跟踪分支
最终用户希望这些引用保持不变,除非他们发起一个取回 然而,使用预取任务,完成后续实际读取所需的对象将已经获得,因此实际读取将更快。
在理想的情况下,它只会成为一堆远程跟踪分支的更新,而不需要任何对象传输

你也可以这样做,因为Git 2.32 (Q2 2021) git fetch --prefetch,同样不修改你最后的获取状态。

参见德里克·斯托利(derrickstolee)中的提交32 f6788提交cfd781e提交2 e03115(2021年4月16日)和提交a039a1f(2021年4月06日)。
(由Junio C Hamano—gitster提交d250f90中合并,30 Apr 2021)

fetch:添加--prefetch选项

< p > 资助人:Tom Saeger
资助人:Ramsay Jones
署名:Derrick Stolee

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

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

  • 负refspecs被保留。
  • 没有目标的Refspecs将被删除。
  • 源以“__abc0”开头的Refspecs;是删除。
  • 其他refspecs放在&;__abc0 &;中。

最后,我们添加了'force'选项,以确保在必要时替换预取引用。

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

此更改的早期版本删除了"i--"循环删除一个refspec项并向下移动其余项。
这允许一些refspecs不被修改。
关于第一个--prefetch测试的微妙之处在于,refs/tags/* refspec直接出现在refs/heads/bogus/* refspec之前。
如果没有“i--"”,这个排序将删除“refs/tags/*"refspec并保留最后一个不修改,将结果放在"refs/heads/*" refspec可以是空的。
对于源以外的远程,用户希望获取特定的标记或分支,通常就是这种情况。
为了正确地测试这个用例,我们需要进一步移除本地分支的上游远程。
因此,我们正在测试一个将被删除的refspec,不留下任何可获取的内容

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

--prefetch

修改已配置的refspec,将所有的ref放入 refs/prefetch/名称空间。< / p >

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