这可能吗?
基本上,有一个远程存储库,我只需要使用:
git pull
现在,我想在不接触任何东西的情况下预览一下这个拉力会改变什么(一个差异)。原因是我正在拉取的东西可能不是“好的”,我希望其他人在使我的存储库“脏”之前修复它。
我认为git获取是你要找的。
它将拉出更改和对象,而不将它们提交到本地回购的索引中。
它们稍后可以与git合并合并。
Man Page .
编辑:进一步解释
直接从Git- SVN速成班 链接
现在,如何从远程存储库获得新的更改呢?你把它们拿来: git fetch http://host.xz/path/to/repo.git/ 此时,它们在你的存储库中,你可以使用以下命令检查它们: git log origin 您还可以区分这些更改。你也可以使用git日志头..起源来查看分支中没有的更改。然后如果想合并它们-只需做: git merge origin 注意,如果您没有指定要获取的分支,它将方便地默认为跟踪远程。
现在,如何从远程存储库获得新的更改呢?你把它们拿来:
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 fetch
git log HEAD..origin/master
git log -p HEAD..origin/master
git diff HEAD...origin/master
通常不需要撤销取回,因为取回只会更新远程分支,而不会更新任何你的分支。如果你不准备在所有远程提交中进行拉取和合并,你可以使用git cherry-pick来只接受你想要的特定远程提交。稍后,当你准备好获取所有内容时,git pull将在其余的提交中合并。
git cherry-pick
更新:我不完全确定为什么你要避免使用git获取。所有git获取所做的是更新远程分支的本地副本。这个本地副本与您的任何分支都没有任何关系,也与未提交的本地更改没有任何关系。我听说有人在cron作业中运行git fetch,因为它非常安全。(不过,我通常不建议这样做。)
您可以从远程回购中获取,查看差异,然后拉取或合并。
这是一个名为origin的远程回购和一个名为master的分支跟踪远程分支origin/master的示例:
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之前预览更改的好方法。
merge
在其他地方克隆repo,并在真正的checkout和新的克隆上执行git log,看看是否得到了相同的东西。
这是在~/.gitconfig文件中:
~/.gitconfig
[alias] diffpull=!git fetch && git diff HEAD..@{u}
它获取当前分支,然后在工作副本和这个获取的分支之间做一个差异。所以你只能看到git pull带来的变化。
我使用这两个命令,就可以看到要更改的文件。
... 72f8433..c8af041 develop -> origin/develop ...
This operation gives us two commit IDs, first is the old one, and second will be the new.
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-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"
prefetch
git maintenance
预取任务用所有已注册远程的最新对象更新对象目录。 对于每个远程,运行git fetch命令。 refmap是自定义的,以避免更新本地或远程分支(refs/heads或refs/remotes中的分支)。 相反,远程引用存储在refs/prefetch/<remote>/中。 < p > 这样做是为了避免中断远程跟踪分支。 最终用户希望这些引用保持不变,除非他们发起一个取回 然而,使用预取任务,完成后续实际读取所需的对象将已经获得,因此实际读取将更快。 在理想的情况下,它只会成为一堆远程跟踪分支的更新,而不需要任何对象传输
预取任务用所有已注册远程的最新对象更新对象目录。
对于每个远程,运行git fetch命令。 refmap是自定义的,以避免更新本地或远程分支(refs/heads或refs/remotes中的分支)。 相反,远程引用存储在refs/prefetch/<remote>/中。
refs/heads
refs/remotes
refs/prefetch/<remote>/
你也可以这样做,因为Git 2.32 (Q2 2021) git fetch --prefetch,同样不修改你最后的获取状态。
git fetch --prefetch
参见德里克·斯托利(derrickstolee)中的提交32 f6788, 提交cfd781e, 提交2 e03115(2021年4月16日)和提交a039a1f(2021年4月06日)。 (由Junio C Hamano—gitster—在提交d250f90中合并,30 Apr 2021)
derrickstolee
gitster
fetch:添加--prefetch选项 < p > 资助人:Tom Saeger 资助人:Ramsay Jones 署名:Derrick Stolee
fetch
--prefetch
--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,不留下任何可获取的内容
refs/prefetch/
创建帮助方法filter_prefetch_refspec()来修改给定的refspec,以适应预取任务期望的规则:
filter_prefetch_refspec()
最后,我们添加了'force'选项,以确保在必要时替换预取引用。
force
有一些有趣的案例值得测试。
i--
refs/tags/*
refs/heads/*
fetch-options现在在它的手册页中包含:
fetch-options
--prefetch 修改已配置的refspec,将所有的ref放入 refs/prefetch/名称空间。< / p >
修改已配置的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