如果我做
git checkout -b samename origin/samename
Run Code Online (Sandbox Code Playgroud)
然后跟踪似乎工作正常.如果我做后续提交,我就可以做
git push
Run Code Online (Sandbox Code Playgroud)
并且git将我的提交推迟到原点.
但是,如果我这样做
git checkout -b diffname origin/samename
Run Code Online (Sandbox Code Playgroud)
然后跟踪不起作用,尽管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
Run Code Online (Sandbox Code Playgroud)
Git push只是给出了"一切都是最新的"给出了什么?
我在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
Run Code Online (Sandbox Code Playgroud)
奇怪的是,配置文件看起来很好..
[branch "samename"]
remote = origin
merge = refs/heads/samename
[branch "diffname"]
remote = origin
merge = refs/heads/samename
Run Code Online (Sandbox Code Playgroud)
这与跟踪无关。git push默认情况下根本不使用跟踪。它将具有匹配名称的分支推送到指定的远程。有一个配置参数可以控制此行为:
默认推送
定义如果命令行上没有给出 refspec、远程中没有配置 refspec、并且命令行上给出的任何选项都没有暗示 refspec,则 git Push 应采取的操作。可能的值为:
- 什么都没有——不要推动任何东西。
- 匹配 - 推送所有匹配的分支。所有两端具有相同名称的分支都被认为是匹配的。这是默认设置。
- 跟踪 - 将当前分支推送到其上游分支。
- current - 将当前分支推送到同名分支。
同样,默认值是匹配的,因此尽管您在第一种情况下确实设置了跟踪,但只是匹配的名称告诉它要推送什么。如果您愿意,您当然可以设置push.default为tracking,并获得您期望的行为。
至于您引用 Pro Git 的话...哇,Pro Git 通常是一个很棒的资源。我还没有从头到尾读完它(我倾向于直接阅读手册页和源代码),但我读过的所有内容都很棒;即使是一个微小的错误,我也会感到惊讶!