甚至可能吗?
基本上,我只使用了一个远程存储库:
git pull
现在,我想预测这种拉动会改变什么(差异),而不会触及我身边的任何东西。原因是我拉的东西可能不是“好”,我希望其他人在使我的存储库“脏”之前修复它。
答案 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 合并。
编辑:进一步探索
直接来自 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)
我使用这两个命令,我可以看到要更改的文件。
首先执行 git fetch ,它会输出这样的输出(输出的一部分):
... 72f8433..c8af041 develop -> origin/develop ...
此操作为我们提供了两个提交ID,第一个是旧的,第二个是新的。
然后使用 git diff
比较这两个提交git diff 72f8433..c8af041 | grep "diff --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 。
答案 6 :(得分:0)
13 年后,您现在在“git maintenance
”(man)中拥有prefetch
任务>
<块引用>
预取任务使用来自所有注册遥控器的最新对象更新对象目录。
对于每个遥控器,都会运行一个 git fetch
命令。
refmap 是自定义的,以避免更新本地或远程分支(refs/heads
或 refs/remotes
中的分支)。
相反,远程引用存储在 refs/prefetch/<remote>/
中。
此外,标签不会更新。
这样做是为了避免中断远程跟踪分支。
最终用户希望这些引用保持不动,除非他们发起提取。
然而,使用预取任务,完成稍后真正提取所需的对象已经获得,因此实际提取会更快。
在理想情况下,它只会成为一堆远程跟踪分支的更新,无需任何对象传输。
而且您也可以这样做,因为 Git 2.32(2021 年第 2 季度)git fetch --prefetch
,无需修改您的最后一次获取状态。
参见 commit 32f6788 的 commit cfd781e、commit 2e03115、commit 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登录,看看你是否有同样的事情。