Sen*_*mar 2 git git-pull git-branch
我使用'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'从远程分支本地跟踪的?
你的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.
Run Code Online (Sandbox Code Playgroud)
你告诉git pull用你的test2分支上的遥控器覆盖你的本地test2分支,然后将它与HEAD合并.您可能不希望包含refspec(the :test2)的目标部分.
如果您签出的本地分支配置为跟踪某些内容(请参阅下面的"分支:..."),那么就这样做
git pull
Run Code Online (Sandbox Code Playgroud)
如果您需要提供(或覆盖)远程和存储库,只需提供远程名称/ url和远程的本地分支(不包括refspec的最后部分):
git pull test2 test2
Run Code Online (Sandbox Code Playgroud)
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-refsrefs/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跟踪另一个分支的本地分支是正常的本地分支(in refs/heads/),其具有以下额外配置$GIT_DIR/config:
[branch "test2"]
remote = test2
merge = refs/heads/test2
Run Code Online (Sandbox Code Playgroud)
请务必注意,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'
Run Code Online (Sandbox Code Playgroud)
或者,如果你有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
Run Code Online (Sandbox Code Playgroud)
输出如下所示:
local: refs/heads/test2 (tracks refs/remotes/test2/test2)
remote tracking: refs/remotes/test2/HEAD
remote tracking: refs/remotes/test2/test2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1587 次 |
| 最近记录: |