笔记
git
是一个代码的历史版本管理工具,通过用树形结构管理一个代码版本可以快速实现回滚等操作
git基本概念
工作区:一个文件夹,独立于各分支
版本库:将一个版本用树的形式存下来
暂存区:工作区与版本库之间的一个桥梁
工作区(先) –> 暂存区 –> 放进版本库
git
构成有向树图,定义HEAD
指针概念
HEAD
指向当前版本
如何将新的历史版本放进版本库?
首先在工作区编写代码,将当前版本里所有文件放进暂存区后,保存新的历史版本到HEAD
指向的位置,HEAD
节点后移一位
git常用命令
1. 设置信息
git config --global user.name # 设置用户名
git config --global user.email # 设置全局邮箱
信息设置在了~/.gitconfig
文件中
2. 将一个文件夹配置成仓库
git init
所有的信息放在了.git/
隐藏文件夹中,此文件夹是一个树状结构
git status # 可查看仓库状态,看文件有无存进暂存区等
git add # 将文件加进暂存区
git add . # 全部加入暂存区
3. 将历史版本存进版本库里
git commit -m 备注
更新代码
git status
git add 更改文件名
此时在输入git status
,当文件名变绿说明已经放进了暂存区,输入git commit -m
则表明永久存下来,放入了新节点
具体操作的结果如下图所示:
4. 查看某个文件与当前分支最新的版本区别(暂存区与最新版本的区别)
查看暂存区与当前工作区区别
git diff:当工作区有改动,临时区为空时,diff的对比是“工作区与最后一次commit提交的仓库的共同文件”;当工作区有改动,临时区不为空,diff对比的是“工作区与暂存区的共同文件”。
git diff + xxx
5. 从暂存区删除
git rm --cached xxx
git restore --stage xxx
两者的区别在于,前者属于不希望管理该文件,将文件从列表中删除出来,后者属于仍管理文件,但从暂存区中取出
6. 查看当前分支(从最初起点走到当前head的路径)的所有版本
git log
顺序从下向上显示,按q
退出
git log --pretty=oneline
7. 往前回滚某一个历史记录
git reset --hard HEAD^
git reset --head HEAD ~
一个~
一个版本,两个^^
两个版本,~
与^
相同
回滚并不会将内容删掉
实现回退回来:
git reflog # 查看HEAD指针的所有的移动记录
在给出的移动记录中,会有每一个点的编号,即哈希值前7位
回滚到任意结点
git reset --head 版本号
重点:git log
与git reflog
的区别
git log
从起点到当前HEAD
节点的路径
git reflog
HEAD的所有的移动历史节点
恢复文件
主要的背景是:当前文件修改放在暂存区,但是想恢复到未修改前的状态
下面是将文件未存入暂存区的删除
git checkout - 文件名 或 git restore 文件名
其中git restore
并非回滚到上一个历史版本,而是从工作区回滚到暂存区版本
如果回滚到暂存区后,暂存区也不想留,可输入以下命令
git restore --stage 文件名
8. 持久化
git commit -m # 将暂存区持久化
commit
可以只commit
一部分。
9. 删除文件
一开始,与一般的文件命令管理一样
rm 文件
在文件删除的操作完成后,需要进行持久化
(这里指的是将操作持久化)
如果文件不小心删除,要回滚回去
git restore 文件名
前提是:修改文件已经从暂存区中拿出
10. 云端
将文件的分支存到云平台,用图形化的方式来看代码
在这需要提醒几点
1. 所谓的使用自述文件初始化仓库,如果是将自己已有的自有文件/文件夹,请将其去勾
2. 由于git
通过ssh
与swp
进行传递,因此需要用到密钥,与之前ssh
传递密钥的方式一致
方法如下:
在AC git
中,点击偏好设置,点击ssh密钥
在Terminal
中,取出ssh公钥,具体方式见: 链接如下 链接
中的密钥登录,粘贴到网站中,网站会自动取出标题,配置完成
将本地仓库推送到远程仓库(在终端)
git remote add prigin 服务器名
git push -u origin master
有几点需要了解
master
分支
master
:默认创建的分支即为主分支,origin
云端分支
云端创建一个完全一样的版本库,一般称为origin
,但云端其实也有一个master
迁移至其他服务器
git clone ssh/http地址
通过此方式,扒下云端,实现克隆
分支操作:
一般来说,在开发的时候不会在主分支上开发,会另开新分支(个人开发除外),分支可以任意节点出发创建新节点
git checkout -b # 创建并切换到新分支
git branch # 展示自己有哪些分支,*说明该分支为当前分支
git checkout master #切换至master分支
注:暂存区是与分支是一个独立的存在,commit
的操作是持久化当前分支
合并分支
git merge branch_name # 将某一分支最新版本合并到当前分支的当前节点上
在此命令下,实现了快速合并模式,也就是说,直接将master
的HEAD
节点放到了dev
中-no-ff
可以关闭快速合并模式
删除分支
git branch -d branch_name # 删除分支
删除时会产生冲突————————master分支更新的同时新分支更新,产生合并冲突
解决方法:根据自己想要的意愿手动修改
这样一次合并修改,使得一次出现了3个版本
分支推送到云端
git push -u # u第一次不用加
将本地的某个branch_name
分支推送对应远程的branch_name
分支
git push --set-upstream origin branch_name
如果云端没有对应的分支则需要在云端自己创建
删除云端分支
通常有的时候本地分支被删,云端分支不一定被删,云端分支被删,本地分支不一定被删,两者是相互独立的
注:去其他分支才能删除本地分支(在终端中)
git push -d origin branch_name # 删除远程仓库的branch_name 分支
将云端分支绑定到本地
先在本地建一个同名的分支:
git checkout -b branch_name
再让远程的branch_name1
与branch_name2
分支做对应
git branch --set -upstream-to=origin(branch_name1 branch2)
随后用
git pull
将远端分支的内容拿下来
综上所述
如果到个人开发,一般常用的就如下几条命令:
git init
git pull
git add .
git commit
git push
如果在仓库关联的时候出现:
remote origin already master
说明关联可能在之前的时候已经存在
这样需要将命令改成
git remote rename origin xxx