说明: 相关命令均为在项目根路径(即.git文件夹所在路径)下使用,git <命令> --help查看指定命令的帮助文档
基本配置
首次使用,要全局配置用户名及邮箱信息(仅配置一次即可)
配置用户名:git config --global user.name '用户名'
配置用户邮箱:git config --global user.email '邮箱'
git config --list列出所有配置项
本地操作
注:git stash中临时保存的修改,工作区、暂存区的修改,以及本地仓库中的内容在电脑关机重启后都仍然存在。它们都是保存在当前项目下,不同的项目之间都是相互独立的。
基本操作
初始化项目
git init # 在项目中初始化Git,让Git管理当前项目
查看状态
git status # 检查当前文件状态
添加文件git add
git add <file1> <file2> # ...将工作区的指定文件添加到暂存区
git add . # 将工作区更改的所有文件都添加到暂存区
注:git add后,工作区和暂存区的内容是一致的
提交暂存区git commit
git commit # 提交暂存区的改动到本地仓库,生成版本(会新开编辑器来输入描述信息)
git commit -m # '描述信息'提交暂存区的改动到本地仓库,生成版本
git commit <file1> <file2> ... -m # '描述信息'提交暂存区的指定文件到本地仓库,生成版本
git commit -am # '描述信息'等同于 git add . && git commit -m '描述信息'
git commit --amend -m # <描述信息>使用一次新的commit,替代上一次提交(如果代码没有任何新变化,则用来改写上一次commit的提交信息)
git show # <版本号>显示某次提交的内容变化
注:git commit后,暂存区和本地版本库的内容是一致的
查看记录
git log # 查看提交记录
git log --oneline # 以一行的方式查看提交记录
git log --oneline --graph # 以一行、图形化的方式查看提交记录
git reflog # 查看全部历史操作记录(包括被git reset“丢弃”的版本)
差异比较
git diff # 比较当前工作区与暂存区的差异
git diff <filename> # 比较指定文件在工作区与暂存区的差异
git diff HEAD # 比较工作区与当前分支最新commit(即本地库最近一次版本)之间的差异
git diff --cached # 比较暂存区与本地库最近一次版本的差异
git diff --cached <filename> # 比较指定文件在暂存区与本地库最近一次版本的差异
撤销更改&版本重置
git checkout . # 撤销所有工作区的修改,使之与恢复到与暂存区一致的状态
git checkout <filename> # 撤销指定文件在工作区的修改,使之与恢复到与暂存区一致的状态
git reset # 撤回所有暂存区的文件到工作区
git reset <filename> # 撤回指定的暂存区的文件到工作区
git reset --soft <版本号> # 重置本地仓库中的代码到指定版本
git reset --mixed <版本号> # 重置本地仓库和暂存区的代码到指定版本。为默认行为,等价于git reset <版本号>
git reset --hard <版本号> # 重置本地仓库、暂存区和工作目录的代码到指定版本。注意:会覆盖正在开发的代码
分支操作
使用多分支可以同时推进任务的开发,提高开发效率;并且即使某一个分支开发出现问题,也不会对其他分支产生影响。如下表示当前处于master分支。
查看分支
git branch # 查看本地分支
git branch -r # 查看远程分支
git branch -a # 查看本地和远程分支
git branch -v # 查看分支及各个分支最后一个提交对象的信息(同样可以-va、-vr等命令连用)
创建&切换&删除分支
git branch <分支名> # 在当前分支的节点上创建新的分支
git checkout <分支名> # 切换到指定分支
git switch <分支名> # 切换到指定分支,v2.23.0版及以后可用
git checkout -b <分支名> # 创建并切换到新建分支
git branch -d <分支名> # 删除指定分支
合并分支
git merge <分支名> # 将指定分支合并到当前分支
注: 合并分支时,要先切换到最终要合并到的分支,再合并。
注: 在两个不同的分支中,如果对同一个文件的同一个部分进行了不同的修改,则合并分支时会产生冲突。此时需要人为解决冲突后再重新提交一次。
stash临时存储
如果当前工作区或暂存区存在未提交的修改,则无法切换分支。所以当我们想把当前修改应用到其他分支时或当我们需要切换到其他分支完成某些任务但又不想立即提交眼前已经修改的代码时,可以先用git stash命令先把工作区及暂存区已经修改的文件临时保存起来,然后再进行分支切换。之后再根据具体情况,在合适的时机从stash中恢复刚刚保存的内容。
git stash # 把本地的改动(工作区或暂存区的改动)临时存储起来
git stash pop # 应用最近一次临时存储的修改,并删除存储记录
git stash save "message" # 执行存储时添加备注
git stash list # 查看stash的存储列表
git stash apply # 应用最近一次存储的修改,但不会把存储从存储列表中删除
git stash apply stash@{index} # 应用stash中标号为index的修改,不会把存储从存储列表中删除
git stash clear # 清空stash缓存
对于分支的推荐使用方式
master分支: 在master分支上只保留完全稳定的代码,一般不直接修改其代码;
dev分支: 在dev分支上做开发,一般保存最新完成及bug修复后的代码,最终合并到master分支上;
hotfix分支: 在hotfix分支上做紧急修复,最终合并到master分支及dev分支上;
feature分支: 在feature分支上开发新功能,一般以dev分支为基础创建feature分支;
…: 还可以有更多分支。
远程操作
注: 如果还没有远程仓库,则需要先在远程仓库服务器上创建一个远程仓库;常用的远程仓库服务器有GitHub、Gitee。也可以使用开源项目GitLab搭建自己的远程仓库服务器。
克隆git clone
远程操作的第一步,通常是从远程主机克隆一个版本库,这时就要用到git clone命令。
git clone <版本库URL> # 在本地主机生成一个目录,与远程主机的版本库同名
git clone <版本库URL> <本地目录名> # 在本地主机生成一个目录,指定与远程主机的版本库不同的目录名
远程主机git remote
为了便于管理,Git可以为远程主机指定主机名。git remote命令就用于管理主机名。
使用git clone命令克隆版本库时的远程主机会默认被Git命名为origin。
主机名与URL的对应关系存储在当前项目的.git/config文件中。
git remote # 列出所有远程主机
git remote -v # 查看远程主机的网址
git remote show <主机名> # 查看指定主机的详细信息
git remote add <主机名> <网址> # 添加远程主机
git remote set-url <主机名> # 重置远程主机
git remote rm <主机名> # 移除远程主机
git remote rename <原主机名> <新主机名> # 对远程主机进行重命名
git fetch
一旦远程主机的版本库有了更新,需要将这些更新取回本地,这时就要用到git fetch命令。git fetch命令通常用来查看其他人的进度,因为它取回的代码对你本地的开发代码没有影响。
git fetch <远程主机名> # 将某个远程主机的所有更新,全部取回本地。
git fetch <远程主机名> <分支名> # 取回某个远程主机的指定分支的更新
git fetch取回的更新,在本地主机上要用远程主机名/分支名的形式读取。比如origin主机的master分支,就要用origin/master读取。
$ git branch -r
origin/master
$ git branch -a
* master
remotes/origin/master
# 以上结果表示:本地主机的当前分支是master,远程分支是origin/master。
$ git checkout -b newBrach origin/master
# 在远程分支origin/master的基础上,创建一个新的本地分支newBranch
$ git merge origin/master
# 在当前分支上,合并远程分支origin/master
git pull
git pull # 命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。
git pull <远程主机名> <远程分支名>:<本地分支名>取回远程主机某个分支的更新,再与本地的指定分支合并。比如git pull origin next:master表示 取回origin主机的next分支,与本地的master分支合并。如果远程分支是与当前分支合并,则冒号后面的部分可以省略,写成git pull origin next
实质上,git pull等同于先做git fetch,再做git merge。比如git pull origin next相当于git fetch origin next && git merge origin/next
注:没有本地仓库的时候,用git clone;已经有本地仓库,更新的时候用git pull
git push
git push # 命令用于将本地分支的更新,推送到远程主机。它的格式与git pull命令相仿。
git push <远程主机名> <本地分支名>:<远程分支名> # 将本地指定分支的更新,推送到远程主机指定分支
git push <主机名> --delete <远程分支名> # 删除指定主机的指定分支
注意:如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。
追踪关系
在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支建立追踪关系,比如本地的master分支自动追踪origin/master分支。
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。
比如git pull origin 表示本地的当前分支与origin主机上相对应的"追踪分支"(remote-tracking branch)进行合并。
git push如果省略远程分支名,则表示将本地分支推送至与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
比如git push origin master 表示将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。
还有一种情况,就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用--all选项。
比如git push --all origin表示,将所有本地分支都推送到origin主机。
.gitignore文件
.gitignore文件是一个用于指定哪些文件不需要Git管理(即Git要忽略哪些文件)的文件。示例如下。
# 此为注释
# 忽略指定文件,不让Git管理
test.html
# 忽略所有文件名是test的文件,不管后缀是什么
test.*
# 忽略所有后缀名为.a的文件
*.a
# 但lib.a除外
!lib.a
# 忽略node_modules目录下的所有文件
node_modules/
# 忽略doc/目录下的所有后缀名为.a的文件(会忽略doc/abc.txt但不忽略doc/server/abc.txt)
doc/*.txt
# 仅仅忽略项目根目录下的abc.def文件,不包括subdir/abc.def
/abc.def
# 注:Git管理的是文件,空目录会自动被Git忽略掉