Git基础
安装git¶
网址https://git-scm.com/downloads上安装 安装之后要设置自身全局配置
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
创建版本库¶
初始化一个git仓库
git init
git add <file>
分支管理¶
可视化教程参考git分支管理教程
本地¶
status¶
查看工作区状态
git status
commit¶
# git commit 命令会在本地新生成一个节点
git commit
# 使用amend参数可以修改最近的提交
git commit --amend
branch¶
分支相当于节点指针
# 生成新分支
git branch newbranch
# 切换到另一个分支
# 也可以使用 git checkout newbranch
# -b可以缺省新建分支
git switch newbranch
# 可以使用-f参数强制修改branch指向的节点
git branch -f main HEAD~4
# 可以使用-u参数设置本地分支和远程分支的跟踪
merge¶
# 合并其他分支
git merge newbranch
rebase¶
# 变基到其他分支上完成合并
git rebase newbranch
# -i 可以互动选取变基时可选的提交节点,由此可以实现cherry-pick效果
git rebase HEAD~4
checkout¶
checkout可以让你的工作区在各个结点之间自由移动
# 使用哈希值
git checkout commit_id
# 使用分支名
git checkout newbranch
# 使用相对引用
git checkout main^ # 或者git checkout main~1
reset和revert¶
- reset:可以撤销节点回到历史上任何一个节点,撤销后的节点相当于不存在
- revert:可以撤销某个提交,产生一个新的节点
git reset commit_id git revert commit_id
cherry-pick¶
cherry-pick可以将某些提交放在当前节点的下面
git cherry-pick commit_id_1 commit_id_2
tag¶
对于一些特殊的提交节点(特定的版本)可以使用tag打标签
git tag v0 commit_id # commit_id可选,默认为HEAD节点
describe¶
使用describe命名可以查看到当前或指定节点到最近tag的距离
# 下述命令输出:v0_2_commit_id
# v0为最近tag;2为当前节点到最近tag的距离;commit_id为当前的提交节点hash
# 可以跟指定节点替代当前节点:git describe main
git describe
远程¶
远程仓库相当于本地仓库的拷贝,在本地远程分支的名字是<remote name>/<branch name>
,<remote name>
默认为origin
clone¶
# 使用clone可以将远程的代码拷贝到本地
git clone url # url使用http://协议或这git://协议
fetch¶
fetch命令用于从远程仓库获取数据,但是并没有修改本地文件
# 下述命令完成了仅有的两个步骤:
# 1. 从远程仓库下载本地仓库中缺失的提交记录
# 2. 更新远程分支指针
# 如果没有参数,更新所有远程分支
git fetch
# 不在乎当前分支,指定fetch分支(本地分支和远程分支相同,但是本地分支位置不变,只是origin/main改变)
git fetch origin main
# 当本地分支和远程分支不同时也可以指定fetch分支,但是本地分支不能是当前分支
git fetch origin <origin>:<local>
# 当origin参数位置为空时在本地创建一个分支
git fetch origin :<local>
pull¶
pull相当于将fetch和merge/rebase两个步骤合为一个步骤
# 默认pull是先fetch再merge,可以使用rebase参数做修改
git pull
git pull --rebase
# git pull的其他参数都是fetch+merge形式,其中merge是在当前分支下merge
push¶
push是将本地的提交更新到远程仓库中
git push
# 不在乎当前分支,指定push分支(本地分支和远程分支相同)
git push origin main
# 当本地分支和远程分支不同时也可以指定push分支
git push origin <source>:<destination>
# 当source为空时会删除远程分支
git push origin :<destination>
remote tracking¶
使用clone之后本地分支和远程分支默认建立连接,使用git push和git pull自动指向对应的分支 使用下述命令可以建立连接
git checkout -b side origin/main # 本地side和origin/main建立连接
git commit --amend
时光穿梭¶
版本回退¶
查看工作区状态
git status
git diff
git log
reset¶
HEAD指向的是当前的版本,使用命令指向历史的版本
git reset --hard commit_id
#根据commit_id回退到指定版本
git reset HEAD^
#将版本库回退一个版本,一个^一个版本
git reset HEAD~n
#将版本库回退n个版本
此外:git reset HEAD filename 回退文件,将文件从暂存区回退到工作区,不能使用参数
reflog¶
重返未来则用命令
git reflog
#查看所有分支的操作记录之后使用git reset --hard commit_id命令回到原来的版本
Git stash用法¶
Git stash用于将未提交的修改保存起来,用于后续恢复当前工作目录
git stash save "stash_name"
#给每一个stash加一个message,用于记录版本
git stash pop
#or git stash apply
#恢复最新缓存的工作目录(第一个),并删除缓存堆栈中的哪个stash(pop删除但是apply不删除)
git stash list
#查看所有的stash,在使用git stash之前使用,默认是第一个
git stash drop
#移除最新的stash,后边也可以跟指定的stash的名字
工作区和暂存区¶
工作区git add到暂存区,然后git commit到本地仓库
管理修改¶
只有git add之后才能git commit到本地仓库 查看工作区和版本库里最新版本的区别:
git diff HEAD --<file>
撤销修改¶
场景1:当改乱工作区的文件内容后,要丢弃修改
git checkout --file
git reset HEAD <file>
删除文件¶
先rm file删除工作区文件,在使用命令删除本地仓库文件
git rm file
git commit -m "remove file"
git checkout -- file
#从版本库中拉取
git checkout --hard HEAD
#从版本库中拉取,撤销所有的更改
远程仓库¶
添加远程库¶
首先创建ssh key
ssh-keygen -t rsa -C "youremail@example"
git remote add origin git@server-name:path/repo-name.git
git push -u origin master
git remote
从远端库克隆¶
与远程库建立关联后可以直接git clone
git clone git@server-name:path/repo-name.git
分支管理¶
Feature分支¶
切回dev分支
git switch dev
git branch -D feature-vulcan
多人协作¶
查看远程库信息
git remote
git remote -v
推送分支¶
git push <远程主机名> <本地分支名>:<远程分支名>
git push origin master
#将本地的master分支推送到origin主机的master分支,如果master不存在则会被新建
git push origin :master
#等同于git push origin --delete master,表示删除指定的远程分支
git push origin
#如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可省略
git push
#如果当前分支和多个主机存在追踪关系,可以使用使用git push -u origin master指定一个默认主机,之后就可以直接使用git push
抓取分支¶
git clone [email protected]:username/reporstoryname.git
git checkout -b dev origin/dev
git pull <远程主机名> <远程分支名>:<本地分支名>
git pull origin master:test
#将远程的master分支和本地的test分支合并
git pull origin master
#默认和当前分支合并
git branch --set-upstream-to=origin/dev dev
git pull
标签管理¶
创建标签¶
切换到本分支
git tag v1.0
git log --pretty=oneline --abbrev-commit
git tag v0.9 f52c633
git show v0.9
git tag -a v0.1 -m "version 0.1 released" 1094adb
操作标签¶
删除标签
git tag -d v1.0
git push origin v1.0
git push origin --tags
git tag -d v0.9
git push origin :refs/tags/v0.9