git 基础常用命令

简介
会把个人常用的命令贴出来,仅供参考,如有错误请评论或私信我更改
git下载

https://git-scm.com/download/win

撤销提交

# 撤销本地commit但保留修改内容(不保留修改内容用 --hard)
git reset --soft HEAD^

# 撤销上次提交(revert操作自动创建一个新的commit,该commit会撤销之前的commit所做的更改)
git revert HEAD
# 撤销某次commit提交
git revert [<commit>]

将某一分支(dev)的某一提交(xxxx)合并到另一分支(master)

# 首先切换到dev分支
git log
/*
commit c20bfac058786ab132a5f1ea954d5a8f11800fe4 (HEAD -> dev, origin/dev, origin/HEAD)
Author: test <xxxxxxxxx@qq.com>
Date:   Thu Jul 11 15:40:45 2024 +0800
    update .gitignore
*/
# 切换到master分支
git checkout master
# 将某一提交合并到当前分支
git cherry-pick c20bfac058786ab132a5f1ea954d5a8f11800fe4 
# 上传仓库
git push

下面都是拷贝的,上面是记录自己用到的命令

git配置

 # 查看所有的配置
git config --list

# 查看所有的配置以及它们所在的文件
git config --list --show-origin

# 查看 Git 的某一项配置
git config <key>

# 编辑 Git 配置文件
git config -e [--global]

# 编辑 Git 某一项配置
git config [--global] <key> <value>

# 删除某一项配置
git config [--global] --unset <key>
 
# 配置用户名和用户邮箱
git config --global user.name <用户名>
git config --global user.email <邮箱>

# 配置代理
$ git config --global http.proxy http://localhost:1080
$ git config --global https.proxy http://localhost:1080

git帮助

# 查看 Git 命令的综合手册
git help

# 查看与add有关的帮助
git add -h

创建/克隆 Git 仓库

# 在已存在目录中初始化仓库
git init

# 新建一个目录,将其初始化为 Git 仓库
git init <project-name>

# 克隆现有的仓库
git clone <url> [new-name]

暂存/跟踪

# 开始跟踪新文件/把已跟踪的文件放到暂存区/合并时把有冲突的文件标记为已解决状态
# (精确地将内容添加到下一次提交中)
git add <files>

# 添加当前目录的所有文件到暂存区
git add .

# 暂存文件特定部分(暂存补丁)(-p全称--patch)
git add -p

# 进入交互式暂存模式(-i全称--interactive)
git add -i

提交代码

# 提交(-m 指定提交信息,缺省则进入vim屏显模式)
git commit [-m <message>]

# 暂存并提交(-a 表示要进行 git add 操作)
git commit -a [-m <message>]

# 修补提交
# 用一个新的提交替换旧的提交;如果新提交代码没有变化,则修改提交信息;
# 每次修补提交都会修改哈希值
git commit --amend [-m <message>]

删除文件

# 删除
git rm <file>

# git rm <file>逆操作
git reset -- <file>
git checkout -- <file>
 
# 强制删除(用于删除之前修改过或已经放到暂存区的文件)
git rm -f <file>

# 从暂存区域移除,但仍保留在工作区域
git rm --cached <file>

重命名(移动文件)

# 移动文件
git mv <file> <new-file>

# 上面一条命令相当于以下三条命令
mv <file> <new-file>
git rm <file>
git add <new-file>

查看文件状态

# 检查当前文件状态
git status

# 以简短的方式,检查当前文件状态(-s全称--short)
git status -s

# 查看指定文件的状态
git status <pathspec>...

比较文件差异

# 比较工作区与暂存区文件的差异
git diff

# 比较暂存区与最后一次提交的文件差异(可使用cached或者staged)
git diff --cached

# 比较工作区与最后一次提交的文件差异
git diff HEAD

# 比较两次提交的差异
git diff <one-commit> <another-commit>

# 展示差异的简单统计(改动的文件数和行数)
git diff --stat

# 展示简短的统计(仅展示--stat最后一行)
git diff --shortstat

查看提交

# 查看当前分支提交历史
git log

