说明:
1、本文简单总结自己目前工作中曾使用到的Git命令,比较简略,仅为方便查找自己常用Git命令;
2、本文中的大部分命令主要参考廖雪峰老师的Git教程(https://www.liaoxuefeng.com/wiki/896043488029600),希望详细学习的请移步;
3、剩余的命令为自己工作中需要用到时而自行查找并验证的命令;
【1】Git原理图
【2】准备项目
【2.1】配置Git仓库
【2.1.1】配置
- 对本地所有仓库配置
git config --global user.name "用户名"
git config --global user.email "邮箱"
- 对本地单个仓库配置
git config user.name "用户名"
git config user.email "邮箱"
“用户名”和“邮箱”:
1、是必须的,提交时作为提交人的信息;
2、理论上可以随便填写,但最好使用目标GitHub或其他远程库的账户信息(这样提交commit的用户会与远程库用户关联起来);
3、“用户名”和“邮箱”任意一个变化时,本地仓库commit记录便认为与之前提交人是不同的用户;
4、“用户名”变化,但“邮箱”没变时,远程仓库认为与之前提交人是相同用户,但反之则认为是不同用户;
【2.1.2】删除配置
- 删除对本地所有仓库配置
git config --global --unset user.name "用户名"
git config --global --unset user.email "邮箱"
- 删除对本地单个仓库配置
git config --unset user.name "用户名"
git config --unset user.email "邮箱"
【2.1.3】查看配置
git config --list //按“q”可退出
1、在非Git仓库路径下,执行此命令,只显示global配置的“用户名”和“邮箱”;
2、在Git仓库路径下,执行此命令,global配置的“用户名”和“邮箱”显示在上,本仓库的配置显示在下(如果有);
【2.2】用Git管理项目(建仓库)
【Step1】在要生成.git文件夹的目录下,右键打开Git Bash
【Step2】git init //此时创建了master分支
【2.3】远程仓库操作
- 现有项目上传远程仓库
【Step1】在GitHub创建一个新的仓库
【Step2】git remote add origin <仓库地址> //建立与远程库的关联,origin为在本地代表远程仓库的名字,可以使用其他名字
【Step3】git push -u origin master //推送master分支到远程库(在远程库创建master分支),-u用于指定origin为默认远程库并建立本地master分支和远程master分支的追踪关系(这样后面在push master分支的提交时可直接使用git push命令)
- 从远程仓库克隆
git clone <仓库地址> //在目标文件夹下打开Git Bash,直接执行此命令即可
【3】操作分支
【3.1】查看所有分支
git branch
输出:
develop前的*表示:develop为当前所在分支
【3.2】切换分支
git checkout <分支名>
或
git switch <分支名>
【3.3】创建分支
- 仅创建分支
git branch <分支名>
- 创建并切换至新分支
git checkout -b <分支名>
或
git switch -c <分支名>
【3.4】删除分支
- 分支中的commit都已合并(即:有另外任何一个分支指向待删分支最新的commit)
git branch -d <分支名> //如果当前分支是要删除的分支,则不能删除,需先切换至其他分支
- 分支中存在未合并的commit
git branch -D <分支名> //未合并的commit都会被丢弃
【3.5】合并分支
【3.5.1】合并
过程:将分支A的Commit合并到B分支
【Step1】切换至B分支
【Step2】git merge <A分支名>
【3.5.2】发生冲突
说明:
1、合并分支时,若存在冲突,则无法合并;
2、此时,工作区冲突文件均被修改(工作区冲突文件的冲突部分被Git自动改为两分支区别的对比,待手动处理);
3、暂存区也多了一处修改(指示有冲突待处理);
4、当前分支也进入“分支名|MERGING”状态;
- 终止合并状态
要撤销当前这种"分支名|MERGING"状态,使用以下命令;
git merge --abort
- 解决冲突
【Step1】修改所有冲突文件
【Step2】git add 所有冲突文件
【Step3】git commit //此时,在当前分支新增了一条commit,要记录本次合并
注意:此时,仅仅是当前分支完成了合并,另一条分支还是原来的样子
【3.6】远程仓库操作
本地分支和远程分支是相互独立的(在不同的Git库中),但它们之间可以建立一种追踪关系
【3.6.1】创建 远程分支 对应的 本地分支
从远程clone到本地的项目,只有master分支会clone下来,其他分支需要手动创建
git checkout -b <本地分支> origin/<远程分支> //此时,也自动创建了本地分支和远程分支的追踪关系
【3.6.2】推送 本地分支 到 远程分支
- 远程没有与本地分支对应的分支
//创建远程分支,并建立追踪关系
git push -u origin <本地分支名> //此命令无需事先切换分支
//仅创建远程分支,不建立追踪关系
git push origin <本地分支名>
- 远程存在与本地分支对应的分支(无追踪关系)
git push origin <本地分支名> //此命令无需事先切换分支
- 远程存在与本地分支对应的分支(有追踪关系)
【Step1】切换到要推送的本地分支
【Step2】git push //前提:当前分支与远程分支已经建立了追踪关系 //只推送当前的本地分支;
【3.6.3】要推送的分支 与 远程分支 冲突
远程分支已被其他人修改,自己的修改需要推送,但却存在冲突
【Step1】git pull origin <分支名> //拉取远程分支的commit到本地,当前分支进入“分支名|MERGING”状态
【Step2】按本地解决冲突的方式解决“本地分支”与“远程分支”的冲突(提交commit)
【Step3】推送解决冲突后的本地分支(带着新的解决冲突的commit)
- 拉取分支
git pull //所有与本地分支有"追踪关系"的远程分支都会被拉取下来;当前分支若是和远程分支没有冲突的话会合并,其他分支则不会与对应的远程分支合并,仅仅显示远程分支为最新;
- 手动建立本地分支和远程分支的追踪关系
git push --set-upstream origin <本地分支名> //同名远程分支不存在会自动创建
git branch --set-upstream-to <本地分支名> origin/<远程分支名>
- 查看本地分支和远程分支的追踪关系
git branch -vv
【4】工作区操作
【4.1】提交修改
- 单个文件
git add <file>
- 所有文件
git add .
【4.2】撤回修改
- 单个文件
git restore --staged <file>
【4.3】丢弃修改
- 单个文件
git restore <file>
或
git checkout -- <file>
【5】暂存区操作
commit就是一次性提交暂存区的所有修改
git commit -m "注释"
【6】保存工作现场以先完成其他修改
工作现场: 目前在 工作区 和 暂存区 的修改
【Step1】git stash // 此时会清空工作区和暂存区(除了工作区中的新增文件);此动作相当于创建了一个名为stash的分支,工作现场保存在该分支最新的2个commit中;
【Step2】完成其他修改,并提交
【Step3】git stash apply // 恢复 stash 中的内容到工作区和暂存区;有时和刚才的修改会存在冲突,此时需要解决冲突内容;
【Step4】git stash drop // 确认没有问题后,将 stash 分支删除
1、如果可以确定工作现场与刚完成的修改无冲突,可以直接使用 git stash pop 命令,相当于 Step3 + Step4
2、多次提交的stash并不冲突,似乎以队列的方式存在,每次apply都是恢复最近的一次stash