这真的可能吗?
基本上,我只使用以下命令从一个远程代码库中拉取:
git pull
现在,我想预览一下这个拉取会改变什么(即差异),而不在我的端上触碰任何东西。原因是我正在拉取的东西可能不是“好的”,我希望有人在使我的存储库“脏”之前先修复它。
这真的可能吗?
基本上,我只使用以下命令从一个远程代码库中拉取:
git pull
现在,我想预览一下这个拉取会改变什么(即差异),而不在我的端上触碰任何东西。原因是我正在拉取的东西可能不是“好的”,我希望有人在使我的存储库“脏”之前先修复它。
git fetch
之后,使用git log HEAD..origin/master
来显示你最后一次共同提交与源主分支之间的日志记录条目。要显示差异,可以使用git log -p HEAD..origin/master
来显示每个补丁,或者使用git diff HEAD...origin/master
(三个点而不是两个)来显示单个差异。git cherry-pick
接受你想要的特定远程提交。稍后,当你准备好获取全部内容时,git pull
将合并剩余的提交。git diff ...@{u}
与如果origin/master
是上游分支,则与git diff HEAD...origin/master
相同。 - cambunctious我认为你需要使用 git fetch 命令。
此命令将在不提交到本地仓库索引的情况下拉取更改和对象。
稍后可以使用 git merge 命令合并它们。
编辑:进一步解释
直接从 Git-SVN崩溃课程 链接 中引用:
现在,如何从远程存储库获取任何新更改?您可以使用fetch命令:
git fetch http://host.xz/path/to/repo.git/
此时它们已经在您的代码库中,您可以使用以下命令查看它们:
git log origin
您还可以对更改进行差异比较。 您还可以使用git log HEAD..origin仅查看您分支中没有的更改。 然后,如果想合并它们 - 只需执行:
git merge origin
注意,如果您没有指定要获取的分支,它将方便地默认为跟踪远程。
阅读man页实际上会让您最好地了解选项以及如何使用它。
我只是试图通过示例和记忆来做这个,目前没有可用于测试的设备。 您应该查看:
git log -p //log with diff
使用 git reset --hard 命令(链接)可以撤销一个 fetch 操作,但是您树中的所有未提交更改以及您获取的更改都将丢失。
git reset --soft
还是 --mixed
呢?请查看手册。 - Aristotle Pagaltzisorigin
,分支名为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
之前预览更改的简单有效方法。
~/.gitconfig
文件中:[alias]
diffpull = !git fetch && git diff HEAD..@{u}
git pull
正在做的事情,你应该能够中止合并部分...所以我不确定这个用例是什么。 - Marnen Laibow-Kosergit pull
。我认为这就是提问者的问题所在。 - Andy P... 72f8433..c8af041 develop -> origin/develop ...此操作将给我们两个提交ID,第一个是旧的,第二个是新的。
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
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
13年后,您现在有了一个prefetch
任务,在 "git maintenance
"(man) 中。
git fetch
命令。refs/heads
或refs/remotes
)。refs/prefetch/<remote>/
中。git fetch --prefetch
执行上述操作,而无需修改上次提取的状态。
请查看 提交 32f6788, 提交 cfd781e, 提交 2e03115 (2021年4月16日),以及 提交 a039a1f (2021年4月6日) 由 Derrick Stolee (derrickstolee
) 提交。
(由 Junio C Hamano -- gitster
-- 合并于 提交 d250f90,2021年4月30日)
fetch
:添加--prefetch
选项协助者:Tom Saeger
协助者:Ramsay Jones
已签署:Derrick Stolee
--prefetch
选项将由“预取”维护任务使用,而不是通过命令行显式发送refspecs。
目的是修改refspec以将所有结果放置在refs/prefetch/
中,而不是其他任何地方。创建辅助方法
filter_prefetch_refspec()
来修改给定的refspec以适应预取任务所期望的规则:
- 负refspecs保留。
- 没有目标的refspecs被删除。
- 源以"
refs/tags/
"开头的refspecs被删除。- 其他refspecs被放置在"
refs/prefetch/
"中。最后,我们添加“
force
”选项,以确保必要时替换预取引用。有一些值得测试的有趣情况。
此更改的早期版本从循环中删除了一个refspec项并将剩余条目向下移动的"
i--
"。
这允许某些refspecs不被修改。
关于第一个--prefetch
测试的微妙之处在于,refs/tags/*
refspec直接出现在refs/heads/bogus/* refspec之前。
如果没有那个"i--
",这个顺序将删除"refs/tags/*
" refspec并使最后一个未修改,将结果放置在"refs/heads/*
"中。可能会有一个空的refspec。
这通常是针对不同于origin的远程主机的情况,用户想要获取特定的标签或分支。
为了正确测试这种情况,我们需要进一步删除本地分支的上游远程主机。
因此,我们正在测试将被删除的refspec,不留下任何内容可供提取。
fetch-options
现在在其手册页面中包含以下内容:
--prefetch
修改配置的refspec,将所有引用放置在
refs/prefetch/
命名空间中。
$ alias gtp="tar -c . | (cd /tmp && mkdir tp && cd tp && tar -x && git pull; rm -rf /tmp/tp)"
Ex.:
$ 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)
将存储库克隆到其他位置,然后在实际检出和新克隆上执行git log,以查看是否获得了相同的内容。