笔记gitgit使用笔记
沐飞准备
设置用户
1 2 3 4
| git指令 ////用户姓名,邮箱设置 $ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
|
注意git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
1 2
| git config user.email 检查邮件 git config user.name 检查名字
|
检查连接连接是否建立
1 2 3
| ssh -T git@e.coding.net coding的 ssh -T git@github.com github的 ssh -T git@gitee.com gitee的
|
初始化仓库
先切换到目录下
链接远程库
建立SSH Key
1
| sh-keygen -t rsa -C "youremail@example.com" 然后一路回车
|
id_rsa是私钥 id_rsa.pub是公钥
本地库关联到远程库
1 2
| git remote add origin git@github.com:2252030510/learngit.git 本地库关联到远程库 2252030510是github账号名 origin是远程库的名字
|
远程库操作
推送push
第一次push加上-u
1
| git push -u origin master
|
推送本地库内容到远程库 实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u
参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
之后就可以不加
如果推送失败 用git pull
1 2 3
| 如果git pull失败 先设置dev和origin/dev的链接 $ git branch --set-upstream-to=origin/dev dev 再git pull
|
显示未push分支提交历史
1 2
| git rebase 可以把本地未push的分叉提交历史整理成直线,push后远程分支更美观
|
克隆库
1
| 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别人项目过程中断推出
使用断点续传:
1
| git fetch --recurse-submodules <website>
|
远程库信息查看
1 2
| git remote 查看远程库信息 git remote -v 信息更详细 显示了可以抓取和推送的origin的地址,如果没有推送权限,就看不到push的地址。
|
dev分支开发
你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支
1
| git checkout -b dev origin/dev
|
Git更新远程仓库代码到本地
查看远程仓库
从远程获取最新版本到本地
1
| git fetch origin master:temp 在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支
|
比较本地仓库与下载的temp分支
合并temp分支到本地的master分支
删除temp分支
如果该分支的代码之前没有merge到本地,那么删除该分支会报错,可以使用git branch -D temp强制删除该分支。
本地库操作
添加文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| $ 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的不同
|
删除文件
1 2 3 4 5
| $ rm test.txt 删除文件
$ git rm test.txt 确定要删除
|
提交
1 2
| $ git commit -m "remove test.txt" 提交到版本库中
|
撤销之前的操作
用于撤销之前的操作 ,就是让这个文件回到最近一次git commit或git add时的状态。
如果误删除工作区文件可以用 git restore test.txt 恢复
查看提交日志
1 2 3 4
| git log 显示从最近到最远的提交日志 按Q退出历史记录 如果嫌输出信息太多,可以试试加上--pretty=oneline参数 $ git log --pretty=oneline --abbrev-commit
|
退回到某个版本
HEAD指向的版本就是当前版本
1
| git reset --hard commit_id
|
用于切换版本–切换成历史文件或切换之前的文件,只要id记得
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本
分支操作
建立分支
1 2 3 4 5 6 7 8 9 10
| 查看分支: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> 未合的情况下并强制删除
|
合并分支
1
| 合并某分支到当前分支:git merge <name>
|
1
| git merge --no-ff -m "merge with no-ff" dev
|
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
查看分支
1 2
| git log --graph命令可以看到分支合并图。 git log --graph --pretty=oneline --abbrev-commit 查看简洁的分支合并图
|
Tag操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| $ 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> 在删除远程库的标签
|
储藏工作现场
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| $ 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错误
命令简写设置
将status 简写为st
1
| git config --global alias.st status
|
1
| $ git config --global alias.unstage 'reset HEAD'
|
当你敲入命令:
实际上Git执行的是:
1
| $ git reset HEAD test.py
|
bash
1
| 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的文件)
1 2 3
| git rm -r --cached . git add . git commit -m 'update .gitignore'
|
#git