# 以补丁的格式输出提交历史
git log -p

# 限制显示的数量
git log -3

# 显示简略的统计信息
git log --stat

# 显示--stat最后一行信息(更短的--stat)
git log --shortstat

# 以简写哈希值的一行一个提交的格式显示(用于浏览大量提交)
git log --oneline

# 以图表的格式显示所有提交历史情况(会形象显示分支分叉情况)
git log --oneline --decorate --graph --all

# 以指定的格式显示提交
git log --pretty=format:"%h - %an, %ar : %s"

# 常用的格式
# 选项 说明
# %H 提交对象(commit)的完整哈希字串
# %h 提交对象的简短哈希字串
# %T 树对象(tree)的完整哈希字串
# %t 树对象的简短哈希字串
# %P 父对象(parent)的完整哈希字串
# %p 父对象的简短哈希字串
# %an 作者(author)的名字
# %ae 作者的电子邮件地址
# %ad 作者修订日期(可以用 -date= 选项定制格式)
# %ar 作者修订日期,按多久以前的方式显示
# %cn 提交者(committer)的名字
# %ce 提交者的电子邮件地址
# %cd 提交日期
# %cr 提交日期,按多久以前的方式显示
# %s 提交说明
 
# 搜索添加/删除指定字符串的提交
git log -S <keyword>

# 搜索提交信息与指定模式匹配的提交
git log --grep <pattern>
 
# 显示指定路径文件修改的提交(建议加上--进行分开,避免与选项或修订范围混淆)
git log [--] <path>

# 显示整个提交历史,但跳过任何合并内容
git log --no-merges

# 查看某次提交(显示提交的元数据和内容变化)
git show <commit>

# 查看某个分支指向的提交
git show <branch>

# 查看当前HEAD指向的提交
git show HEAD
# 或者
git show

#查看HEAD在前五次所指向的提交
git show HEAD@{5}

# 查看某个提交的某个文件
git show <commit>:<file>
 
# 查看某个分支指向的 SHA-1
git rev-parse <branch>

# 查看一个分支有而另一个分支没有的提交
git log <not-branch>..<branch>
# 或者
git log ^<not-branch> <branch>
# 或者
git log <branch> --not <not-branch>

# 查看一些分支有而另一些分支没有的提交
git log <b1> <b2> <b3> --not <not-b4> <not-b5> <not-b6>
# 或者
git log <b1> <b2> <b4> ^<not-b4> ^<not-b5> ^<not-b6>
 
# 查看两分支彼此相对补集的并集的提交(查看两分支之一包含又不被两者同时包含的提交)
git log <one-branch>...<another-branch>

# git-log 常用的选项
# 选项 说明
# -(n) 仅显示最近的 n 条提交
# --since, --after 仅显示指定时间之后的提交。
# --until, --before 仅显示指定时间之前的提交。
# --author 仅显示指定作者相关的提交。
# --committer 仅显示指定提交者相关的提交。

撤销操作

# 复制暂存区的指定文件到工作区
git checkout -- <file>

# 以补丁的方式复制暂存区的指定文件到工作区(-p全称--patch)
git checkout <file> -p
 
# 把某个提交的指定文件复制到暂存区(省略<commit>则表示HEAD)(可以用来取消暂存)
git reset [<commit>] <file>
# 上面命令等同于
git restore --staged <file>

# 以补丁的方式把某个提交的指定文件复制到暂存区(-p全称--patch)(省略<commit>则表示HEAD)
git reset [<commit>] [<file>] -p

# 重置到HEAD第一个父提交(可以用来取消合并)
git reset HEAD~ --hard

# 重置到上一次HEAD指向的提交,可使用git reflog查看分支或其他引用在本地仓库的更新日志
git reset HEAD@{1} --hard

# 撤销推送
# 1. 重置到第一个父提交(取消合并)
git reset HEAD~ --hard
# 2. 强制推送(推送完,远程分支的最新提交记录被移除了)
git push -f

# 还原上一次提交
git revert HEAD

# 还原前两次提交
git revert HEAD HEAD~
 
