【原创】git branch 命令学习总结

以下说明忽略 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)

转载于:https://my.oschina.net/moooofly/blog/756578

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值