甚至可能吗?
基本上,有一个远程存储库,我只使用:
git pull
现在,我想预览一下这个拉动会改变什么(一个差异),而不涉及我身边的任何东西。原因是我要拉的东西可能不是“好”的,我希望其他人在使我的存储库“变脏”之前修复它。
甚至可能吗?
基本上,有一个远程存储库,我只使用:
git pull
现在,我想预览一下这个拉动会改变什么(一个差异),而不涉及我身边的任何东西。原因是我要拉的东西可能不是“好”的,我希望其他人在使我的存储库“变脏”之前修复它。
执行 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,因为它非常安全。(不过,我通常不建议这样做。)
我认为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 ) 撤消获取,但是树中所有未提交的更改以及您获取的更改都将丢失。
您可以从远程仓库获取,查看差异,然后拉取或合并。
这是一个名为远程 repoorigin
和一个名为master
tracking the remote branch的分支的示例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
.
我可能会迟到,但这件事困扰了我太久。根据我的经验,我宁愿查看哪些更改未决,也不愿更新我的工作副本并处理这些更改。
这在~/.gitconfig
文件中:
[alias]
diffpull=!git fetch && git diff HEAD..@{u}
它获取当前分支,然后在工作副本和获取的分支之间进行比较。所以你应该只看到随之而来的变化git pull
。
我使用这两个命令,我可以看到要更改的文件。
首先执行git fetch,它给出这样的输出(输出的一部分):
... 72f8433..c8af041 开发 -> 起源/开发 ...
这个操作给了我们两个提交 ID,第一个是旧的,第二个是新的。
然后使用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.php和app/view/yyyy.php将被更新。
使用git diff比较两个提交会打印所有更新后的文件,其中行已更改,但使用grep它会搜索并仅从输出中获取包含diff --git的行。
下面这个有用的命令是我从这个链接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
如果您不希望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/heads
or中的那些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 被删除。
- 源以 " " 开头的 Refspecs
refs/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/
命名空间。
将 repo 克隆到别处怎么样,然后在真正的结帐和新的克隆上执行 git log 以查看是否得到相同的东西。