前置知识
在GIT 中, 有两个 [偏移符号] :
^
和~
^ 的用法 :
在 commit 的后面加一个或多个^
号 , 可以把commit 往回偏移,偏移的数量是^的数量
例如master^
表示 master 指向的 commit 之前的哪个 commit ;
HEAD 所指向的 commit 往前数两个 commit
~ 的用法:在 commit 的后面加上~
号 和一个数 可以把 commit 往回偏移, 偏移的数量的是~
号 后面的数 例如HEAD~5
表示 HEAD 指向的 commit 往前数 5个 commit
- reset 和 rebase 都会用这个 但是参照点不一样
reset 是 HEAD 回退到历史版本,到当前版本 差异值
rebase 是重新定义基准点 基本点以后所有commit 都可以操作
版本回退
基本使用
重置位置的同时,清空工作目录和暂存区的所有内容;
1、git reset --hard:
重置位置的同时,保留工作目录和暂存区的内容,并把重置 HEAD 的位置所导致的新的文件差异放进暂存区。
2、git rest --soft:
(默认):重置位置的同时,保留工作目录的内容,把暂存区和重置 HEAD 的位置所导致的新的文件差异都放入工作目录
3、git rest --mixed
4、git checkout 文件名
5、导出历史记录
history > 文件名
注意:
- git checkout
。
后面是有点的
应用场景
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file 还没执行git add添加到暂存区
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD ,就回到了场景1,第二步按场景1操作执行了git add添加到了暂存区
已经提交了不合适的修改到版本库时,想要撤销本次提交 首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,上一个版本就是HEAD^ , 上上一个版本就是HEAD^^,当然往上100个版本写100个 ^比较容易数不过来,所以写成HEAD~100。
配置用户
- 不配置不能提交代码
git config --list
git config --global user.name 你的名字
git config --global user.email 邮箱
关联远程
- git remote add 标识名(master) 远程地址 本地关联远程仓库
- git remove -v 查看关联远程仓库
分支
- 创建分支
git branch 分支名
- 删除分支
git branch -d 分支名 // 删除分支名 (不能在当前分支删除当前分支)
- 查看本地分支
问题: 当你新创建的一个分支 并跳到新的分支上 此时是查不到当前创建的新的分支的
分支的原理: 分支的出现最少要一个commit
链接参考 :分支原理
git branch
- 查看
远程
所有分支
git branch -a
git branch -r
区别: git branch -a 显示 不全
别人在远程提交新分支仓库,本地没有git fetch的话,使用git branch -a是查看不全的,所以有新分支出现一定要先git fetch再git branch -a
分支之间文件界限问题
注意:当你在主分支 创建一个分支 并添加文件 此时的文件是属于主分支还是 分支 (主要看你在那个分支把这个文件添加到 历史区 之后两个分支就没关系了)
git stash 分支有更改 不能直接切换 可以提交更改或者暂存更改 暂存使用 过渡区覆盖掉工作区
git pop 还原 暂存区的修改
- 本地创建分支 并且跳转
git checkout -b rights // 创建并跳转 rights
- 查看本地有几个分支 并查看当前在那个分支
git branch
- 推送到云端 (是第一次推送 需要设置 -u origin 云端仓库的别名)
git push - u origin rights // 本地分支推送到云端 为云端创建一个分支
变更 commit
git commit --amend 该写最近一次的 commit
该写以前的 某个 commit
git rebase -i 版本号(
你要变更的版本号的前一个 或者是 父亲 被选的版本号是不被包含的 ) 会弹出的 交互式的 把要改的记录 pick 变更为 reward
连续的多个 commit 整理成一个commit
git rebase - i把间隔几个commit 整理成一个 commit
git rebase - i 把要合并的间隔分支排列一起 留一个 pick 其他的改为 s
合并分支
合并的方式有两种:快速合并 和 三方合并。
快速合并
如果分支A当前的修改,是完全基于分支B的修改而来,则B分支合并A分支,就是移动指针即可。
在不具备快速合并的条件下 会采用三方合并
三方合并,它是把两个分支的最新快照(2 和 3)以及二者最近的共同祖先(1)进行三方合并,合并的结果是生
成一个新的快照(并提交)
合并冲突
两个分支进行合并,但它们含有对同一个文件的修改,则在合并时出现冲突,git无法决断该保留改文件哪个分
支的修改。
- 合并分支
合并到主分支 切到主干 在合并
把其它分支 合并到 主分支
git branch
git checkout master
git merge 分支名
- 出现冲突后 如果由两个开发人员当面协商 该如何取舍 为冲突文件定义最终的内容
- 解决方案 一、保留某一方 删除另一方的 二、保留双方的 三、但无论如何 要记住删除 <<< ==== >>>
修改本地分支名称 && 新建远程分支
修改分支名称
git branch -m 'BYFramework'
新建远程分支
git push origin BYFramework:BYFramework
git 对比
git 对比
git diff
git diff 分支名 分支名 // 比较两个分支的差异
git diff 分支名 分支名 文件名 //比较两个分支下的某个文件差异
git diff – cached // 工作区和暂存区比较 比较所有文件
git diff – 文件 // 单独比较
- git diff : 比较工作区与暂存区
- git diff --cached : 比较暂存区与版本区
- git diff master : 比较工作区与版本区
linux 命令
history >xxx.txt 把历史操作步骤输出
pwd //打印当前目录 print working directory
rm -rf 文件名 // 删除文件
mkdir 文件夹名字 // 创建目录
cd 目录名 //跳到指定目录 changde directory
ls -al // 显示目录下所有文件
cd .. //返回上一级目录
cat 文件名 (1.text) // 显示文件内容
mkdir xxx 新建文件夹
vi x.txt 新建文件(Visual editor)
输入 i 进入编辑模式
ESC + :+ wq 保存并退出
clear // 清屏
i: 插入模式 esc退出编辑模式
:q!强制退出 (加冒号)
:wq 保存退出
clear 清空小黑窗
touch 文件名 文件名
echo hello >> 1.txt // 向1.txt文件中输入 hello (> 一个代表输入 两个代表追加)
DOS 命令
查看电脑的IP地址: ipconfig / ipconfig -all
查看自己的网络状况
ping www.baidu.com -t
exit 关掉DOS命令窗口
cls 清屏
文件夹
cd ../ 返回当前文件夹目录上一级目录
cd ./当前目录
cd / 当前磁盘的根目录
D: 直接进入到D盘
cd 文件名 进入指定文件夹
dir 看当前文件夹有什么文件 隐藏的也可以看
git的分区
git 工作区 (git add .)
=> 暂存区 (git commit -m)
=> 历史区 /版本区
一个版本对应一个版本的ID号
git log // 查看版本号
git reflog // 所有版本号
git status 查看状态 `红色` 工作区
git status 查看状态 `绿色` 暂存区
git status 查看状态 `无色`
远程仓库
- .gitignore 文件会忽略 写入的文件
- git不会上传空的文件
git remote add origin 地址 // https://gitee.com/你的码云用户名/testgit //添加远程仓库
git push -u origin master
- 线上和线下不一样的时候 先把线上拉下来 再push
工作中
- 初始化 clone远程库 获得项目 会创立本地库
git clone url
克隆指定分支
方式一、
注意:这个仅仅在第一次 clone 指定分支项目 用 后面 再次 拉其他分支 不能用这种方法
命令: git clone -b 分支名称 仓库地址
默认克隆master命令: git clone 仓库地址
#切换源地址
git remote set-url origin http://xxxxxx/xxx/pms-xxx.git/
#clone不同分支
git clone -b dev http://xxxxxx/xxxx/pms-xxx.git
方式二、
// 默认本地已经存在 项目
1、切换分支
git checkout dev
2. 更新远程分支 到本地
git pull origin dev
3、提交到远程分支
git add .
git commit -m 'xx'
git push origin dev
//-------------------->
git pull origin dev
等价于:
git fetch origin dev
git merge origin/dev
- 注意 多人协作同时 每次在push 到远程库前 都先做一次 pull
一、 把远程内容合并到本地
二、核实本地内容是否和远程内容有冲突
git pull
git push
修复BUG 操作流程
1、当你接到一个修复一个bug的任务时,很自然地,你想创建一个分支来修复它,但是,等等,当前正在dev上进行的工作还没有提交。
2、并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
3、幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。
git add .
$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge
4、然后确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支;修复完成后,切换到master分支,并完成合并,最后删除分支;此时,你只需要回到dev分支上,你会发现现在的工作区是空的;
$ git checkout dev
Switched to branch 'dev'
$ git status
On branch dev
nothing to commit, working tree clean
- 用git stash apply恢复,但是恢复后,git stash list 内容并不删除
- git stash drop来删除 用git stash pop,恢复的同时把stash内容也删了 再用git stash list查看,就看不到任何stash内容了
回退版本的恢复
- 通过git log -g命令来找到需要恢复的信息对应的commit 版本号 可以通过提交的时间和日期来辨别
- 通过git branch recover_branch commitid 来建立一个新的分支
- 这样,就把到commitid为止的代码、各种提交记录等信息都恢复到了recover_branch分支上了
追踪问题并修复指定版本
现在,你已经决定要解决你的公司使用的问题追踪系统中的 #53 问题。
想要新建一个分支并同时切换到那个分支上,你可以运行一个带有 -b 参数的 git checkout 命令:
git checkout -b iss53
不小心把配置文件提交到仓库
- 移除文件
1、要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除)
从工作目录中手工删除文件
2、然后再运行 git rm 记录此次移除文件的操作
推远程 强制更新
设置别名
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status