git pull混乱
过度特异性
您的git pull命令包含太多信息。
[test2]$ git pull test2 test2:test2
来自 /gitvobs/git_bare/test2
![拒绝] test2 -> test2(非快进)
我知道添加一个 + (git pull test2 +test2:test2) 会有所帮助,但它会覆盖本地更改。
这就是您的命令的含义:
# *------------ (1) remote repository name
# / *------- (2) ref in remote repository
# / / *-- (3) ref in local repository
# / / /
git pull test2 test2:test2
# Means this: From remote repository `test2` (1),
# fetch branch `test2` (2), store it in local branch `test2` (3), then
# merge the fetched history into HEAD.
您是在告诉git pulltest2
用远程在其分支上的任何内容覆盖您的本地分支test2
,然后将其与 HEAD 合并。您可能不想包含 refspec 的目标部分(:test2
)。
如果您已签出的本地分支配置为跟踪某些内容(请参阅下面的“分支:...”),只需执行
git pull
如果您需要提供(或覆盖)远程和存储库,只需提供远程名称/url 和远程上的本地分支(省略 refspec 的最后部分):
git pull test2 test2
拉入未签出的分支
git pull是(如上所述)git fetch和git merge(或git rebase)的组合。
通常,合并可能涉及冲突解决。解决冲突需要工作树。因此,没有工作树就不可能执行正常的合并操作。这意味着您当前的 HEAD 必须是合并的父级之一(它将是第一个父级)。进行 rebase 还需要一个工作树来解决冲突。
由于拉取涉及合并或变基,因此无法拉入未签出的本地分支。您只能拉入当前签出的分支。
分支:本地、跟踪、远程跟踪
各种类型的 Git 分支都是同一个底层对象:refs。Refs 位于 和 的命名refs/
空间中。$GIT_DIR/refs/
$GIT_DIR/packed-refs
- “本地”分支存在于
refs/heads/
命名空间中。
- 要检查
test2
本地分支参考:
git show-ref refs/heads/test2
, 或者
cat .git/refs/heads/test2
, 或者
grep -F refs/heads/test2 .git/packed-refs
- “远程跟踪”分支存在于
refs/remotes/<remote-name>/
命名空间中。
- 远程跟踪分支是来自远程存储库的分支的本地副本。
- 当您这样想时,“远程跟踪”这个名称是有道理的,但它可能会与git branch和git checkout
--track
不幸命名的功能混淆(请参阅最终分支类型)。
- 检查
test2
远程跟踪分支参考:
git show-ref refs/remotes/test2/test2
, 或者
cat .git/refs/remotes/test2/test2
, 或者
grep -F refs/remotes/test2/test2 .git/packed-refs
跟踪另一个分支的本地分支是正常的本地分支 (in refs/heads/
),在 中具有额外的配置$GIT_DIR/config
:
[branch "test2"]
remote = test2
merge = refs/heads/test2
重要的是要注意merge
(或)配置选项在远程rebase
命名一个ref 。所以这里的意思是在远程找到的本地分支。特殊的远程名称可用于引用本地存储库中的本地分支。refs/heads/test2
test2
test2
.
- “跟踪”其他分支的本地分支的目的是使其易于键入
git pull
并使其合并(或在其之上)其他分支的历史记录。
您说您想将普通的本地分支与跟踪其他分支的本地分支区分开来。您可以通过在$GIT_DIR/config
文件中查找分支配置来执行此操作。
您可以使用git config来执行此操作:
branch_tracks_something() {
{
git config branch."$1".merge ||
git config branch."$1".rebase
} >/dev/null 2>&1
}
# test local branch
branch_tracks_something test2 && echo 'test2 tracks something' || echo 'test2 does not track anything'
或者,如果你有 Git 1.6.3 或更高版本,你可以使用git for-each-ref%(upstream)
的格式:
{ echo 'show_ref_desc() {
case "$1" in
refs/heads/*)
t=''
test -n "$2" && t=" (tracks $2)"
echo "local: $1$t"
;;
refs/remotes/*)
echo "remote tracking: $1"
;;
*)
echo "other: $1"
;;
esac
}'; git for-each-ref --shell --format='show_ref_desc %(refname) %(upstream)'; } |
sh
输出如下所示:
local: refs/heads/test2 (tracks refs/remotes/test2/test2)
remote tracking: refs/remotes/test2/HEAD
remote tracking: refs/remotes/test2/test2