现在大部分开发工具都可以直接进行菜鸟下面说的大部分操作,具体见:虽然理解git命令,但是我选择vscode插件!
接前两篇:
推送/抓取 指定分支
推送分支
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时要指定本地分支,这样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
注意:
--hard 参数:将 HEAD 指针、索引(暂存区)和工作目录中的文件全部重置为指定提交的状态 如果有未提交的代码,千万不要加`--hard`,直接用`git reset HEAD^`即可,会用默认的`--mixed`会保留未提交的代码!
如果是版本号的方式回退,而且正好有两个版本的的版本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无法确定具体是哪一个版本!