以下说明忽略 master 分支情况
分支状态分析
- 只有 master 分支的初始状态
➜ learngit git:(master) git branch
* master
➜ learngit git:(master)
➜ learngit git:(master) git branch -avv
* master dab8fcf [origin/master] branch test
remotes/origin/HEAD -> origin/master
remotes/origin/master dab8fcf branch test
➜ learngit git:(master)
- 本地新建三个分支:dev1 dev2 dev3
➜ learngit git:(master) git checkout -b dev1
Switched to a new branch 'dev1'
➜ learngit git:(dev1)
➜ learngit git:(dev1) git checkout -b dev2
Switched to a new branch 'dev2'
➜ learngit git:(dev2)
➜ learngit git:(dev2) git checkout -b dev3
Switched to a new branch 'dev3'
➜ learngit git:(dev3)
➜ learngit git:(dev3) git branch -avv
dev1 dab8fcf branch test
dev2 dab8fcf branch test
* dev3 dab8fcf branch test
master dab8fcf [origin/master] branch test
remotes/origin/HEAD -> origin/master
remotes/origin/master dab8fcf branch test
➜ learngit git:(dev3)
- 以
git push -u
命令将本地分支 dev3 推到 github
➜ learngit git:(dev3) git push -u
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:moooofly/learngit.git
* [new branch] dev3 -> dev3
Branch dev3 set up to track remote branch dev3 from origin. -- 注意区别下面的输出
➜ learngit git:(dev3)
- 以
git push
命令将本地分支 dev2 推到 github
➜ learngit git:(dev3) git checkout dev2
Switched to branch 'dev2'
➜ learngit git:(dev2)
➜ learngit git:(dev2) git push
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:moooofly/learngit.git
* [new branch] dev2 -> dev2
➜ learngit git:(dev2)
- 进行分支信息查看并进行对比
➜ learngit git:(dev2) git branch -avv
--- 本地分支有 4 个
dev1 dab8fcf branch test
* dev2 dab8fcf branch test -- git push
dev3 dab8fcf [origin/dev3] branch test -- git push -u
master dab8fcf [origin/master] branch test
--- 远程分支有 3 个
remotes/origin/HEAD -> origin/master -- 这个不算
remotes/origin/dev2 dab8fcf branch test -- 注意:此时这里没有 dev1
remotes/origin/dev3 dab8fcf branch test
remotes/origin/master dab8fcf branch test
➜ learngit git:(dev2)
➜ learngit git:(dev2)
➜ learngit git:(dev2) git remote show origin
* remote origin
Fetch URL: git@github.com:moooofly/learngit.git
Push URL: git@github.com:moooofly/learngit.git
HEAD branch: master
Remote branches: -- 此时远程分支里没有 dev1
dev2 tracked -- git push
dev3 tracked -- git push -u
master tracked
Local branches configured for 'git pull': -- 能够成功执行 git pull 动作的本地分支
dev3 merges with remote dev3 -- git push -u
master merges with remote master
Local refs configured for 'git push': -- 能够成功执行 git push 动作的本地 refs
dev2 pushes to dev2 (up to date) -- git push
dev3 pushes to dev3 (up to date) -- git push -u
master pushes to master (up to date)
➜ learngit git:(dev2)
- 实验验证 git pull 和 git push 动作
在 dev2 上执行 git pull 得到如下提示信息:
缺少 tracking 信息,需要通过 --set-upstream-to 进行建立
➜ learngit git:(dev2) git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> dev2
➜ learngit git:(dev2)
而在 dev3 上执行 git pull 没有任何问题
➜ learngit git:(dev3) git pull
Already up-to-date.
➜ learngit git:(dev3)
当然,在 dev1 上也有同 dev2 的提示信息
➜ learngit git:(dev1) git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> dev1
➜ learngit git:(dev1)
经验证,dev2 和 dev3 确实可以成功执行 git push 命令;而对 dev1 执行 git push 就会变成如同 dev2 一样的状态;
- 单独为 dev2 建立 tracking 联系
在 dev2 上建立和远程分支的 tracking 关系
➜ learngit git:(dev2) git branch --set-upstream-to=origin/dev2 dev2
Branch dev2 set up to track remote branch dev2 from origin.
➜ learngit git:(dev2)
命令执行后的变化为:可以看到 dev2 和 dev3 的状态是完全一致的;
➜ learngit git:(dev2) git branch -avv
dev1 bde355c add dev1.txt
* dev2 f3942a6 [origin/dev2] add dev2.txt
dev3 c1b8dd7 [origin/dev3] add dev3.txt
master dab8fcf [origin/master] branch test
remotes/origin/HEAD -> origin/master
remotes/origin/dev1 bde355c add dev1.txt
remotes/origin/dev2 f3942a6 add dev2.txt
remotes/origin/dev3 c1b8dd7 add dev3.txt
remotes/origin/master dab8fcf branch test
➜ learngit git:(dev2)
➜ learngit git:(dev2)
➜ learngit git:(dev2) git remote show origin
* remote origin
Fetch URL: git@github.com:moooofly/learngit.git
Push URL: git@github.com:moooofly/learngit.git
HEAD branch: master
Remote branches:
dev1 tracked
dev2 tracked
dev3 tracked
master tracked
Local branches configured for 'git pull':
dev2 merges with remote dev2
dev3 merges with remote dev3
master merges with remote master
Local refs configured for 'git push':
dev1 pushes to dev1 (up to date)
dev2 pushes to dev2 (up to date)
dev3 pushes to dev3 (up to date)
master pushes to master (up to date)
➜ learngit git:(dev2)
重命名远程分支测试过程
- 新建分支 dev4 用于重命名测试
➜ learngit git:(dev2) git checkout -b dev4
Switched to a new branch 'dev4'
➜ learngit git:(dev4)
➜ learngit git:(dev4) git push -u
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:moooofly/learngit.git
* [new branch] dev4 -> dev4
Branch dev4 set up to track remote branch dev4 from origin.
➜ learngit git:(dev4)
➜ learngit git:(dev4) git branch -avv
dev1 bde355c add dev1.txt
dev2 f3942a6 [origin/dev2] add dev2.txt
dev3 c1b8dd7 [origin/dev3] add dev3.txt
* dev4 f3942a6 [origin/dev4] add dev2.txt -- 注意这里,对比下面
master dab8fcf [origin/master] branch test
remotes/origin/HEAD -> origin/master
remotes/origin/dev1 bde355c add dev1.txt
remotes/origin/dev2 f3942a6 add dev2.txt
remotes/origin/dev3 c1b8dd7 add dev3.txt
remotes/origin/dev4 f3942a6 add dev2.txt
remotes/origin/master dab8fcf branch test
➜ learngit git:(dev4)
➜ learngit git:(dev4) git remote show origin
* remote origin
Fetch URL: git@github.com:moooofly/learngit.git
Push URL: git@github.com:moooofly/learngit.git
HEAD branch: master
Remote branches:
dev1 tracked
dev2 tracked
dev3 tracked
dev4 tracked
master tracked
Local branches configured for 'git pull':
dev2 merges with remote dev2
dev3 merges with remote dev3
dev4 merges with remote dev4
master merges with remote master
Local refs configured for 'git push':
dev1 pushes to dev1 (up to date)
dev2 pushes to dev2 (up to date)
dev3 pushes to dev3 (up to date)
dev4 pushes to dev4 (up to date)
master pushes to master (up to date)
➜ learngit git:(dev4)
- 修改本地分支 dev4 名字为 dev444
➜ learngit git:(dev4) git branch -m dev4 dev444
➜ learngit git:(dev444)
- 删除远程 dev4 分支
➜ learngit git:(dev444) git push origin --delete dev4
To git@github.com:moooofly/learngit.git
- [deleted] dev4
➜ learngit git:(dev444)
- 查看分支状态信息变化
➜ learngit git:(dev444) git branch -avv
dev1 bde355c add dev1.txt
dev2 f3942a6 [origin/dev2] add dev2.txt
dev3 c1b8dd7 [origin/dev3] add dev3.txt
* dev444 f3942a6 [origin/dev4: gone] add dev2.txt -- 可以看到出现 gone 关键字
master dab8fcf [origin/master] branch test
remotes/origin/HEAD -> origin/master
remotes/origin/dev1 bde355c add dev1.txt
remotes/origin/dev2 f3942a6 add dev2.txt
remotes/origin/dev3 c1b8dd7 add dev3.txt -- 可以看到远程 dev4 分支已经不存在
remotes/origin/master dab8fcf branch test
➜ learngit git:(dev444)
➜ learngit git:(dev444) git remote show origin
* remote origin
Fetch URL: git@github.com:moooofly/learngit.git
Push URL: git@github.com:moooofly/learngit.git
HEAD branch: master
Remote branches: -- 可以看到远程 dev4 分支已经不存在
dev1 tracked
dev2 tracked
dev3 tracked
master tracked
Local branches configured for 'git pull':
dev2 merges with remote dev2
dev3 merges with remote dev3
dev444 merges with remote dev4 -- 注意:这里就是后续错误提示的关键,即本地分支已改名,但 tracking 信息记录的仍是 dev4
master merges with remote master
Local refs configured for 'git push':
dev1 pushes to dev1 (up to date)
dev2 pushes to dev2 (up to date)
dev3 pushes to dev3 (up to date) -- 可以看到远程 dev4 分支已经不存在
master pushes to master (up to date)
➜ learngit git:(dev444)
上面的信息说明:删除远程分支后,要注意对应本地分支的 tracking 变更;
- 将新分支 dev444 推送为远程分支
➜ learngit git:(dev444) git push origin dev444
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:moooofly/learngit.git
* [new branch] dev444 -> dev444
➜ learngit git:(dev444)
➜ learngit git:(dev444) git branch -avv
dev1 bde355c add dev1.txt
dev2 f3942a6 [origin/dev2] add dev2.txt
dev3 c1b8dd7 [origin/dev3] add dev3.txt
* dev444 f3942a6 [origin/dev4: gone] add dev2.txt -- 这里仍旧会看到出现 gone
master dab8fcf [origin/master] branch test
remotes/origin/HEAD -> origin/master
remotes/origin/dev1 bde355c add dev1.txt
remotes/origin/dev2 f3942a6 add dev2.txt
remotes/origin/dev3 c1b8dd7 add dev3.txt
remotes/origin/dev444 f3942a6 add dev2.txt -- 新远程分支
remotes/origin/master dab8fcf branch test
➜ learngit git:(dev444)
➜ learngit git:(dev444) git remote show origin
* remote origin
Fetch URL: git@github.com:moooofly/learngit.git
Push URL: git@github.com:moooofly/learngit.git
HEAD branch: master
Remote branches: -- 这里是对的
dev1 tracked
dev2 tracked
dev3 tracked
dev444 tracked
master tracked
Local branches configured for 'git pull':
dev2 merges with remote dev2
dev3 merges with remote dev3
dev444 merges with remote dev4 -- 这里仍旧是错误的
master merges with remote master
Local refs configured for 'git push':
dev1 pushes to dev1 (up to date)
dev2 pushes to dev2 (up to date)
dev3 pushes to dev3 (up to date)
dev444 pushes to dev444 (up to date) -- 这里是对的
master pushes to master (up to date)
➜ learngit git:(dev444)
注意:若上面使用
git push -u origin dev444
推送远程分支,则所有分支信息就都是正确的了;
- 此时 push 动作是可以正常执行的
➜ learngit git:(dev444) touch dev4.txt
➜ learngit git:(dev444) ✗ git add .
➜ learngit git:(dev444) ✗ git commit -m "add dev4.txt"
[dev444 cd927b6] add dev4.txt
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 dev4.txt
➜ learngit git:(dev444)
➜ learngit git:(dev444)
➜ learngit git:(dev444) git push
Counting objects: 2, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 225 bytes | 0 bytes/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local objects.
To git@github.com:moooofly/learngit.git
f3942a6..cd927b6 dev444 -> dev444
➜ learngit git:(dev444)
- 由于 pull 动作使用的 tracking 信息关联的是远端 dev4 分支,而实际上 dev4 分支已经被删除了,所有会报如下各种错误
➜ learngit git:(dev444) git pull
Your configuration specifies to merge with the ref 'refs/heads/dev4'
from the remote, but no such ref was fetched.
➜ learngit git:(dev444)
➜ learngit git:(dev444) git status
On branch dev444
Your branch is based on 'origin/dev4', but the upstream is gone.
(use "git branch --unset-upstream" to fixup) -- 注意这里提示的修正方法
nothing to commit, working directory clean
➜ learngit git:(dev444)
- 修正本地分支 dev444 错误的 tracking 信息
去除 dev444 的 tracking 关系(与 dev4 的错误关联)
➜ learngit git:(dev444) git branch --unset-upstream
➜ learngit git:(dev444)
➜ learngit git:(dev444) git branch -avv
dev1 bde355c add dev1.txt
dev2 f3942a6 [origin/dev2] add dev2.txt
dev3 c1b8dd7 [origin/dev3] add dev3.txt
* dev444 cd927b6 add dev4.txt -- 从这里可以看出 tracking 关联已经取消
master dab8fcf [origin/master] branch test
remotes/origin/HEAD -> origin/master
remotes/origin/dev1 bde355c add dev1.txt
remotes/origin/dev2 f3942a6 add dev2.txt
remotes/origin/dev3 c1b8dd7 add dev3.txt
remotes/origin/dev444 cd927b6 add dev4.txt
remotes/origin/master dab8fcf branch test
➜ learngit git:(dev444)
➜ learngit git:(dev444) git remote show origin
* remote origin
Fetch URL: git@github.com:moooofly/learngit.git
Push URL: git@github.com:moooofly/learngit.git
HEAD branch: master
Remote branches:
dev1 tracked
dev2 tracked
dev3 tracked
dev444 tracked
master tracked
Local branches configured for 'git pull': -- 可以看到本地分支 dev444 之前错误的 tracking 关联已经没了
dev2 merges with remote dev2
dev3 merges with remote dev3
master merges with remote master
Local refs configured for 'git push':
dev1 pushes to dev1 (up to date)
dev2 pushes to dev2 (up to date)
dev3 pushes to dev3 (up to date)
dev444 pushes to dev444 (up to date)
master pushes to master (up to date)
➜ learngit git:(dev444)
- 为本地分支 dev444 重新建立正确的 tracking 关系
➜ learngit git:(dev444) git branch --set-upstream-to=origin/dev444 dev444
Branch dev444 set up to track remote branch dev444 from origin.
➜ learngit git:(dev444)
➜ learngit git:(dev444)
➜ learngit git:(dev444) git branch -avv
dev1 bde355c add dev1.txt
dev2 f3942a6 [origin/dev2] add dev2.txt
dev3 c1b8dd7 [origin/dev3] add dev3.txt
* dev444 ec644bb [origin/dev444] add dev444.txt -- 正确的 tracking 关系
master dab8fcf [origin/master] branch test
remotes/origin/HEAD -> origin/master
remotes/origin/dev1 bde355c add dev1.txt
remotes/origin/dev2 f3942a6 add dev2.txt
remotes/origin/dev3 c1b8dd7 add dev3.txt
remotes/origin/dev444 ec644bb add dev444.txt
remotes/origin/master dab8fcf branch test
➜ learngit git:(dev444)
➜ learngit git:(dev444)
➜ learngit git:(dev444) git remote show origin
* remote origin
Fetch URL: git@github.com:moooofly/learngit.git
Push URL: git@github.com:moooofly/learngit.git
HEAD branch: master
Remote branches:
dev1 tracked
dev2 tracked
dev3 tracked
dev444 tracked
master tracked
Local branches configured for 'git pull':
dev2 merges with remote dev2
dev3 merges with remote dev3
dev444 merges with remote dev444 -- 正确的 tracking 关系
master merges with remote master
Local refs configured for 'git push':
dev1 pushes to dev1 (up to date)
dev2 pushes to dev2 (up to date)
dev3 pushes to dev3 (up to date)
dev444 pushes to dev444 (up to date)
master pushes to master (up to date)
➜ learngit git:(dev444)
- 验证 git pull 是否报错
➜ learngit git:(dev444) git pull
Already up-to-date.
➜ learngit git:(dev444)