git常用命令
常用命令
注意:以下操作都是针对当前分支的操作
# 克隆远程仓库
git clone <repo>
# 使当前文件夹变成一个git仓库
git init
# 查看修改
git status
# 查看修改对比
git diff <file>
git diff
# 查看分支,不加`-a`只查看本地分支,加了`-a`查看所有分支
git branch <-a>
# 切换分支
git checkout <branch>
# 缓存当前HEAD工作区的改变(关于HEAD后面会说明)
git stash
# 应用最新缓存改变,当前的HEAD应该与缓存改变时相同
git stash pop
# 撤销工作区的修改
git checkout <file>
git checkout .
# 将工作区的修改加入暂存区
git add <file>
git add .
# 取消暂存
git reset HEAD <file>
git reset HEAD .
# 提交暂存区的修改至版本库
git commit -m "<这是备注信息>"
# 发送已提交的修改至远程仓库
git push
# 拉取
git pull
# 查看日志
git log
# 回滚至某次提交(revert、reset具体看后面)
git revert <commit>
git reset --hard <commit>
clone
# 克隆某远端仓库,dir为本地的文件夹(默认为仓库名)
git clone <repo> [<dir>]
# 克隆某仓库的某分支
git clone -b <branch> <repo> [<dir>]
# 子库递归循环克隆
git clone --recursive <repo> [<dir>]
branch
# 切换到某个分支/tag
git checkout <branch|tag>
# 保存当前分支的修改
git stash
# 创建分支
git checkout -b <branch>
# 删除本地分支
git branch -d <branch>
# 合并分支到当前分支
git merge <branch>
# 删除远程分支
git push origin --delete <remote branch>
# push,远端已有此分支,但未和本地分支关联
git push -u origin/<remote branch>
git push -u origin <remote branch>
# push,远程没有此分支
git push origin <branch>:<remote branch>
stash
# 缓存当前HEAD工作区的改变
git stash
# 查看缓存的改变,默认n等于0(即最新改变)
git stash show [<stash@{n}>]
# 应用缓存改变,默认n等于0(即最新改变),当前的HEAD应该与缓存改变时相同
git stash pop [<stash@{n}>]
# 查看缓存改变的列表
git stash list
# 清空缓存改变列表
git stash clear
tag
# 查看所有标签
git tag
# 查看符合检索条件的标签
git tag -l 1.*.*
# 切换到某个标签
git checkout <tag>
# 创建轻量标签
git tag 1.0.0-light
# 创建带备注标签(推荐)
git tag -a <tag> -m "这是备注信息"
# 针对特定commit版本SHA创建标签
git tag -a <tag> <commit> -m "这是备注信息"
# 删除本地标签
git tag -d <tag>
# 删除远程仓库标签
git push origin --delete <tag>
# 发送所有本地标签至远程仓库
git push origin --tags
# 发送某本地标签至远程仓库
git push origin <tag>
submodule
注意:使用了submodule
会在.git
文件夹的同级生成一个.gitmodules
的文件
# 递归的方式克隆整个项目
git clone <repo> --recursive
# 添加子模块
git submodule add <dir path> <submodule path>
# 初始化子模块
git submodule init
# 更新子模块
git submodule update [--init] [--recursive]
# 拉取所有子模块
git submodule foreach git pull 拉取所有子模块
- 示例
# 克隆RepoA
git clone xxx.git RepoA
# 进去RepoA文件夹
cd RepoA
# 添加ModuleA子模块
git submodule add ModuleA xxx.git
# 在libs文件夹下添加libA子模块
git submodule add libs/libA xxx.git
# 此时RepoA文件夹下会生成一个.gitmodules的文件,用于保存子模块信息
cat .gitmodules
[submodule "ModuleA"]
path = ModuleA
url = xxx.git
[submodule "libs/libA"]
path = libs/libA
url = xxx.git
remote
注意:GitHub
的fork
使用,其实就是upstream
的使用
# 查看远程仓库信息
git remote -v
# 添加origin/上游仓库
git remote add origin|upstream <repo>
# 移除origin/上游仓库
git remote remove origin|upstream
# 抓取上游仓库的修改
git fetch upstream
# 合并上游仓库分支到本地分支
git merge upstream/<branch>
reset
reset
:指将版本库中指针指到指定commit
,且之前的commit
会从git log
中删除,但在git reflog
中能看到
git reset <--hard|soft|mixed|merge|keep> <commit|HEAD>
--hard
:回退版本库,暂存区,工作区(因此我们修改过的代码就没了,需要谨慎使用)--soft
:只回退版本库--mixed
:回退版本库,暂存区;工作区不做改变(git reset
的默认参数)--merge
:感觉和--hard
差不多--keep
:感觉和--mixed
差不多HEAD
:指的是版本库的最后一次commit
^
:用于commit
后面,指的是指定commit
的前一次commit
,e.g.:
git reset HEAD^
git reset <commit>^
# 指定commit的后两次commit
git reset <commit>^^
- 取消暂存,实质就是将暂存区回退至版本库最后一次
commit
的状态(git add
的逆向操作)
git reset HEAD <file>
git reset HEAD .
- 错误提交后的回滚一般使用:
git reset --hard <commit>
reset
之后发送到远程仓库需要加-f
选项,强制push
(很多项目的master
会禁止强制发送):git push -f
git push -f
的补救之法:git reflog
- 修改的文件已被
git commit
,但想再次修改不再产生新的commit
git add sample.txt
# 修改最后一次commit
git commit --amend -m "说明"
revert
revert
:是放弃指定commit
,但是会生成一次新的commit
,需要填写提交注释,不会从git log
中删除之前的commit
- 错误提交后的回滚一般使用:
git revert <commit>