git笔记3-Git
- windows git下载网址
- mac不用下载自带
git命令
- git init 初始化仓库
- git status 查看当前状态
- git add -A (提交所有的) 提交本地文件到缓存区
- git commit -m "提交信息" 将缓存区的东西提交到本地仓库
- git push 将本地仓库的内容提交到远程服务器
- git pull 从远程服务器更新
-
git log 查看所有的提交日志 ,命令显示从最近到最远的提交日志
git log --pretty=oneline 只输出 commit id 和commit信息 - git reflog 查看所有的SHA值
-
git reset --hard <sha值> 回退到某一个版本
git reset --hard HEAD^ 回退到上个版本。在Git中,用HEAD表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写成HEAD~100
。
git reset --mixed(默认可以不写) <sha> 回退到修改状态
git reset --soft <sha> 回退到暂存区状态
git分支
- git branch <branchname> (branchname分支名称) 创建分支
-
git checkout <branchname> 切换到<branchname>的分支上
上面两个命令可以合成一个命令
git checkout -b <branchname>* 创建新分支branchname, 并切换到新分支 - git branch 查看当前分支, 有*的代表当前正在工作的分支
- git merge <branchname> 分支合并 ,将 <branchname>上的内容合并到master上
- git branch -d <branchname> 删除<branchname>分支
- git branch -r -d origin/<branchname> 删除远程分支
- git branch <branch> <start point> 基于当前分支的某一次commit来创建分支. 比如: git branch newbranch 9e828b1 在当前分支commit 为 9e828b1 点上创建分支 newbranch
git共享仓库
- git clone 仓库地址
**git clone --bare** 项目地址 仓库名称(可选)
- 共享仓库看不到工作区,但是里面有内容 他是共享的,别人只能往里面放代码,但是不让修改, 如果想获取就直接克隆。
文件冲突: 多个人同时改了同一个文件的同一行就会引起冲突。
-
ssh-keygen -t rsa
生成 公钥/私钥
- git remote -v 查看远程仓库地址 默认 origin
- git remote add 仓库名称 仓库地址
修改远程仓库地址
- 1.直接修改
git remote origin set-url [url]
- 2.先删除后增加
git remote rm origin
git remote add origin [url]
- 3.直接修改config文件
git tag 标签
标签可以针对某一时间点的版本做标记,常用于版本发布
1.标签创建和查看
- git tag 查看所有标签。注意,标签不是按时间顺序列出,而是按字母排序的。
$ git tag
v1.0
-
git tag <name> 给当前分支打标签,
如: git tag v0.1.2 -
git tag -a <tagname> -m "文字信息" 创建带有说明的标签,用
-a
指定标签名,-m
指定说明文字。
如:git tag -a v0.1.2 -m “0.1.2版本”。 -
git tag -a <tagname> <commit id> 给指定的commit打标签。
注意要先获取打标签分支的commit id。如:git tag -a v0.1.1 9fbc3d0 , 给指定的commit打标签 - git show <tagname> 可以查看标签的版本信息,如:git show v0.9
$ git show v0.9
commit f52c63349bc3c1593499807e5c8e972b82c8f286 (tag: v0.9)
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:56:54 2018 +0800
add merge
diff --git a/readme.txt b/readme.txt
...
- git checkout [tagname] 切换标签与切换分支命令相同
2.标签发布
通常的git push 不会将标签对象提交到git服务器,我们需要进行显式的操作:
-
git push origin <tagname> 推送某个标签到远程。
如: git push origin v0.1.2 , 将v0.1.2标签提交到git服务器
$ git push origin v1.0
Total 0 (delta 0), reused 0 (delta 0)
To github.com:michaelliao/learngit.git
* [new tag] v1.0 -> v1.0
- git push origin –-tags 将本地所有标签一次性提交到git服务器
3.删除标签
- 如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
- git tag -d v0.1.2 删除本地标签
$ git tag -d v0.1
Deleted tag 'v0.1' (was f15b0dd)
- 然后,从远程删除。删除命令也是push
- git push :refs/tags/v0.1.2 删除远程tag
$ git push origin :refs/tags/v0.9
To github.com:michaelliao/learngit.git
- [deleted] v0.9
git diff 差异化
比较暂存区和当前的版本的差异,此命令比较的是工作目录(Working tree)和暂存区域快照(index)之间的差异
也就是修改之后还没有暂存起来的变化内容。
- git diff 查看修改内容
- git difftool 分屏比较
- git diff sha1 sha2 比对2个不同的版本
- git difftool sha1 sha2 分屏对比
git check 补充
-
git checkout --datch <branch> 切换到某一个分支的最后一次commit值状态
-
git checkout -B <branch> 强制创建新的分支, 并覆盖掉原来同名的分支
-
git checkout --orphan <branch> 根据当前分支,创建并切换到一个无历史的新分支.注意:该新分支需要commit 一次以后才会存在.
-
git checkout -p <branch> 这个命令主要用来比较两个分支间的差异内容,并提供交互式的界面来选择进一步的操作。这个命令不仅可以比较两个分支间的差异,还可以比较单个文件的差异!
-
**git checkout --merge ** 切换分支的时候,将当前分支修改的内容一起打包带走,同步到切换的分支下.
有两个需要注意的问题:
第一,如果当前分支和切换分支间的内容不同的话,容易造成冲突。
第二,切换到新分支后,当前分支修改过的内容就丢失了。
所以这个命令,慎用! -
git checkout -- file 可以丢弃工作区的修改
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
git简写
git st # git status
git ci # git commit
git br # git branch
git co # git checkout
git mg # git merge
git line # git log --oneline
git md = commit --amend
git dt = difftool
git mt = mergetool
git last = log -1 HEAD
git cf = config
git stash 保存工作区
- git stash 保存内容(入栈) 切换分支的时候不会让另一个分支看到
- git stash pop 回到最初保存的内容
md5加密 不可逆
- echo -n 123456 | openssl md5
- -n就表示不输入回车符
- 结果 e10adc3949ba59abbe56e057f20f883e
base64加密/解密
-
加密
- echo abc | openssl base64
- YWJjCg== (编码结果)
-
解密
- echo YWJjCg== | openssl base64 -d
- abc (解码结果)
-
wc 统计字节数
- wc -l filename 报告行数
- wc -c filename 报告字节数
- wc -m filename 报告字符数
- wc -w filename 报告单词数
gitignore 忽略文件
创建 .gitignore文件, 图形化界面不能创建
-
node_modules/ node_modules下的所有文件都不提交
-
node_modules/.jpg* node_modules/123.jpg图片不提交但是node_modules/sunke/456.jpg可以提交
-
.idea/* .idea 下的所有文件都不提交
-
*.png 忽略所有的 .png 结尾的文件
-
!xxoo.png 但排除 xxoo.png
想把某些目录或文件加入忽略规则,按照上述方法定义后发现并未生效,原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交
- 注意不要漏了最后面点号
- git rm -r --cached .
- git add .
- git commit -m 'update .gitignore'
git 三种状态
-
对于任何一个文件,在 Git 内都只有三种状态:
- 1.已提交(committed)
- 2.已修改(modified)红色状态
- 3.已暂存(staged) 绿色状态
-
已提交表示该文件已经被安全地保存在本地数据库中了;
-
已修改表示修改了某个文件,但还没有提交保存;
-
已暂存表示把已修改的文件放在下次提交时要保存的清单中。
-
所以Git 管理项目时,文件流转分为三个工作区域:
- 1.工作目录
- 2.暂存区域
- 3.Git仓库
-
工作目录:对项目某个版本独立提取出来的内容。从Git仓库的压缩数据库中提取出来的内容。
-
暂存区域:本质是一个文件,保存下次将提交的文件列表信息,一般在Git仓库目录中。有时候也称作“索引(Index)”。
-
Git仓库:Git用来保存项目源数据和数据库的地方。这是Git种最重要的部分,其他计算机克隆仓库时,拷贝的就是这里的数据。
git创建仓库步骤
- 1.git init 初始化一个空的git仓库
- 2.如果没有配置用户,需要配置用户名,邮箱,来区别用户
- 3.git status 查看当前文件状态
- 文件状态三种:
- 红色: 修改状态/未纳入版本控制
- 绿色: 暂存状态
- 什么都没有 已提交
- 4.git add 文件名称 把文件添加到暂存区域
- git add . 代表当前文件夹在开发中经常用
- git add * 所有文件
- git add -A 所有文件
暂存区域其实是一个文件,索引文件 index
在此文件中记录了那些文件要被提交到仓库中
-
5.git commit -m"提交的描述信息"
- 把暂存区域的内容提交到 .git 仓库中,并生成一个版本记录
-
6.git log 查看所有的版本记录.
-
7.git push
git命令的bug
错误1:
$ git push ../../share/MJD.git/
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream ../../share/MJD.git/ master
- 原因:如果当前push的本地仓库是共享仓库clone的仓库, 需要指定当前工作目录工作分支,和远程仓库分支之间链接关系,开始只需要指定一次
- 解决:
git push --set-upstream ../../share/MJD.git/ master
gitb11.png
错误2:
warning: push.default is unset; its implicit value is changing in Git 2.0 from 'matching' to 'simple'.
事实上这并不会影响你push的结果,最终push还会成功,因为这只是一个”warning“。
解决:执行git config --global push.default matching或者git config --global push.default simple命令,以后再push就不会有警告了。
补充:push.default matching 和 push.default simple的区别:
-
push.default 设置maching的意思是:git push 会把你本地所有分支push到名称相对应的远程主机上。这意味着可能你会在不经意间push一些你原本没打算push的分支。
-
push.default 设置成simple的意思是:git push仅仅把当前所在分支push到从当初git pull pull下来的那个对应分支上,另外,这个过程也会同时检查各个分支的名称是否相对应。