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

 

posted @ 2021-01-05 20:46  小小jyy  阅读(124)  评论(0)    收藏  举报