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列出堆栈中的所有stashgit 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}可以应用指定的stashgit stash drop stash@{x}从堆栈中移除某个指定的stashgit 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 mastergit 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/
866

被折叠的 条评论
为什么被折叠?



