我使用'git branch -b branch-name origin / branch-name'在我的本地存储库中本地跟踪远程跟踪分支。 我的远程分支是test2 / test2(origin / branch-name),它在本地被跟踪为test2。
原点也称为test2。 我还没有签出我的本地跟踪分支test2。
当我执行'git pull origin remote-branch:local-tracked-branch'时出现此错误
[test2] $ git pull test2 test2:test2 来自/ gitvobs / git_bare / test2 ! [拒绝] test2 - > test2(非快进)
而当我结账我的本地跟踪分支test2 拉'git pull origin local-tracked-branch'我没有得到错误 我使用'git pull test2 test2'进行拉动
来自/ gitvobs / git_bare / test2 * branch test2 - > FETCH_HEAD 自动合并a.txt 自动合并失败;修复冲突,然后提交结果。
我知道添加+(git pull test2 + test2:test2)会有所帮助,但它会覆盖本地更改。
那么我怎么知道哪些本地分支是由我在本地使用'git branch new-branch-name'创建的,或者是使用git branch -b branch-name origin / branch-name'从远程分支本地跟踪的? / p>
答案 0 :(得分:7)
您的 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 pull 使用其test2
分支上的远程数据覆盖您的本地test2
分支,然后将其与HEAD合并。您可能不希望包含refspec的目标部分(:test2
)。
如果您签出的本地分支配置为跟踪某些内容(请参阅下面的“分支:...”),只需执行
git pull
如果您需要提供(或覆盖)远程和存储库,只需提供远程名称/ url和远程的本地分支(不包括refspec的最后部分):
git pull test2 test2
git pull 是(如上所述) git fetch 和 git merge (或 git rebase 的组合>)。
通常,合并可能涉及解决冲突。冲突解决需要一个工作树。因此,没有工作树就不可能执行正常的合并操作。这意味着您当前的HEAD必须是合并的父级之一(它将是第一个父级)。做一个rebase也需要一个工作树来解决冲突。
由于pull涉及合并或rebase,因此无法进入未检出的本地分支。您只能进入当前签出的分支。
各种类型的Git分支都是相同的底层对象:refs。引用refs/
和$GIT_DIR/refs/
中的$GIT_DIR/packed-refs
命名空间。
refs/heads/
命名空间中。
test2
本地分支ref:
git show-ref refs/heads/test2
,或
cat .git/refs/heads/test2
或grep -F refs/heads/test2 .git/packed-refs
refs/remotes/<remote-name>/
命名空间中。
--track
的功能混淆(参见最终分支类型)。test2
远程跟踪分支ref:
git show-ref refs/remotes/test2/test2
,或
cat .git/refs/remotes/test2/test2
或grep -F refs/remotes/test2/test2 .git/packed-refs
跟踪另一个分支的本地分支是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
答案 1 :(得分:1)
独立于跟踪分支列表(您可以使用git config -l
看到),"non-fast-forward
" message表示无法合并远程分支(即远程分支的提取提交的本地副本)你的分支是因为:
这样:
--last pull
|
v
x-x-x-x-x <--test2
\
-y-y-y <-- test2/test2
而这将是一次快速合并
--last pull
|
v
x-x <--test2
\
-y-y-y <-- test2/test2
所以:
git checkout test2
git fetch test2 test2
git merge test2/test2
#fix conflicts
git commit
并且,请将您的远程仓库称为除test2以外的任何其他名称。这就是test2太多了;)
现在查看本地仓库中跟踪的远程分支列表:
git config --get-regexp branch..*