Git笔记:分支管理1之基础

使用分支意味着,从开发主线上分离开来,然后在不影响主线的同时继续工作


分支

Git分支实际上是指向更改快照的指针


1、创建分支

git branch <new-branch> [tag-name/commit-hash] # 创建新分支;若tag-name或commit-hash存在则基于此创建分支

git checkout -b <new-branch> [tag-name/commit-hash] # 创建新分支并切换到该分支;若tag-name或commit-hash存在则基于此创建分支
git switch -c <new_branch> # git2.23+,创建新分支并切换到该分支

git branch -m old_branchname new_branchname # 重命名

git checkout <branch> # 切换分支
git switch <branch> # 切换分支
git checkout/switch - # 切换上一分支(前提上一分支存在)

29447@GW64 /d/myProject (main)
$ git branch
* main

29447@GW64 /d/myProject (main)
$ git branch -r
  origin/HEAD -> origin/main
  origin/main

29447@GW64 /d/myProject (main)
$ git branch dev

29447@GW64 /d/myProject (main)
$ git checkout -b test
Switched to a new branch 'test'

29447@GW64 /d/myProject (test)
$ git branch
  dev
  main
* test

29447@GW64 /d/myProject (test)
$ git branch -r
  origin/HEAD -> origin/main
  origin/main


$ git branch
  main
  new_branch2
* test_branch

$ git branch -m new_branch2 rename_branch

$ git branch
  main
  rename_branch
* test_branch
29447@GW64 /d/myProject (main)
$ git branch -a
* main
  temp_branch
  remotes/origin/HEAD -> origin/main
  remotes/origin/dev
  remotes/origin/main

29447@GW64 /d/myProject (main)
$ git checkout -b test origin/test  # origin/test不存在,所以创建不成功
fatal: 'origin/test' is not a commit and a branch 'test' cannot be created from it

29447@GW64 /d/myProject (main)
$ git checkout -b dev origin/dev
branch 'dev' set up to track 'origin/dev'. # 基于origin/dev创建本地分支dev
Switched to a new branch 'dev'

git checkout <branch/tag> #切换到指定分支或tag
git checkout - # 切换到前一个分支
git checkout <commit-hash> # 切换到特定提交状态,仅查看,不能进行分支操作;'detached HEAD' state 不建议该分离指针状态下工作
切换分支时,Git会用该分支的最后提交的快照替换你的工作目录的内容,所以多个分支不需要多个目录

29447@GW64 /d/myProject (test)
$ git add .

29447@GW64 /d/myProject (test)
$ git commit -m "branch test add test.txt"
[test 629c3fc] branch test add test.txt
 3 files changed, 2 insertions(+), 1 deletion(-)
 create mode 100644 add.txt
 create mode 100644 test.txt

29447@GW64 /d/myProject (test)
$ git checkout dev
Switched to branch 'dev'

29447@GW64 /d/myProject (dev)
$ git add .

29447@GW64 /d/myProject (dev)
$ git commit -m "branch dev add dev.txt"
[dev dc79c57] branch dev add dev.txt
 1 file changed, 7 insertions(+)
 create mode 100644 dev.txt

29447@GW64 /d/myProject (dev)
$ git checkout main
Switched to branch 'main'

29447@GW64 /d/myProject (main)
$ git checkout -
Switched to branch 'dev'

29447@GW64 /d/myProject (dev)
$ git checkout -
Switched to branch 'main'

29447@GW64 /d/myProject (main)
$ 

2、查看分支

git branch #显示所有本地分支
git branch -r # 查看远程分支(r 表示remote)
git branch -a # 查看所有的远程分支和本地分支
git branch -v # 查看分支上的最后一次提交
git branch --merged # 查看哪些分支已经合并到当前分支

$ git branch
  dev
* main
  test

$ git branch -r
  origin/HEAD -> origin/main
  origin/main

$ git branch -a
  dev
