Git常用命令 个人总结
- git 介绍
- 一、用户名和邮箱
- 1、查看GIT配置情况
- 2、配置全局用户名和邮箱
- 3、修改默认编辑器
- 二、基础命令
- 1、git 帮助命令
- 2、初始化本地git仓库
- 3、查看git存储状态
- 4、添加文件到暂存区
- 5、将暂存区内容提交为一个版本
- 6、屏蔽文件不参与git管理
- 三、查看命令
- 1、查看历史版本
- 2、查看历史版本记录
- 3、查看某个版本的改动内容
- 4、列表显示某文件修改记录
- 5、查看工作区与版本库的区别
- 四、撤销修改
- 1、取消暂存
- 2、撤销工作区修改
- 3、撤销暂存区修改
- 4、回退版本
- 5、反做版本
- 五、分支
- 1、查看分支
- 2、创建分支
- 3、切换分支
- 4、删除分支
- 5、分支重命名
- 6、当前分支与远程分支的追踪关系
- 六、合并
- 1、将指定分支合并到当前分支
- 2、将与指定分支的差异压缩为一个提交,再合并到当前分支
- 3、将指定提交合并到当前分支
- 4、变基
- 5、修改提交
- (1) 修改add 3提交的注释,提交内容不变
- (2) 完全修改add 3提交
- (3) 合并提交
- 七、远程
- 1、克隆版本库
- 2、查看所有远程主机
- 3、将远程的更新取回本地
- 4、拉取远程更新并合并
- 5、推送本地更新到远程
- 八、标签
- 1、查看所有标签
- 2、查看标签详情
- 3、创建本地标签
- 4、将标签推送到远程
- 5、删除远程标签
- (1) 删除本地标签
- (2) 删除远程标签
- 九、储藏
- 1、临时存储工作区内容
- 2、查看储藏
- 3、提取储藏
- 4、丢弃储藏
- 十、补丁
- 1、生成patch补丁
- 2、应用patch补丁
备注:本文中的<>仅作为字段提示,并不是命令所需的符号
文章内容经过本人整理补充,部分内容摘抄自其他文章,因时间过长忘记原文网址,如有知晓望告知补充
git 介绍
Git 有四种状态: Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制 通过git add 状态变为Staged状态 Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致 这种类型的文件有两种去处, 如果它被修改, 而变为Modified,如果使用git rm --cached移出版本库, 则成为Untracked文件 Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改 Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为ModifiedGit 有三种工作区域: 工作目录(Working Directory): 对项目的某个版本独立提取出来的内容,这些从Git仓库的压缩数据库提取出来的文件,放在磁盘上供你使用或修改。 暂存区域(Staging Area): 是一个文件,保存了下次将提交的文件列表,是待提交文件的暂存区域。一般在Git仓库的目录中,有时也被称为索引。 Git仓库: 用来保存项目的元数据和对象数据库的地方。是Git中最重要的部分,从其他计算机克隆仓库时拷贝的就是这里的数据简略示例图: push ¯¯¯¯¯¯¯ add ------- commit -------- -----> -------- | 工作区 | ----> | 暂存区 | -------> | 本地仓库 | | 远程仓库 | ¯¯¯¯¯¯¯ ------- -------- <----- -------- pull参考自:git知识点整理
一、用户名和邮箱
1、查看GIT配置情况
git config –global -list| 参数 | 含义 |
|---|---|
| –local | 查看本地仓库的配置 |
| –global | 查看全局的配置 |
git config user.name git config user.email查看用户名和邮箱
2、配置全局用户名和邮箱
git config --global user.name "你的用户名" git config --global user.email "你的邮箱"将保存在C:\Users\windows账户名.gitconfig文件中
git config --global --replace-all user.name "新的用户名" git config --global --replace-all user.email "新的邮箱"修改全局用户名和邮箱,也可以直接在.gitconfig文件中修改
参考自:git常用命令
3、修改默认编辑器
git config --global core.editor vimubuntu下默认的编辑器为nano,将其修改为vim
二、基础命令
1、git 帮助命令
git help // 常用git命令 git help <command> // 显示该命令的帮助文档 git help -a // 显示可用命令 git help -g // 帮助向导2、初始化本地git仓库
git init3、查看git存储状态
git status4、添加文件到暂存区
git add <文件路径>文件路径使用. 意为当前工作区的全部改动
5、将暂存区内容提交为一个版本
git commit| 参数 | 含义 |
|---|---|
| -m “本次提交的版本描述” | 本次提交的注释 |
| –amend | 本次内容合并到最新的版本中,不生成新版本 |
6、屏蔽文件不参与git管理
touch .gitignore.gitignore只忽略还未纳入版本管理的文件
若要忽略已经管理的文件,需要先取消其缓存
git rm --cached <文件路径> git add <文件路径> git commit -m "untracke file"被忽略的文件可以使用-f强制纳入管理
git add -f <文件路径>.gitignore忽略规则如下:
* 空格不匹配任意文件,可作为分隔符,可用反斜杠转义 * 开头的文件标识注释,可以使用反斜杠进行转义 * ! 开头的模式标识否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用 ! 也不会再次被包含。可以使用反斜杠进行转义 * / 结束的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件 * / 开始的模式匹配项目跟目录 * 如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录 * ** 匹配多级目录,可在开始,中间,结束 * ? 通用匹配单个字符 * * 通用匹配零个或多个字符 * [] 通用匹配单个字符列表参考自:gitignore的用法
常用示例:
.gitignore: 忽略自身 bin/: 忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略bin文件 /bin: 忽略根目录下的bin文件 /*.c: 忽略 cat.c,不忽略 build/cat.c debug/*.obj: 忽略 debug/io.obj,不忽略 debug/common/io.obj 和 tools/debug/io.obj **/foo: 忽略/foo, a/foo, a/b/foo等 a/**/b: 忽略a/b, a/x/b, a/x/y/b等 !/bin/run.sh: 不忽略 bin 目录下的run.sh文件 *.log: 忽略所有 .log 文件 test.txt: 忽略当前路径的 test.txt 文件三、查看命令
1、查看历史版本
git log| 参数 | 含义 |
|---|---|
| -n | 显示最新的n个版本 |
| –oneline | 单行显示注释 或者–pretty=oneline |
| –graph | 以图表进行显示 |
| –name-only | 仅在提交信息后显示已修改的文件清单 |
| –decorate | 显示分支、Tag等额外信息 |
| –all | 显示所有分支 |
| –follow <文件路径> | 显示对文件的所有提交 |
2、查看历史版本记录
git reflog多用于回退,能够看到git log没有的 amend等内容
3、查看某个版本的改动内容
git show <commitID>一般只取前7位即可,git能够自动查询
4、列表显示某文件修改记录
git blame <文件路径>| 参数 | 含义 |
|---|---|
| -L n1 n2 | 指定文件的行数范围 |
5、查看工作区与版本库的区别
git diff| 参数 | 含义 |
|---|---|
| –cached | 查看暂存区与版本库的区别 |
| –staged | 同–cached |
| 文件路径 | 指定文件 |
查看两个分支之间的差异
git diff <branch1> <branch2>| 参数 | 含义 |
|---|---|
| –stat | 粗略显示,没有对比内容 |
| 文件路径 | 指定文件 |
| branch换成commitID | 比较两个指定commit |
四、撤销修改
1、取消暂存
将文件的修改从暂存区回退到工作区
git restore --staged <文件路径>2、撤销工作区修改
git checkout -- <文件路径> git restore <文件路径>没add 退到上个版本的状态
add过 退到暂存区状态
3、撤销暂存区修改
将暂存区文件回退到版本库,工作区的不影响
git reset HEAD -- <文件路径>删除暂存区和版本库的文件,但保留了工作区的文件
git rm --cached <文件路径>4、回退版本
git reset <HEAD>| 参数 | 含义 |
|---|---|
| –soft | 保留暂存区和工作区,版本回退 |
| –mixed | 撤销暂存区保留工作区,版本回退 等同于无参数的git reset |
| –hard | 撤销暂存区和工作区,版本回退 |
| HEAD | 回退到上一次提交 或者HEAD^上上一次提交 或者HEAD~5 上5个提交 |
| HEAD@{5} | 回退到git reflog中amend之类的版本 |
| commitID | 回退到指定版本 不用写太全,会自动查询 |
5、反做版本
git revert <commitID>将对应版本的内容反做,以生成一个新的版本
默认会打开编辑器确认新版本的注释
| 参数 | 含义 |
|---|---|
| -n | 先将改动保留到暂存区,不提交 |
| –abort | 合并冲突时取消合并,退回到revert前 |
| –quit | 合并后退出,但保留变化 |
git revert <commitID1>..<commitIDN> //反做commit1到commitN,不包括1 (1, N] git revert <commitID1>^..<commitIDN> //依次反做commit1到commitN五、分支
1、查看分支
git branch| 参数 | 含义 |
|---|---|
| -r | 查看远程分支 |
| -a | 查看所有分支 |
2、创建分支
git branch <分支名>创建并切换到分支
git checkout -b <分支名> git switch -c <分支名> //git 2.23版本后引入3、切换分支
git checkout <分支名> git checkout - //切换至前一个分支 git switch <分支名> //git 2.23版本后引入工作区暂存区无改动,才能切换
4、删除分支
git branch -d <分支名> git branch -D <分支名> //强制删除5、分支重命名
git branch -m <原分支名> <新分支名>6、当前分支与远程分支的追踪关系
git push -u <远程主机名> <远程分支名> //第一次推送时建立联系 git branch --set-upstream-to=<远程主机名>/<远程分支名> //修改联系 git branch--unset-upstream //取消联系 git branch -vv //查看联系六、合并
备注:合并前请确保没有未commit的文件,否则即使中止合并也无法恢复
1、将指定分支合并到当前分支
git merge <分支名>默认以fast-forward方式快速合并,即直接移动HEAD指针到最新的提交
将对应分支与当前分支不同的提交,以时间顺序合并过来
合并后默认生成一个合并提交,作为提示
| 参数 | 含义 |
|---|---|
| -m “注释” | 指定最后创建的合并提交的注释 |
| –abort | 终止合并,恢复到合并前 |
| –quit | 退出合并,但保留改动 |
| –continue | 继续之前的合并操作 |
| –no-commit | 合并后不自动提交 |
| -e | 合并后打开编辑器,自行编辑本次合并提交的注释 |
| -v | 显示详细的合并进度和结果 |
| -q | 不显示合并进度信息 |
| –no–ff | 即使可以快速合并,也产生一个合并的提交作提示 |
| –stat | 合并结束处显示文件差异状态 |
| -n | 不显示文件差异状态,即–no-stat |
冲突
若合并的二者中修改了同一位置的内容,将停止合并,工作区输出冲突
冲突部分会以<<<<<<<, =======和 >>>>>>>表示
在=======之前的部分是当前分支的情况,在=======之后的部分是对方分支的情况
删除不需要的部分git add后git merge --continue即可
2、将与指定分支的差异压缩为一个提交,再合并到当前分支
git merge --squash <分支名>将当前分支与目标分支的差异压缩成一个提交
不会自动生成版本,需要手动提交
3、将指定提交合并到当前分支
git cherry-pick <commitID>| 参数 | 含义 |
|---|---|
| <分支名> | 分支名则转移该分支的最新提交 |
| -m “注释” | 指定最后创建的合并提交的注释 |
| –abort | 终止合并,恢复到合并前 |
| –quit | 退出合并,但保留改动 |
| –continue | 继续之前的合并操作 |
git cherry-pick <commitID1>..<commitIDN> //合并commit1到commitN的所有提交,不包括commit1 //且提交1必须早与提交2 git cherry-pick <commitID1>^..<commitIDN> //合并commitID1到commitID2的所有提交4、变基
git rebase <分支名>| 参数 | 含义 |
|---|---|
| –abort | 终止合并,恢复到合并前 |
| –quit | 退出合并,但保留改动 |
| –continue | 继续之前的合并操作 |
从两个分支的共同祖先处提取当前分支上的修改,然后将当前分支指向基分支的最新提交,
最后将刚才提取的修改与基分支的最新提交比较,解决冲突后形成新的提交
即以指定分支为新基底,将当前分支与新基底不同的提交重新提交到新基底上
5、修改提交
git rebase -i HEAD~3 //修改最近三次的提交执行命令后会打开vi界面,最上方显示如下:
pick 63ce9fb add 3 pick 8b485bb add 4 pick a75ed74 add 5(1) 修改add 3提交的注释,提交内容不变
– reword
r 63ce9fb add 3 pick 8b485bb add 4 pick a75ed74 add 5(2) 完全修改add 3提交
– edit
e 63ce9fb add 3 pick 8b485bb add 4 pick a75ed74 add 5保存退出后分支名会改变 (master|REBASE-i 1/3)
在add 3和add 4之间添加提交:
git add + git commit进行新提交
最后git rebase --continue,会发现本次提交到了add 3和add 4之间
只是想修改add 3,不生成新提交:
git add + git commit --amend提交到add 3中
最后git rebase --continue结束即可
(3) 合并提交
– squash
pick 63ce9fb add 3 s 8b485bb add 4 s a75ed74 add 5提示编写新提交的注释
保存退出后add 3 到 add 5的提交都消失,只剩下新提交
– fixup
pick 63ce9fb add 3 f 8b485bb add 4 f a75ed74 add 5类似squash的合并,但不会重新生成提交
会将add 4和add 5的提交都合并到add 3中,最后三个提交只保留add 3
| 命令 | 含义 |
|---|---|
| p | pick = use commit |
| r | reword = use commit, but edit the commit message |
| e | edit = use commit, but stop for amending |
| s | squash = use commit, but meld into previous commit |
| f | fixup = like “squash”, but discard this commit’s log message |
| x | exec = run command (the rest of the line) using shell |
| d | drop = remove commit |
参考自:git rebase -i 命令详解
七、远程
1、克隆版本库
git clone <网址> <本地目录名>默认在当前路径下拷贝,也可自行指定路径
支持Git、SSH、Http(s)等多种协议,Git协议通常最快
git clone -b <分支名> <网址>一般默认拷贝master分支,可加-b指定分支名
2、查看所有远程主机
git remote| 参数 | 含义 |
|---|---|
| -v | 显示远程主机的网址 |
| show <主机名> | 查看指定远程主机 |
| add <主机名> <网址> | 添加远程主机 |
| rm <主机名> | 删除远程主机 |
| rename <原名称> <新名称> | 修改主机名 |
3、将远程的更新取回本地
git fetch <远程主机名> <远程分支名>将当前分支的FETCH_HEAD指向本次拉取的commit内容
所取回的更新使用<FETCH_HEAD>或者<远程主机名/分支名>读取
例:
取回origin的master分支更新后,手动与当前分支合并
git merge FETCH_HEAD 或者 git merge origin/mastergit fetch <远程主机名> <远程分支名>:<本地分支名>拉取远程的指定分支,并在创建一个本地分支保存
4、拉取远程更新并合并
git pull <远程主机名> <远程分支名>:<本地分支名>git pull <远程主机名> <远程分支名> //与当前分支的合并,冒号及之后可省略 git pull <远程主机名> //当前分支与远程分支存在追踪关系,远程分支名可省略 git pull //当前分支只有一个追踪分支,主机名也可省略可采用rebase模式合并
git pull --rebase <远程主机名> <远程分支名>:<本地分支名>可以粗略的看作是fetch和merge命令的集合
git fetch origin git merge origin/master若远程删除了某个分支,默认不会在拉取远程分支时,删除对应的本地分支
加上参数 -p 就会在本地删除远程已经删除的分支
git pull -p # 等同于下面的命令 git fetch --prune origin git fetch -p5、推送本地更新到远程
git push <远程主机名> <本地分支名>:<远程分支名>git push <远程主机名> <本地分支名> //推送到与本地分支存在追踪关系的远程分支,远程不存在则新建 git push <远程主机名> //当前分支与远程分支存在追踪关系 git push //当前分支只有一个追踪分支 git push --set-upstream <远程主机名> <远程分支名> //与远程分支建立追踪关系 git push -u <远程主机名> <本地分支名> //若当前分支与多个远程存在追踪关系,可指定一个作为默认主机 //之后可直接git push推送 git push --force <远程主机名> <本地分支名> //慎用! 可简写为-f,远程与本地分支存在差异,强制推送 git push --all <远程主机名> //将本地所有分支推送到远程主机 git push <远程主机名> :<远程分支名> //推送空的本地分支到远程分支,即删除远程分支 git push <远程主机名> --delete <远程分支名> //删除远程分支参考自:git远程操作详解
八、标签
1、查看所有标签
git tag2、查看标签详情
git show <标签名>不是时间排序,而是字母排序
3、创建本地标签
git tag <标签名>| 参数 | 含义 |
|---|---|
| -a 标签名 | 创建附注标签,可缺省,缺省时创建轻量级标签不记录创建者 |
| -s 标签名 | 创建PGP签名标签 |
| -m “注释” | 添加标签注释,-a为前置 |
| -d 标签名 | 删除本地标签 |
| commitID | 指定commit,默认是HEAD |
例:
git tag -a v1.0.0 -m "Release version 1.0.0" 26e2d034、将标签推送到远程
git push <远程主机名> <标签名>推送本地全部标签
git push <远程主机名> --tags5、删除远程标签
(1) 删除本地标签
git tag -d <标签名>(2) 删除远程标签
git push <远程主机名> :refs/tags/<标签名>git push <远程主机名> -d <标签名>同-d,等效于推送空值到远程,高效删除
九、储藏
1、临时存储工作区内容
git stash| 参数 | 含义 |
|---|---|
| save “注释” | 给本次储藏添加注释 |
| -m “注释” | |
| push <文件路径> | 只储藏指定的文件 (git 2.13版本) |
2、查看储藏
git stash list //查看所有的储藏 git stash show stash@{$num} //查看指定储藏的内容,缺省则使用第一个存储,即stash@{0}3、提取储藏
git stash pop stash@{$num} //取出并应用最新的储藏 git stash apply stash@{$num} //应用储藏的内容,但不取出4、丢弃储藏
git stash drop stash@{$num} //丢弃指定的储藏 git stash clear //删除所有缓存的stash十、补丁
1、生成patch补丁
git diff > xxx.patch //生成工作区的patch git diff <commitID1> <commitID2> > xxx.patch //生成该commit的patch生成的patch不会包含commit的信息
git format-patch HEAD^ //生成最近一个提交的patch git format-patch HEAD^^ //生成最近两个提交的patch git format-patch -n //生成最近n个提交的patch(-1 同 HEAD^); git format-patch -m -n //生成版本m到版本n之间提交的patch; [commitM, commitN] git format-patch -n <commitID> //生成该提交前n个提交的patch(包含该提交); [commitN, commitID] git format-patch <commitID> //生成自该提交到HEAD的patch(不包含该提交); (commitID, HEAD] git format-patch <commitID1>..<commitID2> //生成两个提交间的patch(左开右闭); (commitID1, commitID2]生成的patch将包含对应commit的信息
自动生成的patch文件示例:0001-xxx.patch
| 参数 | 含义 |
|---|---|
| -o xxx/ | 指定输出目录 |
| –stdout xxx.patch | 指定所有修改输出到标准输出,可转接到同一个文件中 |
2、应用patch补丁
git apply xxx.patchgit apply 不会生成新提交,打完patch后需要手动提交
| 参数 | 含义 |
|---|---|
| –stat | 查看patch情况 |
| –check | 检查补丁是否能打上 |
| –reject | 强制打补丁,生成.rej文件包含合并失败的内容 |
git am xxx.patchgit am 无法应用git diff 生成的patch
git am 会主动生成新提交,且提交作者是patch的作者
| 参数 | 含义 |
|---|---|
| –abort | 丢弃patch内容,退回到打patch之前 |
| –continue | 解决完冲突后,接着打完patch |
| –resolved | 同–continue |
参考自:如何用git命令生成patch和打patch