Git进阶——本地创建的分支指向远程分支

350 阅读6分钟

背景

Your configuration specifies to merge with the ref 'refs/heads/feat/...' from the remote,but no such ref was fetched.

这个错误信息通常表示你的配置中指定要合并来自远程分支 “refs/heads/feat/...” 的内容,但在获取远程分支时没有找到这个特定的分支。

从远程仓库获取到本地仓库

  • git fetch命令用于从远程仓库获取最新的分支和提交信息,但它不会自动合并到本地分支。语法:git fetch <远程仓库名>,一般情况下,使用git fetch origin即可从远程仓库origin获取最新信息。
  • 执行git fetch后,你可以通过查看git log来比较本地分支和远程分支的差异。

查看本地和远程分支详情

git branch -avv是一个用于查看本地和远程分支详细信息的命令,下面对其进行详细介绍:

1. 命令构成和含义

  • git branch部分

    • git branch是 Git 中用于管理分支的基础命令。单独使用git branch时,它会列出所有本地分支。例如,在一个包含masterfeature -branch两个本地分支的仓库中,执行git branch命令会得到如下结果:

    master
    feature -branch
  • -a选项

    • -a(全称--all)选项用于显示所有分支,包括本地分支和远程分支。当添加-a选项后,命令git branch -a除了显示本地分支外,还会列出远程仓库中的所有分支。例如,假设远程仓库中有origin/masterorigin/feature -branch等分支,执行git branch -a的结果可能如下:

    master
    feature -branch
    remotes/origin/master
    remotes/origin/feature -branch
  • -vv选项

    • -vv(全称--verbose --verbose)选项用于显示更详细的信息。具体来说,对于每个本地分支,它会显示分支的上游分支(即本地分支所跟踪的远程分支),以及本地分支和上游分支之间的差异(例如,本地分支领先或落后上游分支几个提交)。

2. 命令输出示例和解读

  • 示例输出

    • 假设我们有一个本地仓库,其中有一个本地分支local -branch跟踪远程分支origin/remote -branch,并且本地分支领先远程分支 2 个提交。执行git branch -avv命令可能会得到如下输出:

    * local -branch    3456789 [origin/remote -branch] Some commit message
      master          1234567 [origin/master] Another commit message
    remotes/origin/master     1234567 Another commit message
    remotes/origin/remote -branch  3455787 Some commit message
  • 解读

    • *符号:表示当前所在的分支。在这个例子中,当前分支是local -branch

    • 第一列(分支名称):显示了本地分支和远程分支的名称,本地分支名称前面没有remotes/origin/前缀,而远程分支名称有这个前缀来区分。

    • 第二列(提交哈希值):对于本地分支,这是该分支最新的提交哈希值。对于远程分支,这是从远程仓库获取的最新提交哈希值。

    • 第三列(上游分支信息):对于本地分支,方括号内显示的是该本地分支所跟踪的远程分支名称。如果没有方括号,说明该本地分支没有跟踪的远程分支。

    • 第四列(差异或提交消息):对于本地分支,如果本地分支和上游分支存在差异,会显示领先或落后的情况(如本地分支领先远程分支 2 个提交),或者显示最新的提交消息。对于远程分支,只显示最新的提交消息。

3. 命令的用途

  • 跟踪分支状态

    • 在多人协作开发中,git branch -avv是一个非常有用的工具,可以帮助开发人员快速了解本地分支和远程分支的状态。例如,通过查看本地分支与远程分支的差异,可以知道是否需要更新本地分支,以及是否存在未推送的提交。
    • 当准备合并分支时,查看分支状态可以帮助判断合并的时机。如果本地分支落后远程分支,可能需要先更新本地分支再进行合并操作。
  • 检查分支关联

    • 可以通过命令查看本地分支是否正确关联了远程分支,以及关联的是哪个远程分支。如果发现关联错误,可以及时使用git branch --set - upstream - to命令来重新设置本地分支的上游分支。

将本地创建的分支指向远程分支

1. 在创建本地分支时关联远程分支

  • 使用git checkout -b命令

    • 语法:git checkout -b <本地分支名> <远程分支名>

    • 例如,假设远程分支为origin/feature -branch,想要创建一个同名的本地分支并关联到远程分支,命令为git checkout -b feature -branch origin/feature -branch

    • 这种方法在创建本地分支的同时就建立了与远程分支的跟踪关系,后续执行git pushgit pull操作时,Git 会自动知道与哪个远程分支进行交互。

2. 对已创建的本地分支设置上游分支(关联远程分支)

  • 使用git branch --set-upstream-to命令

    • 语法:git branch --set-upstream-to=<远程分支名> <本地分支名>

    • 假设已经创建了一个本地分支local -branch,远程分支为origin/remote -branch,要将本地分支与远程分支关联,命令为git branch --set-upstream-to=origin/remote -branch local -branch

    • 执行此命令后,本地分支就知道其对应的远程分支,在进行推送和拉取操作时会按照这个关联进行数据传输。

3. 使用git push -u命令

  • 语法和操作步骤

    • 首先创建一个本地分支(如果还未创建),例如使用git branch local -branch

    • 然后使用git push -u <远程仓库名> <本地分支名>命令。假设远程仓库名为origin,本地分支为local -branch,命令为git push -u origin local -branch

    • 这个命令在第一次推送本地分支到远程仓库时,除了推送分支内容外,还会自动设置本地分支的上游分支,也就是将本地分支与远程分支建立关联。之后再进行git pushgit pull操作时,就会基于这个关联进行。

4. 在克隆仓库时指定分支并关联

  • 使用git clone -b命令

    • 语法:git clone -b <远程分支名> <远程仓库URL>
    • 例如,要克隆远程仓库https://github.com/username/repository.git中的feature -branch分支,并在本地创建与远程分支同名且关联的分支,命令为git clone -b feature -branch https://github.com/username/repository.git
    • 这样在克隆过程中,就会在本地创建一个与远程分支同名的分支,并自动建立跟踪关系,方便后续的开发和协作操作。