* main
  test
  remotes/origin/HEAD -> origin/main  # 远程分支
  remotes/origin/main  # 远程分支

$ git show v1.0  # 查看标签
tag v1.0
Tagger: bai-cao <2944717202@qq.com>
Date:   Mon Jun 9 18:36:19 2025 +0800
merge branch test&dev # 标签创建时的备注
commit 88ddcf7cb0bc87d7f7dc219c8591f2cf0fd3e4a3 (tag: v1.0)
……  # 其他信息忽略

$ git branch v1.0_branch v1.0  # 基于标签创建分支

$ git branch -v
  main          dc06cd4 test patch again
  rename_branch dc06cd4 test patch again
* test_branch   dc06cd4 test patch again
  v1.0_branch   88ddcf7 merge branch_test:Merge conflict in test.txt  # 新分支显示对应的commit-hash以及提交备注


$ git log -3 --oneline
dc06cd4 (HEAD -> test_branch, tag: v2.0, origin/test_branch, origin/main, origin/HEAD, rename_branch, main) test patch again
848e4d9 test patch again
de2aaa1 update function statement

$ git checkout -b de2aaa1_branch de2aaa1  # 基于commit-hash创建分支并切换到该分支
Switched to a new branch 'de2aaa1_branch'

$ git branch -v
* de2aaa1_branch de2aaa1 update function statement
  main           dc06cd4 test patch again
  rename_branch  dc06cd4 test patch again
  test_branch    dc06cd4 test patch again
  v1.0_branch    88ddcf7 merge branch_test:Merge conflict in test.txt

29447@GW64 /d/myProject (main)
$ git branch --merged
  de2aaa1_branch
* main
  rename_branch
  test_branch
  v1.0_branch

29447@GW64 /d/myProject (main)
$ git branch --no-merged


3、合并分支

git merge <branch> # 合并指定分支到当前分支(对本地分支合并)

最好使用 git merge <branch> -m "备注信息",否则合并成功进入vim模式
git merge origin/main # 将远程分支origin/main合并到当前分支

git rebase <branch> # 衍合指定分支到当前分支

29447@GW64 /d/myProject (main)
$ git merge dev -m "merge dev branch"
Updating d17fa53..dc79c57
Fast-forward (no commit created; -m option ignored)
 dev.txt | 7 +++++++
 1 file changed, 7 insertions(+)
 create mode 100644 dev.txt

29447@GW64 /d/myProject (main)
$ git merge test -m "merge test branch"
Merge made by the 'ort' strategy.
 add.txt           | 1 +
 commit_update.txt | 2 +-
 test.txt          | 0
 3 files changed, 2 insertions(+), 1 deletion(-)
 create mode 100644 add.txt
 create mode 100644 test.txt

29447@GW64 /d/myProject (main)
$ git log --graph --online --since=1.hours.ago
fatal: unrecognized argument: --online

29447@GW64 /d/myProject (main)
$ git log --graph --oneline --since=1.hours.ago
*   cef3c4d (HEAD -> main) merge test branch
|\
| * 629c3fc (test) branch test add test.txt
* dc79c57 (dev) branch dev add dev.txt

29447@GW64 /d/myProject (main)
$ git pull origin main
From github.com:bai-cao/python_clone
 * branch            main       -> FETCH_HEAD
Already up to date.

29447@GW64 /d/myProject (main)
$ git push origin main
Enumerating objects: 12, done.
Counting objects: 100% (12/12), done.
Delta compression using up to 16 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (10/10), 1.07 KiB | 364.00 KiB/s, done.
Total 10 (delta 2), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (2/2), done.
To github.com:bai-cao/python_clone.git
   d17fa53..cef3c4d  main -> main

4、删除分支

git branch -d <branch> # 删除本地分支(可能删除失败)
git branch -D <branch> # 强制删除本地分支(未合并到主分支等)
git push origin --delete <branch> # 删除远程分支

$ git branch -a
  dev
