git跟踪在本地和远程名称不同时无法工作?

5

如果我执行

git checkout -b samename origin/samename

然后跟踪似乎正常工作。如果我进行后续提交,我就可以执行

git push

我提交的代码已经成功地通过git推送到了远端仓库。

但是,如果我执行以下命令:

git checkout -b diffname origin/samename

如果跟踪不起作用,尽管在《Pro Git》书中有这一节:

$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "sf"
Now, your local branch sf will automatically push to and pull from origin/serverfix

Git push命令提示“Everything up to date”是什么意思?

我正在mac os x上运行git 1.7.1版本。

以下是整个实验的步骤,供有兴趣尝试的人参考:

szbwood-mbp15:proj4_local bwood$ vi file1
szbwood-mbp15:proj4_local bwood$ git add file1
szbwood-mbp15:proj4_local bwood$ git commit -m"Created file 1"
[master (root-commit) 5d50289] Created file 1
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 file1
szbwood-mbp15:proj4_local bwood$ git push origin master:samename
Counting objects: 3, done.
Writing objects: 100% (3/3), 225 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /Users/bwood/work/gitplay/proj4_remote.git
 * [new branch]      master -> samename
szbwood-mbp15:proj4_local bwood$ git checkout -b samename origin/samename
Branch samename set up to track remote branch samename from origin.
Switched to a new branch 'samename'
szbwood-mbp15:proj4_local bwood$ vi file1
szbwood-mbp15:proj4_local bwood$ git commit -a
[samename a7af908] ..
 1 files changed, 1 insertions(+), 0 deletions(-)
szbwood-mbp15:proj4_local bwood$ git push
Counting objects: 5, done.
Writing objects: 100% (3/3), 251 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /Users/bwood/work/gitplay/proj4_remote.git
   5d50289..a7af908  samename -> samename
szbwood-mbp15:proj4_local bwood$ git checkout -b diffname origin/samename
Branch diffname set up to track remote branch samename from origin.
Switched to a new branch 'diffname'
szbwood-mbp15:proj4_local bwood$ vi file1
szbwood-mbp15:proj4_local bwood$ git commit -a
[diffname c5bbec1] ..
 1 files changed, 1 insertions(+), 0 deletions(-)
szbwood-mbp15:proj4_local bwood$ git push
Everything up-to-date

奇怪的是,配置文件看起来很正常。
[branch "samename"]
        remote = origin
        merge = refs/heads/samename
[branch "diffname"]
        remote = origin
        merge = refs/heads/samename

奇怪的是,.git中的配置文件看起来很正常: - bruce
实际上,我认为这本书是错的,并且阅读了push的man页面和这篇stackoverflow文章https://dev59.com/mnNA5IYBdhLWcg3wdtv5,这加强了我的看法。如果您没有明确指定要推送的分支,似乎git会推送与远程名称匹配的所有本地分支。如果您没有指定远程,则它会假定当前分支的远程。因此,人们经常会认为跟踪一个分支意味着可以使用'git push'推送更改,但我认为这是错误的。Git push正在推送与远程名称匹配的所有本地分支。 - bruce
1个回答

4
这不是关于跟踪的问题。默认情况下,git push根本不使用跟踪。它将匹配名称的分支推送到指定的远程仓库。有一个配置参数来控制这种行为:

push.default

定义了如果命令行没有给出refspec,远程没有配置refspec,并且命令行中没有任何选项暗示了refspec,git push应该采取的操作。可能的值包括:

  • nothing - 不推送任何内容。
  • matching - 推送所有匹配的分支。在两端都具有相同名称的所有分支都被认为是匹配的。这是默认值。
  • tracking - 将当前分支推送到其上游分支。
  • current - 将当前分支推送到同名分支。
再次强调,默认值是匹配,因此尽管您在第一种情况下已经设置了跟踪,但只是匹配名称告诉它要推送什么。如果您愿意,您当然可以将push.default设置为tracking,并获得您所期望的行为。
至于您从Pro Git引用的内容...哇,Pro Git通常是一个很好的资源。我还没有完全阅读它(我倾向于直接查看manpages和源代码),但我读过的所有内容都很好;我很惊讶竟然有一个小错误!

谢谢Jefromi - 解释得非常好。也感谢您在我之前的git问题上的帮助 - 总是清晰和有帮助的 :-) - bruce

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