常用的 Git 命令

查看历史


# 每个提交在一行内显示
git log --oneline

# 在所有提交日志中搜索包含「homepage」的提交
git log --all --grep='homepage'

git log --grep="homepage"

# 获取某人的提交日志
git log --author="tanyinping"

# 查看今日的提交
git log --since="0 am"

# 获取所有的操作历史,包括被删除的
git reflog

重置本地仓库


git fetch origin

git checkout master

# 重置本地仓库,将本地仓库的内容恢复到和远程仓库一样
git reset --hard origin/master

操作分支

查看分支

git branch -v

# 分支信息更加详细,可以看到分支是 origin 或 upstream
git branch -vv

# 查看本地和远程分支
git branch -a

# 查看所有远程分支
git branch -r

新建分支

# 新建分支
git checkout -b books

# 新建分支并切换到该分支
git push origin books

删除分支

# 删除本地分支
git branch -d books

# 删除没有被合并的分支要用 -D
git branch -D books

# 删除远程分支
git push origin -d books

合并分支

develop 合入 master

# 拉取远程 develop 分支
git pull origin develop

# 切换到 master 分支
git checkout master

# 拉取远程 master 分支
git pull origin master

# 将 develop 分支合入 master 分支
git merge develop

# 将 master 分支推送到远程
git push origin master

# 切换到 develop 分支
git checkout develop

重命名分支

# 重命名本地分支
git branch -m books books2

# 重命名远程分支
git push origin :books books2

git push origin -u books2

提交代码

# 查看当前状态
git status

# 提交代码
git commit –a –m ""
git commit –am ""

# 修改commit信息
git commit --amend -m "add new file"
git commit --amend # 直接编辑提交记录

# 清除当前目录下所有没add的修改
git checkout .
git checkout -- <file>

# git format-patch 对某次提交生成patch,方便发送给其他人员进行参考或者同步
git format-patch -n HEAD^ # 生成path
git am *.patch # 同步path
git am --abort # 恢复原状

# git commit之后,想撤销 commit,撤回后保留更改
git reset --soft HEAD^

# git commit之后,想撤销 commit,撤回后不保留更改
git log --oneline
git reset --hard HEAD^

git reset --hard HEAD@{4}
git reset --hard <commitHash>

git push -f 删除远程
# HEAD^的意思是上一个版本,也可以写成HEAD~1。如果你进行了 2 次 commit,
# 想都撤回,可以使用HEAD~2
# --soft:不删除工作空间改动代码,撤销 commit,不撤销git add .
# --hard:删除工作空间改动代码,撤销 commit,撤销git add .,
# 注意完成这个操作后,就恢复到了上一次的 commit 状态。


# revert 针对某一次commit的反向操作,会生成一次空的commit
git revert -n <commitHash>

切换到之前分支

git checkout -

拉取和推送

# 拉取 remote origin 对应的远程仓库的 master 分支合并到本地的 test 分支
git pull origin master:test

# 不获取tags
git fetch --no-tags
git config remote origin.tagOpt --no-tags

注意: pull 和 fetch 拉去新的更新,区别是 pull 会和当前分支合并,fetch 不会

# 推送并设置默认远程分支
git push -u origin master

# 强制推送,就算本地和远程有差异也推上去
git push -f origin master

# 删除远程主机的 develop 分支
git push origin -d develop

标签

# 列出所有标签
git tag

# 列出所有标签,按时间排序
git tag -l -n1 --sort=-v:refname

# 打标签
git tag -a v1.0 -m "my version 1.0"

# 推送标签到远程
git push origin v1.0

# 追加标签
git tag -a v0.9 85fc7e7

暂存

# 暂存当前修改
git stash

# 查看暂存列表
git stash list

# 弹出暂存
git stash pop

# 清空暂存
git stash clear


# 保存所有正在追踪的文件
git stash save "日志信息"

# 获取并删除暂存项
git stash pop stash@{1}

# 获取暂存项
git stash apply stash@{1}

# 删除暂存项
git stash drop stash@{1}

获取上游代码

git remote -v

# 添加上游代码
git remote add <remote name> <url>
git remote add upstream https://github.com/xxx/xxx.git

# 从远程存储库中获取更改,但不和本地的合并
git fetch upstream

# 从特定分支获取更改
git fetch <remote name> <branch name>

# 从远程存储库中获取更改,并与本地的合并
git merge upstream/master

# 删除远程仓库
git remote rm <remote name>

# 重命名远程仓库
git remote rename <old name> <new name>


# 修改 url
git remote set-url -add <remote name> <url>
git remote set-url --add github https:/xxxx.git

清理

# 移除远程仓库上不存在的分支
git fetch -p

cherry-pick

# 经常需要从一个分支选择性的合并 commit 到另一个分支,可使用 cherry-pick 实现:
# 从其他分支获取提交
git cherry-pick <commitHash>

#  转移多个提交
git cherry-pick <commitHash> <commitHash>

# 从其他分支获取多个提交
git cherry-pick <commitHash>..<commitHash>

# 从其他分支获取多个提交
git cherry-pick <commitHash>^..<commitHash>

代码冲突

用户解决代码冲突后,第一步将修改的文件重新加入暂存区(git add .),第二步使用下面的命令,让 Cherry pick 过程继续执行

git cherry-pick --continue

# --abort 发生代码冲突后,放弃合并,回到操作前的样子
# --quit 发生代码冲突后,退出 Cherry pick,但是不回到操作前的样子

创建项目

# 第一次配置
git config --global user.name "xxx"
git config --global user.email "xxx@qq.com"

# 克隆某个项目
git clone ssh://git@code.xxxxxx.git

# 如果代码已经准备好推送到仓库,请在终端中执行该命令
git init
git add .
git commit -m "first commit"
git remote add origin ssh://git@code.xxxxxx.git
git push -u origin master

# 如果你的代码已经由 Git 跟踪,然后设置这个仓库作为你的 origin 推送
git remote set-url origin ssh://git@code.xxxx.git
git push -u origin master
git push origin --tags

其他

# 统计项目
git shortlog -sn

#  强制推送
git push -f  git@github.com:xxx/xxx.git master:gh-pages

# pull 根据不同的配置,可等于 fetch + merge 或 fetch + rebase

vim 基本操作

vim 打开默认是不能输入的,要按 a 或者 i 进入编辑模式,输入完成后,再按 Esc 退出编辑模式,这时左下角会有输入框,输入如下英文字符,注意冒号别打成中文字符,回车即可退出 vim 回到终端。git log后,无法退出时,也可以使用下面的退出

# :wq 保存并退出
# :q! 不保存退出
# :wq! 强制保存并退出
# :q 退出
# :w 保存
# :w! 强制保存

提交格式

# feat:新功能
# fix:修补bug
# docs:文档(documentation)
# style: 格式(不影响代码运行的变动)
# refactor:重构(即不是新增功能,也不是修改bug的代码变动)
# test:增加测试
# chore:构建过程或辅助工具的变动
# perf:性能优化
# revert:回滚
# merge:合并
# sync:同步主线或分支的Bug
# build:构建系统或外部依赖的变动
# ci:CI 配置文件和脚本的变动
# release:发布新版本
# workflow:工作流改进

图文

git

参考资料