# 还原合并(保留指定父提交,撤销另一个父提交)(-m全称--mainline)
# 保留第一父提交,撤销其他提交,创建一个新的提交对象
git revert -m 1 HEAD

远程仓库

# 显示所有远程仓库的简写
git remote

# 显示所有远程仓库的冗长一点的信息(简写和URL)(v全拼verbose,表示冗长的)
git remote -v

# 添加一个远程仓库
git remote add <short-name> <url>

# 获取远程引用的完整列表
git ls-remote <remote> 

# 显示某个远程仓库信息(需要联网)
git remote show <remote>

# 修改某个远程仓库的简写名
git remote rename <old-name> <new-name>

# 修改某个远程仓库的地址
git remote set-url <remote> <new-url>
 
# 移除一个远程仓库(rm全称remove)
git remote rm <remote>
 
# 下载远程仓库的所有变动(remote默认为origin)
git fetch [<remote>]

# 下载远程仓库的所有变动,同时删掉所有远端都已经不存在的跟踪分支
git fetch --prune [<remote>]

# 下载所有远程仓库的所有变动
git fetch --all

# 拉取远程仓库的变化,并与本地分支合并(fetch和merge的集合操作)(省略则表示当前分支)
git pull [<remote> <branch>]

# 推送指定分支到远程仓库
# 或者
git push <remote> refs/heads/<local-branch>:refs/heads/<remote-branch>
git push <remote>      heads/<local-branch>:refs/heads/<remote-branch>
git push <remote>            <local-branch>:refs/heads/<remote-branch>
# 或者
git push <remote> refs/heads/<local-branch>:<remote-branch>
git push <remote>      heads/<local-branch>:<remote-branch>
git push <remote>            <local-branch>:<remote-branch>
# 或者
git push <remote>            <branch>
# 或者(推送当前分支)
git push <remote>
# 或者(推送当前分支到上游分支,没设置上游分支则报错)
git push

# 推送并设置上游分支(-u全称--set-upstream)
git push -u <remote> <refspec>

# 将本地仓库镜像到远程仓库(包括但不限于refs/heads/, refs/remotes/和refs/tags/)
git push --mirror <remote>
 
# 推送所有分支到远程仓库(即refs/heads/下的refs)
git push --all <remote>

########## 删除远程分支

# 删除远程仓库的分支(-d全称--delete)
git push <remote> -d refs/heads/<remote-branch>
git push <remote> -d      heads/<remote-branch>
git push <remote> -d            <remote-branch>
# 或者
git push <remote> :refs/heads/<remote-branch>
git push <remote>      :heads/<remote-branch>
git push <remote>            :<remote-branch>

标签

# 列出所有标签
git tag

# 按通配符列出标签(-l全称--list)
git tag -l <通配符>

# 查看指定tag信息
git show <tag-name>

# 以较短形式查看指定tag信息
git show -s <tag-name>
 
# 创建附注标签(a指annotated)
git tag -a <tag-name> -m <message>

# 创建轻量标签
git tag <tag-name>

# 给指定的提交打标签
git tag -a <tag-name> <commit>

# 推送标签到远程仓库
git push [<remote>] <tag-name>

# 推送所有标签到远程仓库
git push [<remote>] --tags

# 删除本地标签
git tag -d <tag-name>

# 更新远程标签
git push <remote> :refs/tags/<tag-name>

# 删除远程标签
git push <remote> -d <tag-name>

# 基于指定标签创建并切换到该分支
git checkout -b <new-branch> <tag-name>

分支

# 查看本地所有分支列表
git branch

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

# 查看本地和远程所有分支的列表
git branch -a

# 查看每一个分支的最后一次提交
git branch [-a|-r] -v

# 查看每一个分支的最后一次提交及上游分支
git branch [-a|-r] -vv

# 查看HEAD所在的分支
git branch --contains HEAD

# 查看哪些分支已经合并到指定分支(不指定则当前)
git branch --merged [<branch>]

# 查看哪些分支还未合并到指定分支(不指定则当前)
git branch --no-merged [<branch>]

# 创建分支
git branch <new-branch>
 
