leocll

.

git常用命令

关于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

注意GitHubfork使用,其实就是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>

patch

生成/应用

posted @ 2019-06-20 18:27  leocll  阅读(307)  评论(0编辑  收藏  举报