使用分支意味着,从开发主线上分离开来,然后在不影响主线的同时继续工作
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)