Git - 不获取远程仓库数据的情况下比较本地和远程仓库之间的差异?

7

我搜寻过但没有找到这个问题的答案。

我有一个在Heroku上运行的应用程序。 从我的本地机器上通常进行实现并且只需要:

git add .
git commit -m "whatever change, I know I can add and commit at the same time..."
git push <the-heroku-repo>

然后它会上传并更新Heroku应用中的主分支。到目前为止一切都很好。

现在,我想要另一台机器自动从Heroku仓库拉取并更新自己。

所以我这样做:

git clone <the-heroku-repo>

这样可以获取应用程序,并使用以下命令查看git配置:

core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
remote.origin.url=git@heroku.com:theapp.git
branch.master.remote=origin
branch.master.merge=refs/heads/master

要更新这个新的仓库,我只需要执行pull操作:

git pull origin

或者我可以获取并合并:

git fetch origin
git merge origin/master

我的问题

在上面的获取和合并之间,我可以通过以下方式检查更改:

git log -p master..origin/master

有没有办法在不拉取之前找到本地主分支和远程Heroku repo最新版本之间的差异?只需比较本地和远程,并查看更改。我只是找不到正确的方法。
谢谢。

没有拉取,你就无法知道远程代码库中的任何更新。 - TheOneTeam
我对在执行 git log 命令之前执行 git fetch origin 存在什么问题感兴趣? - Mark Longair
也许问题出在我身上,基于fetch命令的定义:“git fetch从远程仓库下载新的分支和数据”。假设根据一些比较输出,我决定不想获取和合并这些更改,为什么要使用带宽并污染存储库,因为这是不必要的。再说一遍,也许问题出在我身上。只是试图在可能的情况下通过提前知道现有的更改来节省调用或资源。 - Pod
1
通过执行fetch操作,您不会“污染存储库”,因为它不会影响您的本地存储库。如果您担心获取您不关心的分支,可以仅指定主分支:git fetch origin master。如果您希望将更改合并/变基并提交到上游,则检索主分支永远不会浪费时间。 - Justin ᚅᚔᚈᚄᚒᚔ
1个回答

17

虽然你可以使用以下命令获取关于origin代码库中分支的一些摘要信息:

git remote show origin

如果你想要比较分支,就需要从 origin 中获取这些分支并将它们拉取到你的本地仓库中。这就是 git fetch 的作用。当你执行 git fetch origin 命令时,默认只会更新所谓的“远程跟踪分支”,例如 origin/master。这些分支只保存了你上次拉取时在 origin 中对应分支的位置信息。所有你正在工作中的本地分支都不受 git fetch 影响。因此,以下操作是安全的:

git fetch origin
git log -p master..origin/master

如果你对此感到满意,你可以从origin/master合并或变基。


我建议你不要担心git fetch origin命令涉及的资源(无论是磁盘空间还是带宽)。Git会高效地发送必要的对象来完成正在更新的远程跟踪分支,除非你的源代码中存储了异常大的文件,否则这不会有太大影响。此外,即使你不打算使用其他存储库的分支,拥有这些分支的完整历史记录通常也很有用,例如这样你就可以检查那些开发历史记录。


谢谢您的快速评论和回答。所以是我自己的问题 :-) - Pod
2
我一直在使用PULL,它一直为我服务得很好,但是我读了无数次建议优先使用fetch/merge,所以我开始使用它。它运行良好,但是我花了一些时间才意识到GIT fetch会将所有远程分支都拉取到一个“临时空间”,你是第一个说出它的名字“remote-tracking branches”的人。我真的不明白拉取的数据去了哪里,因为只有在合并之后,它才会进入你的存储库。谢谢。 - luigi7up

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接