git使用笔记
git使用笔记
沐飞准备
设置用户
git指令
////用户姓名,邮箱设置
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
注意git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
git config user.email 检查邮件
git config user.name 检查名字
检查连接连接是否建立
ssh -T git@e.coding.net coding的
ssh -T git@github.com github的
ssh -T git@gitee.com gitee的
初始化仓库
git init
先切换到目录下
链接远程库
建立SSH Key
sh-keygen -t rsa -C "youremail@example.com" 然后一路回车
id_rsa是私钥 id_rsa.pub是公钥
本地库关联到远程库
git remote add origin git@github.com:2252030510/learngit.git
本地库关联到远程库 2252030510是github账号名 origin是远程库的名字
远程库操作
推送push
第一次push加上-u
git push -u origin master
推送本地库内容到远程库 实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u
参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
之后就可以不加
git push origin master
如果推送失败 用git pull
如果git pull失败 先设置dev和origin/dev的链接
$ git branch --set-upstream-to=origin/dev dev
再git pull
显示未push分支提交历史
git rebase
可以把本地未push的分叉提交历史整理成直线,push后远程分支更美观
克隆库
git clone git@github.com:2252030510/gitskills.git
GitHub给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。
使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
参与开源项目
fork后再clone到本地,不能直接clone作者的,要不然没有权限推送修改
clone别人项目过程中断推出
使用断点续传:
git fetch --recurse-submodules <website>
远程库信息查看
git remote 查看远程库信息
git remote -v 信息更详细 显示了可以抓取和推送的origin的地址,如果没有推送权限,就看不到push的地址。
dev分支开发
你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支
git checkout -b dev origin/dev
Git更新远程仓库代码到本地
查看远程仓库
git remote -v
从远程获取最新版本到本地
git fetch origin master:temp 在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支
比较本地仓库与下载的temp分支
git diff temp
合并temp分支到本地的master分支
git merge temp
删除temp分支
git branch -d temp
如果该分支的代码之前没有merge到本地,那么删除该分支会报错,可以使用git branch -D temp强制删除该分支。
本地库操作
添加文件
$ git add readme.txt
添加文件 可多次添加
$ git add -f App.class
强制添加 加个-f
$ git commit -m "wrote a readme file"
提交文件
-m后面输入的是本次提交的说明
$ git status
可以看仓库状态,是否有修改
git diff
顾名思义就是查看difference(不同)
git diff HEAD -- readme.txt
查看readme.txt的不同
删除文件
$ rm test.txt
删除文件
$ git rm test.txt
确定要删除
提交
$ git commit -m "remove test.txt"
提交到版本库中
撤销之前的操作
git restore readme.txt
用于撤销之前的操作 ,就是让这个文件回到最近一次git commit或git add时的状态。
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
如果误删除工作区文件可以用 git restore test.txt 恢复
查看提交日志
git log
显示从最近到最远的提交日志 按Q退出历史记录
如果嫌输出信息太多,可以试试加上--pretty=oneline参数
$ git log --pretty=oneline --abbrev-commit
退回到某个版本
HEAD指向的版本就是当前版本
git reset --hard commit_id
用于切换版本–切换成历史文件或切换之前的文件,只要id记得
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本
分支操作
建立分支
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>或者git switch <name>
创建+切换分支:git checkout -b <name>或者git switch -c <name>
删除分支: git branch -d <name>
git branch -D <name> 未合的情况下并强制删除
合并分支
合并某分支到当前分支:git merge <name>
git merge --no-ff -m "merge with no-ff" dev
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
查看分支
git log --graph命令可以看到分支合并图。
git log --graph --pretty=oneline --abbrev-commit 查看简洁的分支合并图
Tag操作
$ git tag <tagname>
用于新建一个标签,默认为HEAD,也可以指定一个commit id;
tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。
$ git tag -a <tagname> -m "blablabla..."
在标签上写信息
$ git tag
查看所有标签
$ git show <标签名>
查看标签所带的信息
$ git tag -d <tagname>
删除指定标签,因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
$ git push origin <tagname>
推送本地标签到远程库
$ git push origin --tags
一次性推送所有尚未推送到远程的标签
----删除远程库标签
$ git tag -d <tagname> 先删除本地标签
$ git push origin :refs/tags/<tagname> 在删除远程库的标签
储藏工作现场
$ git stash
可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
$ git stash list
列出“储藏”起来的工作现场
$ git stash apply
从“储藏”中恢复工作现场
$ git stash drop
删除“储藏”的工作现场 即删除stash内容
$ git stash pop
恢复的同时把stash内容也删了
$ git cherry-pick <commit>
在master分支上修复的bug,想要合并到当前dev分支,把bug提交的修改“复制”到当前分支,避免重复劳动。
.gitignore
忽略某些文件
创建.gitignore文件 要放到版本库里,并且可以对.gitignore做版本管理
https://github.com/github/gitignore 里面有写好的
检查gitignore错误
git check-ignore
命令简写设置
将status 简写为st
git config --global alias.st status
$ git config --global alias.unstage 'reset HEAD'
当你敲入命令:
$ git unstage test.py
实际上Git执行的是:
$ git reset HEAD test.py
bash
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
–global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。
修改的内容在.git/config中
gitignore语法
使用gitignore文件来解决这个问题,步骤是:
S1: touch .gitignore #创建gitignore隱藏文件
S2: vim .gitignore #编辑文件,加入指定文件
#下面是我的gitignore文件的内容
#忽略gitignore文件
.gitignore
#忽略后缀名为.o和.a的文件
*.[oa]
#显示指定忽略名称为main的文件
main
#设置忽略文件夹
/文件夹名称/
文件.gitignore的格式规范:
A:#为注释
B:可以使用shell所使用的正则表达式来进行模式匹配
C:匹配模式最后跟”/”说明要忽略的是目录
D:使用!取反(例如目录中包含 test.a,并且gitignore文件中包含 *.[oa],如果在文件中加入 !test.a 表明忽略除test.a文件以外的后缀名为.a或者.o的文件)
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
#git