* main
  test
  remotes/origin/HEAD -> origin/main
  remotes/origin/main

$ git branch -d dev
Deleted branch dev (was aad601a).

$ git branch -d test
Deleted branch test (was faaa7fc).

$ git branch -a
* main
  remotes/origin/HEAD -> origin/main
  remotes/origin/main
29447@GW64 /d/myProject (test_branch)
$ git branch -d test_branch # 当前使用的分支无法删除
error: cannot delete branch 'test_branch' used by worktree at 'D:/myProject'

29447@GW64 /d/myProject (test_branch)
$ git branch dev_branch

29447@GW64 /d/myProject (test_branch)
$ git checkout dev_branch
A       log.log
Switched to branch 'dev_branch'

29447@GW64 /d/myProject (dev_branch)
$ touch dev.txt

29447@GW64 /d/myProject (dev_branch)
$ git add .

29447@GW64 /d/myProject (dev_branch)
$ git commit -m "add dev.txt"
[dev_branch 62e1b59] add dev.txt
 2 files changed, 30 insertions(+)
 create mode 100644 dev.txt
 create mode 100644 log.log

29447@GW64 /d/myProject (dev_branch)
$ git checkout -
Switched to branch 'test_branch'
Your branch is ahead of 'origin/test_branch' by 8 commits.
  (use "git push" to publish your local commits)

29447@GW64 /d/myProject (test_branch)
$ git branch -d dev_branch  # 已提交但不曾合入其他分支可以删除
error: the branch 'dev_branch' is not fully merged
hint: If you are sure you want to delete it, run 'git branch -D dev_branch'
hint: Disable this message with "git config set advice.forceDeleteBranch false"

29447@GW64 /d/myProject (test_branch)
$ git merge dev_branch
Updating c4c9b7c..62e1b59
Fast-forward
 dev.txt |  0
 log.log | 30 ++++++++++++++++++++++++++++++
 2 files changed, 30 insertions(+)
 create mode 100644 dev.txt
 create mode 100644 log.log

29447@GW64 /d/myProject (test_branch)
$ git checkout -
Switched to branch 'dev_branch'

29447@GW64 /d/myProject (dev_branch)
$ touch dev2.txt

29447@GW64 /d/myProject (dev_branch)
$ git add dev2.txt

29447@GW64 /d/myProject (dev_branch)
$ git checkout -
A       dev2.txt
Switched to branch 'test_branch'
Your branch is ahead of 'origin/test_branch' by 9 commits.
  (use "git push" to publish your local commits)

29447@GW64 /d/myProject (test_branch)
$ git branch -d dev_branch   # 曾提交但曾合入其他分支可以删除
Deleted branch dev_branch (was 62e1b59).



6、参考

1、Git 分支管理
2、根据git的hash值创建分支
3、创建git tag,根据某个tag创建分支
4、Git详细教程(五):查看分支、创建分支、合并分支
5、Git – 管理分支
6、Git更新版本
7、git merge三种参数精简解释(fast-forward、--no-ff、--squash)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 学习笔记,非原创。谢谢 Git鼓励大量使用分支: 创建与合并分支 :查看分支:git branch创建分支:git...
    Rising_life阅读 858评论 0 1
  • 本地分支管理 创建和切换分支 创建分支 在本地终端运行git branch『分支名称』新建一个分支,如新建一个名为...
    小裴走世界阅读 506评论 0 0
  • 冲突合并 创建分支feature1分支,在feature1中修改readme文件,然后在分支中添加并提交, $gi...
    奋斗中的Kevin阅读 677评论 0 1
  • 当我们初始化Git仓库的时候,Git会默认创建一个名为master的主分支。在实际工作中,主分支要求是一个稳定、健...
    冰河winner阅读 464评论 0 5
  • 几乎所有的版本控制系统都以分支的方式进行操作,分支是独立于项目主线的一条支线,我们可以在不影响主线代码的情况下,在...
    skyyhu阅读 351评论 0 1