Git 常用操作
-
git help
- 用于显示有关
Git
的帮助信息 - 如果没加任何选项,会显示
Git
命令的概要和最常用的Git
命令列表 - 可以加
-a
或—all
选项,显示所有可用的命令 - 可以在后面加某个
Git
命令,显示该命令的详细用法,可以通过方向键滚动,输入q
退出
- 用于显示有关
-
git config
- 用于获取并设置存储库或全局选项,包括
Git
的外观和操作各个方面的设置,比如配置默认编辑器、比较工具以及检查配置等 - 其中最常用的是配置用户名和邮箱,安装完
Git
后首先要做的就是设置用户名的邮箱,因为每次提交都需要用到这两个信息,命令分别为git config —global user.name "<username>"
和git config —global user.email "<email>"
(其中—global
选项表示是全局配置,在所有项目中都会提交这个用户名和邮箱,如果希望在某个特定的项目中使用不同的用户名和密码,可以在这个项目中再使用一次该命令而不加—global
选项) - 可以使用
git config (—global) —list
查看配置
- 用于获取并设置存储库或全局选项,包括
-
git init
- 用于在本地创建一个空的
Git
仓库,初始化工作区
- 用于在本地创建一个空的
-
git clone
- 用于将远程版本库克隆到本地目录下,支持多种协议,包括
HTTP
,HTTPS
,SSH
,Git
等
- 用于将远程版本库克隆到本地目录下,支持多种协议,包括
-
git remote
- 用于管理远程分支
- 直接使用
git remote
会列出所有远程仓库的名字,使用git remote -v
会列出远程仓库的名字和URL
,使用git remote show <远程仓库名>
会显示该远程仓库的详细信息 - 可以用
git remote add <仓库名> <url>
关联远程仓库,如果是新项目的话配合git init
实际上与git clone
效果一样
-
git status
- 用户显示工作目录和暂存区的状态
- 使用该命令会显示三类信息:
Changes to be committed
已经在暂存区,等待添加到HEAD中的文件Changes not staged for commit
有修改但是没有被添加到暂存区的文件Untracked files
没有被追踪的文件
.gitignore
中要忽略的文件虽然也属于Untracked files
,但不会显示- 加上
-s
选项可以显示简单信息
-
git diff
- 用于比较两个版本的差异,可以通过方向键滚动,输入
q
退出 - 常用的选项有:
git diff
不加参数即默认比较工作区与暂存区git diff —cached
比较暂存区与最新本地版本库(本地库中最近一次commit
的内容)git diff HEAD
比较工作区与最新本地版本库git diff <commit-id>
比较工作区与指定commit
的差异git diff --cached <commit-id>
比较暂存区与指定commit
的差异git diff <commit-id> <commit-id>
比较两个commit
之间的差异
- 用于比较两个版本的差异,可以通过方向键滚动,输入
-
git add
- 用于将工作区的修改添加到暂存区
- 基本用法是
git add <path>
,可以将<path>
(文件或者目录)中修改的、新增的(不包括已删除的)文件添加到索引库 - 三个常用的容易混淆的指令:
git add .
只提交被修改的和新增的文件git add -u
只提交被修改的和被删除的文件(u
表示update
)git add -A
提交被修改的、被删除的和新增的文件(A
表示all
)
- 默认不会添加被忽略的文件,可以加
-f
选项添加被忽略的文件
-
git rm
- 用于从工作区和暂存区中删除文件
- 加上
—cached
选项则只删除暂存区中的文件,而不会从工作区中删除文件,即该文件不会进行版本控制,实际上还是在工作目录下 - 加上
-r
选项表示删除文件夹 - 与
rm
命令的区别:git rm <filename>
不仅会删除文件,还会将这个删除操作记录下来,git commit
的时候会把这个操作提交上去,这样版本库就会知道该文件被删除了rm <filename>
只会删除物理文件,而没有将其从版本库中剔除,这时候使用git status
就会告诉你deleted: <filename>
,这时候有两种情况:- 如果你确实要从版本库中删除该文件,那就再调用
git rm
删除该文件,然后git commit -m <message>
提交,或者直接使用git commit -am <message>
,这样也会将该删除操作提交上去 - 如果是误删了,因为版本库里还有,所以可以使用
git checkout — <filename>
获取版本库里的最新版本,但是未提交到版本库的修改就无法恢复了,而且不适应于没有加入到版本库的文件
- 如果你确实要从版本库中删除该文件,那就再调用
-
git commit
- 用于将暂存区的修改提交到版本库,提交中会包含
HEAD
的当前内容与描述更改的用户和日志消息,每次提交会生成一个40
位的哈希值,作为commit-id
,相当于一个快照 - 基本用法是
git commit -m <message>
,使用-m
选项直接在后面输入提交说明,提交说明是必须的,如果不加-m
,会弹出一个文本编辑器来给你输入,想输入多行说明时可以这样用 git commit -a
会将所有已跟踪文件中的被修改或被删除的文件都提交到版本库,即使他们没有被add
到暂存区,一般不推荐git commit —amend
会使用与当前提交节点相同的父节点进行一次提交,即不会产生新的commit-id
,旧的提交会被取消(或者理解为合并),可以叫做追加提交或者增补提交,常用于修改提交说明
- 用于将暂存区的修改提交到版本库,提交中会包含
-
git reset
- 用于将当前
HEAD
复位到指定状态,一般用于撤销某些操作 <HEAD>
的写法有几种,HEAD
表示最新的提交节点,HEAD^
表示前一次的提交节点,HEAD~n
表示前n
次的提交节点,HEAD@{n}
表示前n
次的提交节点;也可以用<comment-id>
回退到某个commit
(可以用git reflog
查看提交记录)- 常用的选项:
git reset --soft HEAD^
将最近一次提交节点的提交记录回退到暂存区git reset --mixed HEAD^
将最近一次提交节点的提交记录回退到工作区git reset --hard HEAD^
将最近一次提交节点的提交记录全部清除
- 用于将当前
-
git checkout
- 用于切换分支或恢复工作树的文件(因为会重写工作区,要慎用)
- 最常用的是
git checkout <branch name>
切换分支,加上-b
选项可以新建分支并切换到新分支 - 除此之外还可以用暂存区或者指定提交的内容覆盖工作区内容:
- 用暂存区内容覆盖工作区内容:
git checkout <file name>
如果有多个文件用空格隔开,更稳妥的写法是git checkout — <file name>
,因为当有同名的分支和文件时,Git
会优先当作分支名来处理git checkout .
还原所有文件
- 用指定提交的内容覆盖工作区:
git checkout <commit-id> — <file name>
用<commit-id>
指定git checkout HEAD^ — <file name>
用HEAD
指定git checkout <branch name> — <file name>
用其他分支的指定提交内容还原到当前分支工作区
- 用暂存区内容覆盖工作区内容:
-
git branch
- 用于管理分支,一般用于查看、创建和删除分支
- 常用的命令:
- 查看当前分支(
*
标注的是当前分支)- 本地分支
git branch
- 远程分支
git branch -r
- 本地和远程分支
git branch -a
- 本地分支
- 查看本地分支对应的远程分支
git branch -vv
- 新建分支
git branch <branch name>
- 切换到指定分支
git checkout <branch name>
- 修改本地分支名
- 该分支不是当前分支
git branch -m <old branch name> <new branch name>
- 该分支是当前分支
git branch -m <new branch name>
- 该分支不是当前分支
- 删除分支(
origin
是远程仓库名)- 本地分支
git branch -d <branch name>
- 远程分支
git push origin —delete <branch name>
- 本地分支
- 修改远程分支名(
origin
是远程仓库名)- 先修改本地分支
git branch -m <old branch name> <new branch name>
- 删除远程分支
git push --delete origin <old branch name>
- 将本地新分支推送到远程仓库
git push origin <new branch name>
- 先修改本地分支
- 关联远程分支
git branch --set-upstream-to=<远程仓库名>/<远程分支名> <本地分支名>/git branch -u <远程仓库名>/<远程分支名> <本地分支名>
- 查看当前分支(
-
git stash
- 用于将已更改但未提交的内容(包括工作区和暂存区)保存至堆栈,然后可以在某个分支上恢复
- 常用的命令:
git stash
将所有未提交的修改(工作区和暂存区)保存至堆栈中,git stash save "<message>"
可以给stash
加说明git stash list
列出堆栈中的所有stash
git stash show
查看栈顶的stash
与当前目录的差异,git stash show stash@{x}
可以查看指定stash
与当前目录的差异,加上-p
选项可以查看详细差异git stash pop
将栈顶的stash
弹出并应用到当前分支对应的工作目录上git stash apply
将栈顶的stash
应用到当前分支对应的工作目录上,与git stash pop
不同的是该stash
不会从堆栈中删除,git stash apply stash@{x}
可以应用指定的stash
git stash drop stash@{x}
从堆栈中移除某个指定的stash
git stash clear
清空堆栈git stash branch <branch name>
根据栈顶的stash
创建一个新的分支,如果成功则删除该stash
,可以在后面加stash@{x}
指定stash
,用于在恢复stash时解决冲突(如果stash
之后又对该文件进行了修改,则恢复时就会产生冲突并且必须解决)
-
git fetch
- 用于从远程分支拉取代码
-
git merge/git rebase
-
都用于合并分支,两者的区别在于:
git merge
:
git rebase
:rebase
的优势就是可以得到更线性的提交历史
-
-
git pull
- 用于从远程仓库获取某个分支的更新,再与本地的指定分支合并
- 相当于先
git fetch
再git merge
,如果合并模式想用rebase
模式,可以加上--rebase
选项 - 在实际使用中,
git fetch
更安全一些,因为在merge
前,我们可以查看更新情况,然后再决定是否合并
-
git push
- 用于将本地分支的更新推送到远程仓库
- 基本命令为
git push <远程仓库名> <本地分支名>:<远程分支名>
- 常用的命令:(远程仓库名为
origin
,本地分支名为master
,远程关联分支名为refs/for/master
)git push origin master
如果远程分支被省略,则将本地分支推送到与其关联的远程分支(通常两者同名),如果该远程分支不存在,则新建一个同名的远程分支(如果没有关联远程分支,可以在第一次push
的时候加—set-upstream
选项)git push origin :refs/for/master
如果省略本地分支名,则表示删除指定的远程分支,因为这相当于推送一个空的本地分支到远程分支,等价于git push origin --delete master
git push origin
如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin
主机的对应分支git push
如果当前分支只有一个追踪的远程分支,那么主机名也可以省略(可以使用git branch -r
,查看本地分支对应的远程分支)
-
git log
- 用于显示提交日志信息(按时间顺序,最近的更新在最上面)
- 常用的命令:
git log <filename>
查看指定文件的提交记录git log <dir>/
查看指定目录下所有文件的提交记录git log <commit-id>
查看该commit
之前的提交记录(包括自身)git log <commit-id1> <commit-id2>
查看两次commit
之间的提交记录(包括两者)git log <commit-id1>..<commit-id2>
查看两次commit
之间的提交记录(不包括commit1
)
- 常用的选项:
git log -n
显示最近的n
次提交git log -p
展开显示每次提交的内容差异git log —word-diff
进行单词层面的对比git log —stat
仅显示简要的增改行数统计git log —pretty=oneline
每个提交放在一行显示git log --pretty=format:%?...
可以定制要显示的记录格式
-
git reflog
- 用于查看
ref
的日志,ref
文件夹下记录了几乎所有本地仓库的更改,只要是让HEAD
发生变化的都会记录,甚至包括已经删除的commit
和reset
操作,所以常用于回退操作 - 用法与
git log
大致相同,在git log
上适用的参数在git reflog
基本也是适用的
- 用于查看
- 推荐一个学习Git的网站:https://learngitbranching.js.org/