重学git -- 上
1.基本命令
git log # (提交记录) 查看 git commit 记录,包含head(版本号) 作者 提交时间 提交说明
git reset --hard 版本号 # 可以回退到相应的版本 -- head is now at 版本号
执行过 git reset 后 再执行git log 则 log 里面回退节点后面所有的提交记录就看不到了,如需要转到消失的提交记录位置,则可以执行以下操作:
git reflog # (操作记录) 包含所有的提交记录及回退记录,包含head(版本号) 操作详情 如果是commit的操作记录,也会有提交说明
git reset --hard 版本号
一般在合并完需求、功能分支之后,会删除对应分支
git branch -b 分支名
分支
master 作为正式分支 主要是基础版本
dev 一般作为版本迭代的开发分支
feature-xxx 需求分支、功能分支
初始化
1.线上新创建的仓库和本地关联
git remote add origin https://gitxxx.com/xxx/xxx.git 添加源地址 并设置别名为origin
git push [-u] origin master # 推送本地主分支到远程
git push [-u] origin 其他分支 # 推送本地xxx分支到远程
2.如直接拉取线上仓库 git clone内部已实现 git remote origin https://gitxxx.com/xxx/xxx.git
git branch # 此时只会显示主分支的分支名称
但是其实远程所有分支都被拉取了 执行
git checkout dev # 如果远程存在此分支 则会直接切换到此分支 并且同步此分支所有状态
如果希望从本地新建分支 并推到远程 则可
git checkout -b feature-0806
git push [-u] origin feature-0806
如果远程先从master基础上新建了分支 则可以建立关联即可
git branch --set-upstream-to=origin/feature-0806
bug修复工作流
如何处理紧急bug修复
保证在线上正式运行的分支上执行
git branch bug
git checkout bug
git add .
git commit -m "bug修复完成"
git pull # 拉取最新状态 防止共用此分支协同解决bug的伙伴 提交了冲突代码 可以在本地解决冲突,再提交 如检测到了冲突 则解决完冲突 执行下两句 否则跳过
[git add .
git commit -m "解决合并冲突"]
git push
确保协同解决bug结束 进行整体合并到线上运行分支
git checkout 线上运行分支
git merge bug
git pull 线上运行分支
如有冲突,则解决冲突后,执行下两行 否则跳过
[git add .
git commit -m "解决线上运行分支与本地冲突"]
git push
完成整体修复
线上冲突工作流
如果由于误合并导致线上发生了冲突,则可以本地执行以下命令进行本地解决
[git fetch # 此时就可以看到冲突代码了
解决完之后再执行
git merge origin/dev] # 两行指令,同git pull origin dev
git add .
git commit -m "本地解决冲突"
git push
2.入门概念
.git目录说明及图示请参考RUNOOB
1.工作区 (状态:已管理、新增、修改)
2.暂存区(文件会被提交到暂存区后,状态变为绿色,即可提交版本库状态,git add 可以连续执行,因此可以在提交版本前多次修改维护,所以称之为暂存)
3.版本库(commit 后 会生成 响应的版本 会有版本号 commit id ,可以作为回退的节点)
git 的管理是文件级别的,比如你在工作区增加一个空文件夹,或者重命名一个空文件夹是不会进行监控管理的,一旦文件夹里新增文件,或者更改有文件的文件夹名字,则可以监控到,相当于新增了某个目录下的某文件及删除了更名前文件夹了的文件且新增了一个有文件的文件夹,不存在重命名,只存在文件修改、删除文件、新增文件
shell 文件[夹]删除 rm -f xxx.txt rm -d xxx 空文件夹 rm -rf xxx 文件夹中有文件
1. 状态、版本管理
未被管理的文件通过 git add 会加入缓存区
通过git commit 会加入版本库 生成一次提交log
工作区文件替换
git checkout . # 会用暂存区全部文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。也就是说 如果暂存区没有暂存 即没执行过add 此时执行此命令 会清除所有改动(类似执行了git reset --hard HEAD<当前版本id>),add后,暂存区存在暂存,但是如果工作区存在未add 的修改,或者add后又修改了一些文件,此时执行此命令,会清除工作区的未add改动或者新改动。如果真的觉得缓存区的修改就是最终版,则可以这样执行,废除工作区未暂存及后来的改动。
git checkout -- 文件名 # 会用暂存区指定文件替换工作区的文件。效果同上
git add 后的文件(暂存文件、绿色) 如需撤销暂存 可执行
git reset HEAD(此处就是单词HEAD) # 回退为【当前版本】 也就是在add后、commit提交前执行 会清除暂存 commit 后执行 则当前版本为该提交的版本 所以当前版本无变更 为working tree clean
如需文件变成红色 就需要回退到上一版本 即 git reset HEAD^
如果只需要部分文件取消暂存 可执行
git rm --cached <file>
git commit 过的文件 就生成了【版本记录】
如需恢复为【指定版本】 保留之后版本的暂存区所有记录(绿色)
即仅删除提交记录 则执行
git reset --soft HEAD(指定版本的提交记录id)
如需回滚到【指定版本】 但保留文件更改(红色)
即删除提交记录及暂存 不会删除变更内容 则执行
git reset [--mix] HEAD(指定版本的提交记录id) 默认 所以可以不写--mix
如需完全回滚为【指定版本】 不保留此目标版本后的修改记录、暂存记录及提交记录 则执行
git reset --hard HEAD(目标版本id)
但是上述操作的【操作记录】仍然可以通过git reflog 找到,可通过 reflog 中的 操作id,回滚到对应状态
git reset --hard HEAD(操作id)
可以在任何时机执行
git reset HEAD(此处就是单词HEAD) # 回退为【当前版本】,取消【当前版本】已暂存内容 === git reset HEAD~0
git reset HEAD^(此处就是单词HEAD) # 所有文件回滚到【上个版本】,并保留文件更改 ^可以有多个,每个代表一个版本
git reset HEAD^ 文件名(此处就是单词HEAD) # 回退某个文件到【上个版本】^可以有多个,每个代表一个版本
git reset HEAD~x # x为数字,代表向前回退几个commit版本 === git reset HEAD^^^……
git reset --hard origin/master # 将本地的状态回退到和远程的一样
未完待续 📅
文章转载自郭先生的日常,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




