Git Bash:如何检查是否有新的提交可用

12

我和朋友合作一个项目,使用git进行代码版本控制。他在GitHub上创建了一个仓库,其中包含我们各自名字的文件夹,因此每次我更新一些内容,就将其上传到该文件夹并推送到GitHub,他也是如此。所以每当有新的提交时,我们都需要从GitHub拉取最新版本,然后将编辑过的文件复制粘贴到我们自己的localhost(wamp)上。

我的问题是:

  1. 我如何在使用git bash时检查是否有新的提交,而不必去GitHub上查看?Git pull会拉取最新版本,但如果我只想先检查呢?

  2. 假设我的git文件夹位于D://git/project_name。我能将此文件夹复制到另一个位置(例如USB闪存驱动器),然后从该USB上进行git pull吗?

  3. 如果我们的方法不可行,你有任何关于如何使用git的建议吗?我们正在使用CodeIgniter框架,因此起初我建议只推送整个CodeIgniter文件夹,但我的朋友说这很危险(因为整个配置和数据库都在那里),而且没有必要(因为主系统文件夹很可能不会被修改)。所以我们现在使用这种当前的方法(拥有两个带有我们姓名的文件夹,并在每次更新时进行推送和拉取)。


2
可能是重复的问题:git:检查是否需要拉取 - Karl Bielefeldt
为了检查远程提交,我使用这个 git-prompt,这些 代码行完成了任务 - JuanPablo
3个回答

14

分别回答你的前两个问题:

  1. 假设每种情况下的 origin 都指代 GitHub 存储库,那么你只需要运行 git fetch origin。然后,“远程跟踪分支” origin/master 将处于 GitHub 上主分支的版本,你可以使用 git diff master origin/master 比较它和你本地主分支之间的差异,或者使用 git log master...origin/master 查看只属于 masterorigin/master 的提交。
  2. 是的,你可以将存储库复制到 USB 闪存驱动器上并从中拉取。但是,如果你想从 USB 闪存驱动器上拉取到另一台计算机上,你需要设置一个引用指向 USB 闪存驱动器上存储库的位置。

关于是否有更好的方法来完成你正在做的事情,我不太清楚你正在做什么或试图实现什么,无法给出有意义的评论。不过,在存储库中以每个开发者的名称命名文件夹,并且这些文件夹中包含(可能是)非常相似的源代码听起来有些可疑 - 通常会使用分支来处理同一代码的不同版本。


5
如果你的本地分支正确地跟踪了远程分支,你应该可以执行git status命令,并查看你相对于远程分支是超前还是落后多少个提交。
这对于我来说是关于Git有点困惑。下面是三个部分的答案:
1)通常当你克隆一个远程仓库时,需要使用-t选项来跟踪你要复制的远程分支:
git checkout -tb my_branch origin/my_branch

2) 如果您忘记了这样做,您总是可以稍后进行以下操作:

git branch --set-upstream my_branch origin/my_branch

3) 如果你的远程分支与本地分支同名,你只需要设置git自动跟踪所有远程分支:

git config push.default matching             <-- for this repo only
git config --global push.default matching    <-- for all git repos that this user deals with on this machine

关于您的第二个问题,只要您在同一台机器上使用相同的用户,那么是可以的。Git使用SSH身份验证,因此无论存储库位于何处,只要正确的用户运行命令,它就会将正确的SSH凭据与请求一起发送。


我们对Git还很陌生,所以对我们来说有点困惑 :) 基本上,我的朋友在GitHub上创建了一个仓库,并邀请我作为协作者,这样我们两个都可以推送到仓库的主分支(默认分支?)。所以我们实际上并没有使用分支或其他任何东西。这样做有问题吗?基本上,每次我想知道是否有新的提交,我都必须去GitHub检查,否则我只能拉取所有最新的内容,而不知道更新了哪些新文件(想象一下在度假后进行拉取)。有没有办法检查哪些文件是新的?第三个问题呢?你有什么建议吗? - Henson
你总是在一个分支上,这种情况下是主分支。执行上述第二步,将“my_branch”替换为“master”。然后让你的合作伙伴向Github提交一个文件,然后在你的机器上执行git status命令,看看它是否知道你落后了一个提交。 - Mauvis Ledford
关于您的设置,请考虑创建符号链接。如果您使用的是Mac,请执行以下操作:ln -s my/git_project /Applications/MAMP/htdocs/my_project。对于Windows系统,我不确定。 - Mauvis Ledford
@Mauvis Ledford:“匹配”是push.default的默认值,因此您不需要配置它。实际上,如果您已经设置了与上游分支的关联,就像您在1)和2)中建议的那样,将push.default设置为“跟踪”会更少混淆。此外,我怀疑提问者和协作者是从GitHub克隆或按照其创建新存储库的说明操作的,因此步骤1)和2)应该是不必要的。 - Mark Longair
@Mark,发帖人只是想知道是否有新的提交,而不是查看更改的差异。如果他已经正确地设置了跟踪,那么一个简单的 "git status" 不就能告诉他他落后或者超前了多少次提交吗? - Mauvis Ledford
@Mauvis:如果OP之前没有运行git fetch origin,那么git status输出的第二行信息可能不准确,并且这个信息很容易被忽略。此外,使用git log master...origin/master可以查看提交消息,我认为这很好。 - Mark Longair

0

对于任何想要检查新提交(而不使用“git fetch”即不“污染”本地 git)的人:

我发现的一个技巧是使用 git ls-remote 并检查远程分支的提交哈希是否与本地分支匹配。

这是一个简单的 Bash 脚本:

#!/bin/bash

# origin/branch we are interested in
origin="origin"
branch="master"
# last commit hash
commit=$(git log -n 1 --pretty=format:%H "$origin/$branch")

# url of the remote repo
url=$(git remote get-url "$origin")

for line in "$(git ls-remote -h $url)"; do
    fields=($(echo $line | tr -s ' ' ))
    test "${fields[1]}" == "refs/heads/$branch" || continue
    test "${fields[0]}" == "$commit" && echo "nothing new" \
        || echo "new commit(s) availble"
    exit
done

echo "no matching head found on remote"

我需要这个东西来实现一个基于git的包管理器,它在检查更新时无法调用git-fetch


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