ljzsdut
GitHubToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeBack to homepage

02 Branch

什么是branch?

分支是一个有名字的指针,该指针指向某个commit。

image-20220409154621914

什么是HEAD?

HEAD是一个特殊的指针,该指针总是指向当前分支的最新的commit。

image-20220409172207711

[ Mac-mini:/Users/lijuzhang/test/git-demo ] git:(master)  ➜ cat .git/HEAD
ref: refs/heads/master
[ Mac-mini:/Users/lijuzhang/test/git-demo ] git:(master)  ➜ cat .git/refs/heads/master
916cedf33208cc0031d838fc942481ac11fd432b
[ Mac-mini:/Users/lijuzhang/test/git-demo ] git:(master)  ➜ git cat-file -t 916ced
commit
[ Mac-mini:/Users/lijuzhang/test/git-demo ] git:(master)  ➜ git cat-file -p 916ced
tree 6f1c48e7934b61a9eaecea3fe3c8832073ea0a7a
parent 61b3faa3de3bf8d11d6d4d811833cbf92151c1e6
author ljzsdut <lijuzhang@inspur.com> 1649489508 +0800
committer ljzsdut <lijuzhang@inspur.com> 1649489508 +0800

3rd commit

创建分支

git brach														#查看
git branch <branch_name> 						#创建
git branch -d|-D <branch_name> 			#删除,注意不能删除当前分支
git checkout <branch_name> 					#切换
git checkout -b <branch_name> 			#创建
[ Mac-mini:/Users/lijuzhang/test/git-demo ] git:(master)  ➜ git branch
* master 
(END)

[ Mac-mini:/Users/lijuzhang/test/git-demo ] git:(master)  ➜ git branch dev

[ Mac-mini:/Users/lijuzhang/test/git-demo ] git:(master)  ➜ tree .git/refs/heads
.git/refs/heads
├── dev
└── master

0 directories, 2 files

[ Mac-mini:/Users/lijuzhang/test/git-demo ] git:(master)  ➜ cat .git/refs/heads/dev
916cedf33208cc0031d838fc942481ac11fd432b

checkout

checkout切换分支的时候,分支本身没有发生变化,变化的只有HEAD指针,HEAD指针会执行branch的名字。此外,checkout也可以检出某一次commit,此时HEAD指针会直接指向commit,此时,可以在当前commit下使用git checkout -b <branch_name>基于当前commit创建分支,然后在该分支下进行后续的修改、提交等操作,否则无法进行commit操作。。

分支删除

删除分支时,只是将.git/refs/heads目录下的分支指针删除了,分支相关的object都存在。可以使用reflog找到误删分支的commit_id,然后将那次commit创建为分支,达到恢复分支的目的。

git diff

# git diff [<options>] [<commit> [<commit>]] [--] [<path>...]
git diff    #对比index区和工作区
git diff --cached  #对比索引区和本地代码仓库的区别

git diff  <commit>  # 对比commit与工作区
git diff  <commit> <commit>  #对比2次commit

git remote add

该命令会修改.git/config文件,添加remote相关的信息。

分支合并

ORIG_HEAD

merge操作后,会生成一个ORIG_HEAD文件,指向merge之前的HEAD,利用ORIG_HEAD可以实现merge回滚:git reset ORIG_HEAD

fast-forward

3 way merge

如下图,如果要合并分支bugfix的parent不是master分支的最新一次提交,此时merge就是”3 way merge “。

merge前:

image-20220410103606164

merge后:

image-20220410133320483

tag操作

创建tag

git tag <tag_name>  #创建tag,基于当前commit_id,即基于HEAD创建
git tag -a|--annotate <tag_name> -m <tag_message>  #注解tag
git tag -a|--annotate <tag_name> <commit_id> [-m <tag_message>] # 使用之前的commit_id创建注解tag 

说明:

普通tag不会创建object,只会在ref/tag目录下创建一个文件。

注解tag会在普通tag的基础上,再创建一个类型为tag的object,提交的message信息会保存在这个object中。

查看tag

git tag

删除tag

git tag -d <tag_name>

git fetch

1、从远程仓库上拉取本地仓库已经存在的分支上新的commit

2、从远程仓库上拉取本地仓库上没有的新的分支(默认只增不删,表示远程分支删除后,fetch时也不会删除本地的origin/xxx分支。如果fetch时要删除本地的远程分支,需要使用--prune选项)

FETCH_HEAD

记录了远程仓库上每个分支的commit对象。

# git remote show origin #会连接网络,查看远程仓库的信息
* remote origin
  Fetch URL: https://github.com/k8simg/k8simg.git
  Push  URL: https://github.com/k8simg/k8simg.git
  HEAD branch: master
  Remote branch:
    master tracked  #tracked表示远程仓库的分支已经与本地仓库的远程分支关联
  Local branch configured for 'git pull':
    master merges with remote master  #本地仓库分支与远程仓库分支的对应关系
  Local ref configured for 'git push':
    master pushes to master (fast-forwardable)


git branch -vv  #查看本地分支的详情,比如查看本地与远程仓库的提交差距。

git_hook

1655430508763

hook本质上是一个程序,比如shell脚本、python脚本。

git stash

git add .
git stash
...切换到其他分支进行工作,然后在切换回来....
git stash pop

git worktree

git worktree add ../tmp_worktree master  # 将master分支checkout到目录./tmp_worktree master下

git worktree list # 查看worktree列表
cd ../tmp_worktree master 
...切换到其他分支进行工作,然后在切换回来....
cd -

git worktree remove tmp_worktree