# 基于指定的分支创建分支
git branch <new-branch> <branch>

# 基于指定的提交创建分支(可以作为 git reset --hard 的后悔药(使用git log或git reflog查找提交的id))
git branch <new-branch> <commit>

# 切换分支
git checkout <branch>

# 创建并切换分支
git checkout -b <new-branch>

# 重命名本地分支
git branch -m <old-branch-name> <new-branch-name>
 
# 检出远程分支
# 本地不存在此分支,远程存在
git checkout <remote-branch>
# 或者
git checkout --track <remote>/<remote-branch>
# 或者(可以取别名)
git checkout -b <branch> <remote>/<remote-branch>
# 或者(和上面一样,但只检出不切换)
git branch <branch> <remote>/<remote-branch>

# 设置/修改上游分支(-u全称--set-upstream-to)
#(注意:此命令不会联网,如果要设置为远程新建的分支,而又没有通过fetch获取远程数据,则会提示分支不存在)
git branch -u <remote>/<remote-branch>

分支合并

# 合并指定分支到当前分支
git merge <branch>

# 合并没有共同祖先的历史
git merge <branch> --allow-unrelated-histories

分支删除

# 删除本地分支
git branch -d <branch>

# 强制删除本地分支(如果要删除的分支包含还未合并的工作,-d会删除失败,此时可以使用-D来强制删除)
git branch -D <branch>
 
# 删除本地远程分支
git branch -dr <remote>/<remote-branch>

变基

# 将当前分支变基到指定分支
git rebase <newbase>

# 设置指定的上游分支进行变基
git rebase -onto <newbase> <upstream> <branch>

贮藏

# 贮藏文件(已修改和暂存的文件)
git stash [push]

# 查看所有贮藏
git stash list

# 查看指定贮藏(不指定则最近)
git stash show [stash@{<n>}]

# 应用指定贮藏(不指定则最近)
git stash apply [stash@{<n>}]
 
# 移除指定贮藏(不指定则最近)
git stash drop [stash@{<n>}]

# 应用并移除指定贮藏(不指定则最近)
git stash pop [stash@{<n>}]

# 贮藏文件并把他们保留在暂存区
git stash --keep-index

# 贮藏已跟踪、未跟踪的文件(-u全称--include-untracked)
git stash -u

# 贮藏已跟踪、未跟踪、忽略的文件(-a全称--all)
git stash -a

# 交互式贮藏(-p全称--patch)
git stash -p

# 从贮藏创建一个分支
git stash branch <new-branch>

清理

# 删除未跟踪的文件
git clean

# 删除未跟踪的文件和空的子目录
git clean -d

# 删除未跟踪的文件,当 clean.requireForce 设为 true 时(-f全称--force)
git clean -f

# 删除未跟踪和忽略的文件
git clean -x
 
# 演示将要清理的文件和目录(-n全称--dry-run)
git clean -d -n

祖先引用

# 查看第一父提交
git show <commit>^

# 查看第二父提交(合并提交可以有多个父提交)
git show <commit>^2

# 查看第一父提交(和【git show <commit>^】等价)
git show <commit>~

# 查看第一父提交的第一父提交
git show <commit>~2
# 或者
git show <commit>~~

# 查看第一父提交的第一父提交的第一父提交
#(~后面没数字表示一个,数字多大表示多少个,0则表示当前引用)
git show <commit>~3
# 或者
git show <commit>~~~
# 或者混用~和数字
git show <commit>~2~

底层命令

# 从文件创建仓库对象
git hash-object -w <file>

# 输出仓库对象的内容或详细信息
git cat-file [选项] <object>
# 常用的选项有:
# -p 打印出对象内容
# -t 显示对象类型
# -s 显示对象大小
# -e 检查对象是否存在(不输出内容表示存在)

# 打印master分支最新提交指向的树对象
git cat-file -p master^{tree}

# 把文件添加到暂存区
git update-index --add <file>
# 例如,暂存.vscode目录文件:git update-index --add .vscode/*

# 从暂存区中删除文件,如果文件在工作目录存在则不删除
git update-index --remove <file>

