基本操作
- git init 初始化本地仓库
- git status git状态命令
- git add 文件名/. 把文件变化加入本地stage 也可以用 .是全部加入
- git rm --cached 文件名 把本地存在stage缓存区中的文件放回工作区
5. git log 查看日志。
- git log -最近次数 可以查看最近的几次log。
- git log --pretty = oneline 日志以单行显示核心内容。
- git log --pretty=format:"%h %an %ar %s" 按照格式化来显示%h是头sha1值 %an作者 %ar提交时间 %s提交的message
- git log --graph 图形化日志
6. git config 设置参数
- git config --system (给git系统一次性设置 基本不用)
- git config --global (给当前用户一次性设置)
- git config --local (给当前项目一次性设置)
7.删除已提交的文件
git rm 文件名 ,文件将移动至缓存区,要彻底删除需要commit一次
8. 删除后悔
git rm 之后文件在缓存区
- 执行 git reset HEAD 文件名,删除操作转移到了工作区
- 执行git checkout -- 文件名 取消删除操作 9、重命名 git mv 原文件名A 新文件名B 文件重命名实际上是新产生一个文件并且把源文件删除,随意执行完后在缓存区有2个操作一个是A删除 一个操作是增加B。需要直接完毕需要再commit到仓库 如果这时候后悔 执行git reset HEAD A后再git checkout -- A 一下这时候A就回来了,但是B也还是存在 并且处于缓存区。如果想把B删除需要执行git reset HEAD B,在执行系统指令rm B删除工作区的B文件 10、注释重写 git commit --amend -m '新的注释' 修改最近一次提交的注释 11、gitignore 忽略文件 创建.gitignore文件并在里面写上需要忽略的名字
- 通配符 * (所有) 比如*.jpg 忽略所有.jpg结尾的文件
- !文件名(排除这些文件) 比如*.jpg !b.jpg 就是忽略所有jpg文件除了b.jpg
- dir/ 忽略dir以及其文件夹下所有文件
- dir/*.jpg 忽略dir文件夹下所有.jpg文件
- dir/*/*.jpg 忽略dir文件夹内的任意文件夹内的.jpg 能忽略dir/abd/a.jpg 也能忽略dir/CDE/c.jpg 但是不能忽略dir/abc/ad/d.jpg、智能忽略任意1级子文件夹内的文件
- dir/**/*.jpg 忽略dir文件夹内任意子文件夹下面的.jpg 子子孙孙都忽略
分支操作
1. git branch 查看分支
2. git branch 分支名 创建分支
3. git checkout 分支名 切换分支
4. git branch -d 分支名 删除分支(不能删除当前分支
其他不能删除的情况:包含“未合并”的内容(当且仅当待删除分支有某文件内容)如果需要强行删除则执行 git branch -D 分支名
5. git checkout -b 创建分支并切换到分支
6. git merge
git merge 分支名。合并分支 如果一个分支靠前(dev),一个分支落后(master),如果没有冲突,master可以通过merge 直接追赶上dev 这叫做fast forward。 fast forward:1、连个分支会归于一点commit,2、会丢失分支信息
- git 在merge时候默认使用fast,也可以禁止fast forward。使用git merge --no-ff
- git merge --no-ff :1、合并两个分支,并且不会归于一点commit(主动合并的分支往前一步)2、不丢失分支信息,分支信息完整 -- 当两个分支都有修改内容时候合并会发生冲突,发生冲突需要解决冲突,vi修改对应冲突文件,再进行git add(这是add不是从工作区保存到暂存区,而且告知系统冲突解决),最后再git commit
<<<<<<<<HEAD //这里是当前HEAD冲突文件的冲突部分内容
aaaa //冲突内容
========== //分隔符
>>>>>>>dev //分支和当前HEAD有冲突的部分
bbbb //冲突内容
cccc
dddd
//解决完冲突后是以下内容(假设保留当前分支的修改)
aaa
ccc
ddd
注意当master在merge时遇到冲突,并解决则解决冲突会进行2次提交:1次是最终提交,1次是将对方分支的提交信息也拿来了。
7.版本穿梭
回退到上一次: git reset --hard HEAD^ 回退到前N次: git reset --hard HEAD~N 跳转到某一次:git reset --hard sha1值 可以结合git reflog (查看git 所有的日志。)
8.cheout放弃与游离
checkout 文件名 :放弃修改。放弃的是工作区的内容,放弃相对于暂存区和对象区的 checkout:版本穿梭(游离状态)
- 修改必须提交;
- 现在是创建分支的好时机 git branch 分支名 穿梭到的sha1值
9. 分支重命名
git branch -m 分支名 新分支名
10.stash 保存现场
- 建议(规范):在功能未开发完全之前不要commit
- 必须(规定):在没有commit之前,不才能checkout切换分支(不在同一个commit阶段)
如果某个功能还未开发完毕就要切换分支:建议1.保存现场,再切换分支
- 保存现场:git stash
git stash save 名字(保存带名字的现场) - 查看现场:git stash list
- 还原现场:git stash pop (将原来保存的现场删除,并把它还原进工作区,默认还原最近一次)
git stash apply(还原并不删除保存的现场) git stash drop 现场的索引名(手工删除现场,删除最近一次不需要加上索引名)
11.tag 标签
标签适用于整个项目和分支无关
- 创建标签
git tag 标签名 ,比如git tag v1.0:创建一个简单标签仅包含sha1值
git tag -a 标签名 -m '内容',比如git tag -a v2.0 -m '这是第二个版本
创建一个带信息的标签;创建标签v2.0其标签内容是这是第二个版本
这种方式创建的标签不仅包含当前commit的sha1还有自身的sha1和标签信息 - 查看标签
git tag 或者git tag -l - 推送标签到远程
git push origin 标签名:单个标签推送到服务器
git push origin --tags:将本所有标签推到服务器
git push -f origin 标签名:强推标签到远程 如果远程原来有这个版本需要替换的话用这个 - 删除标签
删除本地标签:git tag -d 标签名
删除服务器标签:
1、git push origin :refs/tags/标签名
2、git push origin --delete tag 标签名,这个方法需要先删除本地的标签 - 显示标签信息
git show 标签名 - 拉取远程标签
git pull :拉取标签可以感知新增标签,但是无法感知远程被删除的标签
12.blame 责任
git blame 文件名 查看文件所有提交commit sha1值以及每一个作者。用于追责
13. diff
- diff a文件 b文件 :比较ab两个文件差异,比较文件差异(linux命令)
- diff -u a b 比较源文件a和被比较文件b之间差异.---表示源文件 +++表示被比较的文件
$ diff -u a.txt b.txt
--- a.txt 2021-07-19 09:10:50.054824100 +0800
+++ b.txt 2021-07-19 15:18:28.143071900 +0800
@@ -1 +1,2 @@
-aaa
+aa
+bb
- git diff :比较的是暂存区和工作区的差异
- git diff commit的sha1值 :比较对象区与工作区的差异
- git diff --cached commit的sha1值:比较对象区与暂存区之间的差异
14. github
- ssh配置。远程放公钥,本地放私钥
ssh-keygen 生成秘钥 - git remote add origin 远程地址 :给本地仓库添加远程仓库,并且给别名origin
- git push -u origin master :把本地master推送到远程origin 并且两者绑定后续只需要git push就可以
- git remote show 查看远程分支
- git remote show origin(分支别名) 查看具体的某个远程分支的情况 git 会在本地维护ogirin/master分支,通过该分支感知远程gitbub的内容
15. git一般流程
- dev:开发分支,频繁变化
- test:基本开发完毕后,交给测试实施人员的分支
- master:生产阶段,很少变化 bugfix:临时修复bug的分支 dev->test(test merge dev)->master(master merge dev)
16. 远程本地关联操作
- 查看远程分支 git log origin/master
- 查看本地分支情况 git branch -av
- 本地-》远程:git push
如果有本地有新分支dev远程没有推送方法有2个:
1、git push -u origin dev;
2、git push --set-upstream origin dev - 远程-》本地:git pull
如果远程有其他分支dev,本地方库没有这个仓库操作如下:
远程-》追踪:git pull;
追踪-》有2个方法:
方法1 git checkout -b dev origin/dev;
方法2 git checkout --track orign/dev; - 删除分支:git branch -d 分支名
删除远程分支:git push origin :dev(分支名) 或者 git push origin --delete dev(分支名) - git push origin src:目标分支 方法扩展
git push origin dev:dev2 方法等价于将本地dev推送并关联到远程的dev2
git push origin HEAD:dev2 方法等价将当前HEAD指向分支推送并关联到远程dev2 - git pull origin src:目标分支 方法扩展,src是也是分支名
git pull origin dev:test 把远程dev拉到本地并创建关联本地的test分支,此方法等同于 git pull + git checkout -b test origin/test - 清理无效的 追踪分支(本地感知的远程分支)
远程已经删除了分支a,但本地却感知远端的分支a
监测:git remote prune origin --dry-run
删除这个感知分支a git remote prune origin
17. 给命令取别名
git config --global alias.ch checkout 相当于给checkout 取别名ch ,以后命令行输入ch=checkout
18. submodule 子模块
- 添加子模块:git submodule add 子模块仓库地址;
- 更新子模块,有2种方法:
- git submodule foreach git pull:在a仓库内执行此命令作用是把a项目的所有子模块都pull更新;
- 进入子模块,在子模块下执行git指令 git pull 更新模块;
- git submodule foreach git pull:在a仓库内执行此命令作用是把a项目的所有子模块都pull更新;
- 克隆带有子模块的项目:git clone 远程仓库地址 --recursive
19.cherry-pick
将commit转移(复制)至其他分支,每次只能转移(复制)一个commit
- git cherry-pick sha1值;需要先切换到需要转移至的目标分支再操作
- cherry-pick 在转移复制的时候不要夸commit,逐个顺序转移;
20.git rebase 变基
rebase 会改变提交历史
rebase 之后线路是一条线
rebase 之后有冲突 : a.解决冲突。需要 vi修改 add添加 再执行git rebase --continue
b.忽略冲突。(放弃rebase所在分支的修改,直接使用其他分支的内容, git rebase --skip
终止rebase,还原成rebase之前的场景:git rebase --abort
建议:rebase分支只在本机操作,不要推送远端。尽量不要在master执行rebase