git 中容易遗忘的点 (三) 🚀🚀🚀

现在大部分开发工具都可以直接进行菜鸟下面说的大部分操作,具体见:虽然理解git命令,但是我选择vscode插件!

接前两篇:

  1. git 中容易遗忘的点 (二) ⚡⚡⚡
  2. git 中容易遗忘的点 (一) 💥💥💥

推送/抓取 指定分支

推送分支

推送分支,就是把该分支上的所有本地提交推送到远程库。推送时要指定本地分支,这样Git就会把该分支推送到远程库对应的远程分支上:

java 复制代码
$ git push origin master

如果要推送其他分支,比如dev,就改成:

java 复制代码
$ git push origin dev

切换远程分支

多人协作时,大家都会往master和dev分支上推送各自的修改。

现在,模拟一个你的小伙伴A,可以在另一台电脑(注意要把SSH Key添加到GitHub)或者 同一台电脑的另一个目录下克隆:

java 复制代码
$ git clone git@github.com:pbw-langwang/gitskills.git
Cloning into 'gitskills'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.

当A从远程库clone时,默认情况下,A只能看到本地的master分支。不信可以用 git branch 命令看看:

java 复制代码
$ git branch
* master

现在,A要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支(前提是你的远程厂库有dev分支,不然这样是不行的):

java 复制代码
$ git switch -c dev origin/dev

如果远程仓库没有dev分支,会报错:

java 复制代码
invalid reference: origin/dev

解决办法是:先自己创建该分支,然后push,再回到这里使用就好了!

抓取分支报错

如果 git fetch origin <branch-name> 提示:

There is no tracking information for the current branch.Please specify which branch you want to merge with.

说明本地分支和远程分支的连接关系没有创建,用下方命令创建关联:

git branch --set-upstream-to=origin/<branch-name> <branch-name>

注:本地和远程分支的名称最好一致

删除远程分支

perl 复制代码
git push origin --delete <branch-name>

如果不小心把错误的代码提交到远端了,怎么办?

感觉开发中还是挺常见的,例如:

一开始领导让你开发功能,开发完了都上线测试了,结果说不要了 或者 误操作,导致不小心把本地的代码推送到远端了

这个时候很多人都不知道怎么搞!

因为不能直接删除远端分支,其可能是受保护的,然后回退代码回退的是本地的分支,编译器又会提示你可以拉取远端的代码。

其实这里可以先 回退(reset) 本地分支,然后使用这个命令:

git 复制代码
git push origin 你回退的分支 --force-with-lease

使用完成后再去gitlab新建合并请求就行!

注意:

如果远端被别人改了 → 拒绝覆盖

那这个时候就需要

git 复制代码
    git revert <commit-id>
    git push

把需要忽略的文件提交到远端了,怎么办?

感觉开发中还是挺常见的,例如:

你的编译器可能安装了某个插件,导致有一些提示,但是其实不重要,你就可以新建一个插件读取的json配置文件,让其不提示,你感觉别人也会安装这个插件,所以提交了!

但是你发现后面多次修改了这个文件,且其它人可能根本不关心,这个时候,文件已经在远端了,你该怎么删除?

这个其实很简单:

直接删除这个文件(留个备份),并在.gitignore加上这个文件的名称即可,等提交后再新建一个就行!

有没有更好的办法?

直接执行该命令

git 复制代码
git rm --cached cspell.json

然后,在.gitignore加上这个文件的名称,提交即可!(省去了留备份的问题)

版本回退和版本前进

版本回退

在Git中,用HEAD表示当前版本,也就是最新的提交d696468860aab706dfb385ea4c85a11a0e37d86f(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^ ,上上一个版本就是HEAD^^ ,当然往上100个版本写100个 ^ 比较容易数不过来,所以写成HEAD~100。

这里菜鸟建议,直接记下两个就好:一个是HEAD^;另一个就是HEAD~XX。

现在我们要把当前版本回退到上一个版本,需要用到 git reset 命令,显示如下:

csharp 复制代码
git reset --hard HEAD^
HEAD is now at d0e121c add four line

注意:

  1. --hard 参数:将 HEAD 指针、索引(暂存区)和工作目录中的文件全部重置为指定提交的状态 如果有未提交的代码,千万不要加`--hard`,直接用`git reset HEAD^`即可,会用默认的`--mixed`会保留未提交的代码!

  2. 如果是版本号的方式回退,而且正好有两个版本的的版本id一致,那么会跳转到离新版本最远的的一个!

Git的版本回退速度非常快 ,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL:

改为指向add distributed:

然后顺便把工作区的文件更新了。所以你让 HEAD 指向哪个版本号,git 就把当前版本定位在哪!

版本前进

当你回退版本后,最近的版本已经变成了上一个版本,那这个时候想变回最新的版本怎么办?

例如:你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?

在Git中总是有后悔药可以吃的 。当你用 git reset --hard HEAD^ 回退到某个版本时,再想恢复到最新版,就必须找到最新版的 commit id。Git提供了一个命令 git reflog 用来记录你的每一次命令(只有reset和commit 即:对版本库的操作 ):

perl 复制代码
git reflog
ff8a5d3 HEAD@{1}: reset: moving to HEAD^
d0e121c HEAD@{2}: reset: moving to HEAD^
d696468 (HEAD -> master) HEAD@{3}: commit: read boke to change
d0e121c HEAD@{4}: commit: add four line
ff8a5d3 HEAD@{5}: reset: moving to ff8a5d
c471641 HEAD@{6}: reset: moving to HEAD~2
ff8a5d3 HEAD@{7}: commit: add three line
5222f9d HEAD@{8}: commit: add one line
c471641 HEAD@{9}: commit (initial): 2020 6 29

幸运的是,你的commit被记录了,所以你可以看见你最新版本的版本号:d696468。

所以可以使用:

scss 复制代码
git reset --hard d69646(版本号)

注意:版本号,不要写太少,不然可能有重复,而使git无法确定具体是哪一个版本!

理解分支与分叉

见:git自我研究:分支与分叉

相关推荐
葡萄城技术团队7 小时前
1000 人协同压测的环境瓶颈排查:CPU 争用与 Wi\-Fi
前端
excel8 小时前
Marked 与 Markdown 有什么区别?该怎么选?
前端
Da Da 泓9 小时前
五子棋 Web 端测试用例报告
前端·网络·websocket·网络协议·测试用例·项目
BIBI204910 小时前
换 Git 托管平台怎么做?基于 TortoiseGit 的跨平台迁移教程
windows·git·tortoisegit·问题解决·版本控制·最佳实践
zxcvb15310 小时前
远程查看本地文档:一条轻量 Web 文件服务的工程化链路
前端·远程查看文档
niucloud-admin10 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
北岛贰10 小时前
啵啵音乐迎来全新升级!
前端
hkNaruto12 小时前
【AI】基于大模型的AI游戏地图生成、控制方案:AI Native Game Harness 迁移操作手册
前端·人工智能·游戏
IT_陈寒12 小时前
Java序列化踩坑记:对象循环引用让我加班两小时
前端·人工智能·后端
每天进步一点点km12 小时前
自用-牛客网-华为机试编程模拟题1-python
华为od·华为·面试