# 从暂存区中删除文件,即使文件在工作目录存在
git update-index --force-remove <file>

# 从当前索引创建一个树对象
git write-tree

# 将树对象读取到暂存区中
git read-tree <tree-object>

# 将树对象作为一个子树读取到暂存区
git read-tree --prefix=<目录名> <tree-object>

# 创建一个提交对象
git commit-tree <tree-object> -m <提交信息>

# 创建一个提交对象,同时指定它的父提交对象
git commit-tree <tree-object> -m <提交信息> -p <parent-commit-object>

# 更新 ref 的对象名(如果没有此 ref 则创建)
git update-ref <ref> <object>
# 例如,更新 master 对象名:git update-ref refs/heads/master cac0cab
# 例如,更新 HEAD 的对象名:git update-ref HEAD cac0cab

# 查看 HEAD 指向的ref
git symbolic-ref HEAD

# 修改 HEAD 指向的ref
git symbolic-ref HEAD refs/heads/test

# 创建一个轻量标签
git update-ref refs/tags/v1.0 <commit>

# 统计未打包的对象数量及其磁盘消耗
git count-objects -vH
 
# 清理不必要的文件并优化本地存储库
git gc

# 立刻清理不必要的文件并优化本地存储库
git gc --prune=now

# 显示索引和工作树中有关文件的信息
git ls-files
# 常用选项
# -z: \0输出行终止,不引用文件名
# -c[--cached]: 在输出中显示缓存的文件(默认)
# -d[--deleted]: 在输出中显示已删除的文件
# -m[--modified]: 在输出中显示已修改的文件
# -o[--others]: 在输出中显示其他(即未跟踪)文件
# -i[--ignored]: 仅显示输出中的忽略文件
# -s[--stage]: 在输出中显示暂存内容的模式位,对象名称和阶段编号

# 查看列出的文件的总大小
git ls-files -z | xargs -0 du -ch | grep total$

# 查看树对象的内容
git ls-tree -r <commit>

删除大文件

# 查看git仓库大小
git ls-files -z | xargs -0 du -ch | grep total$

# 查找整个提交树中超过指定大小的文件(将<size>改为你想要的大小,单位字节)
git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | awk '$3 >= <size> {print}' 

# 删除文件(将<path>改为你想要的文件路径)
git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch <path>' --prune-empty --tag-name-filter cat -- --all

# 推送到远程仓库
git push origin --force --all

# 清除缓存
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now

git flow命令

# 使用git flow初始化仓库
git flow init -d
 
# 查看git flow版本
git flow version

# 功能分支列表
git flow feature list

# 建立新的功能分支
git flow feature start <new-branch-name> <start-at-branch-name>

# 完成功能分支
git flow feature finish <branch-name>

系统相关命令

# 输出字符串到文件(文件不存在会创建)
echo <string> > <file>

# 编辑/创建文件(没有就创建)
# i切换为编辑模式,esc切换为命令模式;命令模式下,输入冒号后接命令:
# q:退出(有修改文件会警告),q!:不保存退出,x:保存退出
vim <file>

# 连接文件并打印到标准输出设备上(查看文件内容)
cat <file>

# 在指定目录下查找文件和目录
find <路径> [选项]

.gitignore

规则

 - 所有空行或者以 # 开头的行都会被 Git 忽略。
 - 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
 - 匹配模式可以以(/)开头防止递归。
 - 匹配模式可以以(/)结尾指定目录。
 - 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。

glob

glob 模式是指 shell 所使用的简化了的正则表达式。glob通常用匹配目录或文件。

- 星号(*)匹配零个或多个任意字符;
- [abc] 匹配任何一个列在方括号中的字符;
- 问号(?)只匹配一个任意字符;
- 如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字);
- 使用两个星号(**)表示匹配任意中间目录,比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等。

常见问题

- 问题:配置好了SSH公钥,但是推送代码时还是需要账号密码;
- 原因:远程URL使用了HTTPS协议;
- 解决:将远程URL设置为SSH协议,例如:git remote set-url origin git@github.com:[username]/[repository].git
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值