linux学习记录(git) 10.9 ~ 10.10
知识点:
git-版本管理工具,一个树的结构来维护所有历史版本,可持久化,支持多人合作
(红)工作区:仓库的目录。工作区是独立于各个分支的。 =》 (绿)暂存区:工作区写入版本库前的缓存区 =》 版本库:将所有版本用一棵树的形式存下来
每次head只会处于一个结点,
要将当前暂存区存到版本库里的时候,就会在当前链表的后面插入一个新的结点,然后将暂存区里的内容,放到新的结点里面,同时head往后移一位
git config –global user.name xxx = 设置全局用户名,信息记录在~/.gitconfig文件中
git config –global user.email xxx@xxx.com = 设置全局邮箱地址,信息记录在~/.gitconfig文件中
mkdir project
进入peoject 然后 get init = 将当前目录配置成git仓库
git status = 查看当前仓库状态
get add = 将文件加到暂存区里
get commit -m “add readme.txt” = 将暂存区里的内容提交到当前分支 -m 后面加的是备注
git diff readme.txt = 一般用于刚在工作区修改,还没有git add修改到暂存区,此时比较工作区修改和暂存区的区别,暂存区没有内容,会和HEAD所指比较
(比较已经写入暂存区和已经在工作区被修改但未写入暂存区的区别,暂存区没有内容,就是和HEAD所指比较)
git restore readme.txt = 一般用于在工作区修改了,但还没有git add修改到暂存区,撤销工作区的更改,回滚到暂存区存的内容
(将工作区的内容撤销更改,回滚到暂存区存的内容,如果暂存区没内容,就回滚到HEAD指向内容)
git restore –staged readme.txt = 一般用于在工作区修改了,已经git add修改到暂存区了(暂存区被更改),撤销掉暂存区内容(暂存区会直接没内容了),但工作区文件内容并不变
(把暂存区的文件内容撤销,但原工作区不更改,–staged表示只更改暂存区)
比如:readme.txt一开始内容111,在工作区,git add,到暂存区,然后git commit到版本库HEAD所指分支上(HEAD上现在是111),现在修改readme.txt为111 222(工作区),git add修改到暂存区(暂存区当前 111 222),然后git restore –staged readme.txt ,将111 222版本从暂存区撤出(撤销暂存区修改,暂存区现在没有内容),并且不更改工作区readme.txt文件的111 222版本,git diff,是和HEAD上的111比较,发现显示多了一行222
***git restore –staged readme.txt 《=》 git rm –cache readme.txt
小区别:rm对于当前文件不想管理了(不追踪了),git restore –staged 还想管理文件,只是从暂存区拿出来
git log –pretty=oneline查看当前从最初起点走到当前HEAD的路径,查看当前分支的所有版本
切换成之前的状态(回滚):
git reset –hard HEAD^ 或者:git reset –hard HEAD~
一个^回滚一个版本
回滚不会删掉内容
回退回来?
git reflog = 显示所有HEAD的移动记录
可以找到每个版本的哈希值编号-版本号(前七个字母)
然后
git reset –hard 版本号 = 回滚到特定版本
并且将当前目录下存储的文件恢复到某状态
恢复文件
在工作区修改,但没git add到暂存区,不想修改了,想恢复
git restore readme.txt
其实就是将工作区最新修改撤销掉,回滚到暂存区存的内容,如果暂存区没内容,就回滚到HEAD指向内容
git restore –staged readme.txt
将暂存区删掉,工作区不变
当前分支叫主分支,master
commit 是将暂存区可持久化
可以只commit一部分文件
删文件也可以放到暂存区
本地仓库存到远程
git remote add origin git@git.acwing.com:tkw/project.git = 将本地仓库关联到远程仓库
git = 用户名
git.acwing.com = ip地址
tkw/project.git = 文件夹
当前project目录(本地仓库),映射到了git.acwing.com:tkw/project.git这个目录
git push -u origin master 推送当前分支(master)
git clone git@git.acwing.com:tkw/project.git 从远程仓库下载到当前目录下(换服务器时候,把项目迁移到新的服务器上)
创建分支:
git checkout -b +name = 创建一个新的分支并切换到当前分支
git checkout master = 切换到master分支
git branch = 查看所有分支和当前所处分支
git branch +name = 创建一个新的分支
git branch -d +name = 删除一个分支
暂存区和分支没关系,完全独立,不会因为有多个分支就有多个暂存区
git commit 是可持久化到当前分支后面
git merge dev(分支名)= 将某分支合并到当前结点上
合并时候不一定完美合并,可能有冲突
git push 将本地内容提交到云端 -u第一次要加
push的时候,如果云端没有分支,就需要在云端创建这个分支
git push –set-upstream origin dev3(分支名)
云端分支和本地分支比较独立,云端分支被删,本地不一定被删,本地分支被删,云端也不一定被删
git push -d origin dev3(分支名) = 删除云端的分支
git branch –set-upstream-to=origin/dev4 dev4 = 将云端分支和本地分支绑定到一块
git pull = 将云端内容拉下来同步到本地,并与当前所处分支合并(有相同分支时/有对应分支)
git fetch = 从远程分支拉取代码,git fetch + git merge = git pull
git pull origin dev5 = 连带云端的分支+内容一起拉到本地并合并到当前分支(没有对应分支)
***小结:本地分支合并本地分支:git merge 本地合并云端分支:git pull(本地和云端有对应分支时) git pull origin 分支名 (不管本地和云端有没有对应分支)
本地上传到云端:git push(本地和云端有对应分支) git push –set-upstream origin 分支名 (本地和云端没有对应分支)
stash概念:
存储所有历史上没有被可持久化(commit)的修改
git stash = 将当前修改(工作区和暂存区)存到一个栈里
(在修改的时候,突然服务器崩了,我们不想commit修改,可以先把修改存到一个栈里)
git stash list = 查看当前栈中内容
git stash pop = 弹出栈中内容
多人合作,在不同服务器下 :
两个人都 git push 一个版本上去,第二个人发现有冲突,要先 git pull 从云端拉下来,然后解决冲突,再 git push 上去
(现实一般没有冲突,因为两人一般写的是不同文件)
本地删仓库:
rm project -rf