git 学习
学习廖雪峰的git教程,顺便看下是否有别的知识
https://www.liaoxuefeng.com/wiki/896043488029600
安装
打开git
机器自报家门 名字和email
git config --global user.name "your name"
git config --global user.email "email@example.com"
创建repository 简单讲就是代码库,代码库里面有若干程序,执行若干功能
找到合适的地方,创建空目录
mkdir learngit
cd learngit
pwd
在这里 git inits
在目录下打开隐藏的目录,能看到.git
时光穿梭机,版本管理 可向前找到对应的版本并恢复,也可以向后找到对应的版本并恢复
git status 查看git的状态
在repository里面创建readme.txt
git diff 用来查看修改了哪些东西
git add 添加 文件/文件名
git commit -m "message的意思,这里可以添加备注"
版本回退与前进
git log查看历史log 可以回退版本
每次commit 有自己的版本号
git reset --hard 10dfsfd 这样就回退回对应的版本了
git reflog 查看命令历史 可以向前进版本
git reset --hard
工作区与暂存区
working directory 工作区 就是电脑里能看到的目录
repository 就是版本库,就是管理的这么一个库
stage index 暂存区 这里是git的版本库里最重要的东西之一,还有就是master的分支,以及指向master的一个指针
git add 是把文件->暂存区
git commoit 提交更改 实际上是把暂存区的所有内容提交到当前分支
管理修改
git跟踪并管理的是修改,而非文件
也就是说,要提交的所有东西统统要git add进去之后 统一git commit
commit后用 git diff HEAD --readme.txt 命令查看工作区和版本库里面最新版本的区别
第一次修改后 git add 第二次修改后 git add 之后 git commit
git checkout --file 可以丢弃工作区的修改! git checkout --readme.txt
把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是没有放到暂存区 没有 add ,撤销修改,就回到和版本库一模一样的状态,就是回到上一次git commit之后的状态 因为新的add没有执行
一种是放到暂存区 有add ,又做了修改,撤销修改 就回到添加到暂存区后的状态 就是回到上一次git add之后的状态 因为commit没有执行
这里看这个东西的作用就是修改工作区的内容,实际中需要用git来修改工作区的内容吗
应该是第二种比较有用,就是撤销一次add,比如添加了账号之类的敏感信息,检查时发现
否则,工作区的修改,不应该放在git上面来操作,感觉更应该是本地来操作
git reset HEAD <file>可以把暂存区的修改撤销掉,重新放回工作区
目前还没有把自己的本地版本库推送到远程版本库
删除文件
删除也是一个修改操作,先添加一个新文件 test.txt 到git
rm test.txt
git status 命令会告诉你哪些文件本删除了
从版本库里面删除该文件 git rm 并且git commit
另一种情况是删除错了,因为版不哭里面还有呢,所以很轻松地把误删的文件恢复到最新版本
git checkout -- test.txt git checkout 其实是用版本库里面的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
如果是误删,不用担心,但是要小心,只能回复文件到最新版本,你回丢失最近一次提交后你修改的内容
远程仓库
用github来保存管理
1 创建ssh key 在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有is_rsa和id_rsa.pub这两个文件,如果有,直接跳过
如果没有 ssh-keygen-t rsa -C "your email@example.com"
id_rsa 是私钥 不能泄露出去 id_rsa.pub 是公钥,需要告诉别人
2 登录github 打开 accout setting ssh keys 里面
点击 add ssh key 填上title 粘贴 id_rsa.pub文件的内容
点击add key 应该看到已经添加的key
这里操作就相当于是做验证,每次推送 github验证一下,你有私钥 每台电脑的key 都添加到github 就可以在每台电脑上往github推送了
添加远程库
本地一个git仓库,github 一个git仓库,并且让这两个仓库同步
首先登陆github,然后 create a new repo 按钮 创建一个新的repo
name 填入learngit 点击create repository
这里也就是说你的账号的ssh 对应github一个账号的repo
那我本地的另外一个文件的 ssh 对应github 里面的东西? github 可以添加多个key 应该和这个有关系
在本地的learngit仓库下运行
git remote add origin git@github.com:michaellio/learngit.git
michaellio 替换成github的账户名 如果不换,以后推送是推送不上去的因为你的ssh key 公钥不再这个人的账户列表中
远程库的名字就是 origin 这是git 的默认叫法
下一步把本地库的所有内容推送到远程库上面
git push -u origin master
本地推送到远程 git push 命令实际上是把当前分支master推送到远程
加入 -u git不但会把本地的master 分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支联系起来,以后的push或者pull时就简化命令
本地做了提交 就可以通过命令
git push origin master
把本地的master分支的最新修改推送至github
从远程clone
远程建立一个gitskills的repo
从本地克隆远程的一个库
git clone git@github.com:michaellao/gitskills.git
分支管理
每次commit git 把它们串成一条时间线,就是一个分支,在git里叫主分支,master分支,head 不是指向提交,而是指向master,master指向提交
也就是说,这里理解起来的话,需要多add 一个东西,commit 指向master master 指向提交
当我们创建一个新的分支,dev 分支,git新建了一个指针dev,指针指向master相同的提交,再把head 指向dev
除了增加一个dev指针,改改head的指向,工作区的文件没有任何变化!
从现在开始,对工作区的修改和提交就是针对dev分支了,而master 指针不变
在dev上的工作完成了,就可以把dev 合并到master 上。最简单的办法,就是直接把master指向dev
合并完成后,可以删除dev分支,删除一个指针,剩一个master分支
首先,创建dev 分支,然后切换到dev分支
git checkout -b dev
相当于两条命令
git branch dev 创建dev分支
git checkout dev 切换到dev分支
git branch 命令查看当前分支
当前分支会有一个*号
切换回master分支 就是 git checkout master
现在 把dev 分支的工作成果合并到master分支上
git merge dev
合并完成后可以删除dev 分支
git branch -d dev
因为创建、合并和删除分支非常快,所以git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,过程更安全
废弃掉checkout 用来切换分支,改用switch git switch master 就是切换到master分支
git switch -c <name> 创建并切换分支
如果dev 分支修改一个文件,master分支修改一个文件,就会造成最终merge 出现问题,此时
git log 查看分支的合并情况
git log --graph 可以看到分支合并图
分支管理策略
merge时,git会用fast forward模式,但这种模式下,删除分支后,会丢掉分支信息
如果强制禁用fast forward模式,就会在merge时生成一个新的commit 这样,从分支历史上就可以看出分支信息
git merge --no-ff -m "merge with no-ff" dev --no-ff 表示禁用fast forward -m表示commit参数
合并后用git log 查看分支历史
在实际中,
首先,master分支应该是非常稳定的,仅用来发布新版本
干活在dev分支上,dev分支是不稳定的,到某个时候,再把dev分支合并到master上,在master分支发布1.0版本
你和你的同事都在dev分支上干活,每个人都有自己的分支,时不时往dev分支上合并就可以了
bug分支
git stash 把当前工作现场存储起来,等以后恢复现场后继续工作
git stash apply 恢复,恢复后 stash内容并不删除,需要用git stash drop来删除
另一种是用git stash pop,恢复的同时把stash内容也删除了
git stash list查看,就看不到任何stash内容了
把bug也在dev上面修复,并且复制到dev分支上
commit 会有记录,4c805e2....
git cherry--pick 4c805e2
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除
多人协作
当你从远程仓库克隆时,git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin
要查看远程库的信息 git remote
也可以看更详细的 git remote -v
推送分支
git push origin master 把本地的master分支推送上去
git push origin dev 把本地的dev分支推送上去
master是主分支,时刻与远程同步
dev是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步
bug分支只用在本地修复bug,不必要推送
feather是否推送到哦远程,取决于是否合作开发
rebase分支
git rebase
git log 查看
rebase操作的特点:把分叉的提交历史 整理成一条直线,看上去更直观。缺点是本地的分差提交已经被修改过了
~/learngit name$ git push origin master
标签管理
切换到需要打标签的分支上
git tag v1.0
git tag v0.9 f423423 (commit)的东西
git show <tagname> 可以查看标签信息
git tag -a v0.1 -m "version 0.1" 可以说明文字
标签打错了,可以删除
git tag -d v0.1
如果要推送某个标签到远程,使用命令 git push origina <tagname>
或者一次性全部推送到远程的本地标签
git push origin --tags
如果要删除远程标签,线删除本地的
git tag -d v0.9
然后从远程删除
git push origin :refs/tags/v0.9

浙公网安备 33010602011771号