Git小册-笔记迁移
Git简介
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。
1.基本操作
初始化name和email
git config --global user.name "余瑞"
git config --global user.email "xxxx@qq.com"
1.0:生成ssh
生成公钥
ssh-keygen -t rsa
将.ssh文件内的pub公钥配置到仓库中
1.1 :git init
将改目录变成git可管理的仓库
当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
如果你没有看到.git
目录,那是因为这个目录默认是隐藏的,用ls -ah
命令就可以看见。
1.2:git add
将某文件添加到仓库
git add .
将所有文件添加到git 仓库
1.3:git commit
将文件提交到仓库
简单解释一下git commit
命令,-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
为什么Git添加文件需要add
,commit
一共两步呢?因为commit
可以一次提交很多文件,所以你可以多次add
不同的文件,比如:
git add file1.txt
git add file2.txt file3.txt
git commit -m "add 3 files."
1.4:git status
查看仓库当前状态
git status
命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,xxx.txt
被修改过了,但还没有准备提交的修改。
虽然Git告诉我们xxx.txt
被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的xxx.txt
,所以,需要用git diff
这个命令看看:
1.5:git diff
查看具体修改的内容
git diff
顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到。知道了对readme.txt
作了什么修改后,再把它提交到仓库就放心多了
1.6.git log
查看commit的历史记录
git log
命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是append GPL
,上一次是add distributed
,最早的一次是wrote a readme file
。
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数
需要友情提示的是,你看到的一大串类似1094adb...
的是commit id
(版本号),和SVN不一样,Git的commit id
不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id
和我的肯定不一样,以你自己的为准。为什么commit id
需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。
1.7:git reset --hard
回退到某commit的记录
每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit
。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit
恢复,然后继续工作,而不是把几个月的工作成果全部丢失。
回退到最近一个commit版本git reset --hard HEAD^
回退到具体的版本 1094a。版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。git reset --hard 1094a
因为Git在内部有个指向当前版本的HEAD
指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL
:
┌────┐
│HEAD│
└────┘│└──> ○ append GPL│○ add distributed│○ wrote a readme file
改为指向add distributed
:
┌────┐
│HEAD│
└────┘││ ○ append GPL│ │└──> ○ add distributed│○ wrote a readme file
然后顺便把工作区的文件更新了。所以你让HEAD
指向哪个版本号,你就把当前版本定位在哪。
现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id
怎么办?
在Git中,总是有后悔药可以吃的。当你用$ git reset --hard HEAD^
回退到add distributed
版本时,再想恢复到append GPL
,就必须找到append GPL
的commit id。Git提供了一个命令git reflog
用来记录你的每一次命令:
git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file
终于舒了口气,从输出可知,append GPL
的commit id是1094adb
,现在,你又可以乘坐时光机回到未来了。
1.8:git checkout -- file
撤销修改
git checkout -- file
可以丢弃工作区的修改:
$ git checkout -- readme.txt
命令git checkout -- readme.txt
意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
git checkout -- file
命令中的--
很重要**,没有--
,就变成了“切换到另一个分支”的命令,**我们在后面的分支管理中会再次遇到git checkout
命令。
1.9:git rm
删除文件
git rm test.txt
相当于是删除工作目录中的test.txt文件,并把此次删除操作提交到了暂存区
2.远程仓库github
git remote add origin url
将github的url添加成远程仓库
从现在起,只要本地作了提交,就可以通过命令:
git push origin master
把本地master
分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!
SSH警告
当你第一次使用Git的clone
或者push
命令连接GitHub时,会得到一个警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes
回车即可。
Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
这个警告只会出现一次,后面的操作就不会有任何警告了。
如果你实在担心有人冒充GitHub服务器,输入yes
前可以对照GitHub的RSA Key的指纹信息是否与SSH连接给出的一致。
删除远程库
如果添加的时候地址写错了,或者就是想删除远程库,可以用git remote rm <name>
命令。使用前,建议先用git remote -v
查看远程库信息:
多人协作
当你从远程仓库克隆时,实际上Git自动把本地的master
分支和远程的master
分支对应起来了,并且,远程仓库的默认名称是origin
。
要查看远程库的信息,用git remote
:
$ git remote
origin
或者,用git remote -v
显示更详细的信息:
$ git remote -v
origin git@github.com:michaelliao/learngit.git (fetch)
origin git@github.com:michaelliao/learngit.git (push)
上面显示了可以抓取和推送的origin
的地址。如果没有推送权限,就看不到push的地址。
克隆指定分支
git clone -b branchName https://gitee.com/EdgexFoundry/edgex-examples.git
3.分支管理
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
或者git switch <name>
创建+切换分支:git checkout -b <name>
或者git switch -c <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
3.1:git checkout -b xxx
创建分支xxx
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
git branch
查看当前分支
3.2:git merge
分支合并
我们创建分支然后修改完提交修改后切回master分支,然后使用git merge命令用于合并指定分支到当前分支
3.3:git branch -d xxx
删除分支
合并完成后,就可以放心地删除dev
分支了:
$ git branch -d dev
当我们创建分支完成开发还没合并时,突然接到命令某个分支的功能不需要了,我们要删除该分支,此时会报错,因为我们还没合并,但我们已经不需要合并了,现在我们强行删除:
$ git branch -D feature-vulcan
3.4:switch
我们注意到切换分支使用git checkout <branch>
,而前面讲过的撤销修改则是git checkout -- <file>
,同一个命令,有两种作用,确实有点令人迷惑。
实际上,切换分支这个动作,用switch
更科学。因此,最新版本的Git提供了新的git switch
命令来切换分支:
创建并切换到新的dev
分支,可以使用:
$ git switch -c dev
直接切换到已有的master
分支,可以使用:
$ git switch master
使用新的git switch
命令,比git checkout
要更容易理解。
3.5:应该使用的分支策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本;
你和你的小伙伴们每个人都在dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。
3.6:git stash
储藏
软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101
来修复它,但是,等等,当前正在dev
上进行的工作还没有提交:
$ git status
On branch dev
Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file: hello.pyChanges not staged for commit:(use "git add <file>..." to update what will be committed)(use "git checkout -- <file>..." to discard changes in working directory)modified: readme.txt
并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
幸好,Git还提供了一个stash
功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge
现在,用git status
查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。
用git stash list
命令看刚才的工作现场存到哪去了:
$ git stash list
stash@{0}: WIP on dev: f52c633 add merge
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除;
另一种方式是用git stash pop
,恢复的同时把stash内容也删了:
3.7:cherry-pick复制一个特定的提交到当前分支
在master分支上修复了bug后,我们要想一想,dev分支是早期从master分支分出来的,所以,这个bug其实在当前dev分支上也存在。
那怎么在dev分支上修复同样的bug?重复操作一次,提交不就行了?
有木有更简单的方法?
有!
同样的bug,要在dev上修复,我们只需要把4c805e2 fix bug 101
这个提交所做的修改“复制”到dev分支。注意:我们只想复制4c805e2 fix bug 101
这个提交所做的修改,并不是把整个master分支merge过来。
为了方便操作,Git专门提供了一个cherry-pick
命令,让我们能复制一个特定的提交到当前分支:
$ git branch
* devmaster
$ git cherry-pick 4c805e2
[master 1d4b803] fix bug 1011 file changed, 1 insertion(+), 1 deletion(-)
Git自动给dev分支做了一次提交,注意这次提交的commit是1d4b803
,它并不同于master的4c805e2
,因为这两个commit只是改动相同,但确实是两个不同的commit。用git cherry-pick
,我们就不需要在dev分支上手动再把修bug的过程重复一遍。
有些聪明的童鞋会想了,既然可以在master分支上修复bug后,在dev分支上可以“重放”这个修复过程,那么直接在dev分支上修复bug,然后在master分支上“重放”行不行?当然可以,不过你仍然需要git stash
命令保存现场,才能从dev分支切换到master分支。
3.8:推送分支
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
$ git push origin master
如果要推送其他分支,比如dev
,就改成:
$ git push origin dev
但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
master
分支是主分支,因此要时刻与远程同步;dev
分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;- bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
- feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
3.9:抓取分支
当你的小伙伴从远程库clone时,默认情况下,你的小伙伴只能看到本地的master
分支。不信可以用git branch
命令看看:
$ git branch
* master
现在,你的小伙伴要在dev
分支上开发,就必须创建远程origin
的dev
分支到本地,于是他用这个命令创建本地dev
分支:
$ git checkout -b dev origin/dev
3.概念
3.1:工作区和暂存区
工作区(Working Directory)
就是你在电脑里能看到的目录,就是你创建的项目git init
的根目录就是一个工作区:
版本库Repository–工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master
分支,所以,现在,git commit
就是往master
分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
需要在本地成功安装git
1.打开git bush配置SSH key,这个不需要在要上传的路径下进行,只在系统路径下即可。输入 cd ~/.ssh/ 回车如果提示 “ No such file or directory”,可以手动在系统路径下新建一个 .ssh文件夹即可。再输入 mkdir ~/.ssh 回车。进入.ssh路径下。
2.接下来在.ssh路径下配置全局的name和email,输入以下命令:
git config --global user.name “xxxxx”
git config --global user.email “xxxxx@xx.com”
此处分别指工程文件名,和gitlab账号绑定的邮箱地址。
3.输入:ssh-keygen -t rsa -C “xxxx@xxxx.com”(xxx为上一句输入的邮箱地址)语句,回车之后生成SSH key,后面出现让输入口令的语句,直接按回车即可,如下图所示,这样系统路径下就生成了两个文件:id_rsa和id_rsa.pub
4.点击个人工程,然后进入新的页面,在该页面点击profile setting,打开profile setting,选择SSH key这个选项,如下图所示
5.将生成的SSH key添加到账户里,在SSH Keys页面里,在页面的右上角点击添加add SSH keys,将之前生成的两个文件中的id_rsa.pub文件里的内容粘贴到key文本框里,title会自动生成,再点击add key,这样key就添加成功了。
实操
版本回退操作撤销commit
git reset --hard
①git reset --hard HEAD^
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
使用这个命令git log
git log
commit 91a52ac4529c2859f719165706fbe94224bc211a (HEAD -> master)
Author: 余瑞 <1074121761@qq.com>
Date: Thu Jan 25 11:36:43 2024 +0800bbbbcommit acc55939b31648f88752729c421f52b3ff587d33 (origin/master)
Author: 余瑞 <1074121761@qq.com>
Date: Thu Jan 25 11:35:07 2024 +0800first
log
顺序是从上到下,第一个最近的commit
。我们现在执行回退命令,然后再执行git log
commit acc55939b31648f88752729c421f52b3ff587d33 (HEAD -> master, origin/master)
Author: 余瑞 <1074121761@qq.com>
Date: Thu Jan 25 11:35:07 2024 +0800first
总结:且本地新增的bbb.md文件也被删除了,也就是说-hard回退,会将暂存区日志删掉,本地工作区内容也会删掉,因此慎用。
如何恢复–hard回退的内容呢
Git提供了一个命令git reflog
用来记录你的每一次命令。
git reflog
acc5593 (HEAD -> master, origin/master) HEAD@{0}: reset: moving to HEAD^
91a52ac HEAD@{1}: commit: bbbb
acc5593 (HEAD -> master, origin/master) HEAD@{2}: commit (initial): first
此时执行git reset --hard 91a52ac
就恢复了
git reset --mixed
如果不加--
参数默认执行的--mixed
我们先git log
看一下
git log
commit 91a52ac4529c2859f719165706fbe94224bc211a (HEAD -> master)
Author: 余瑞 <1074121761@qq.com>
Date: Thu Jan 25 11:36:43 2024 +0800bbbbcommit acc55939b31648f88752729c421f52b3ff587d33 (origin/master)
Author: 余瑞 <1074121761@qq.com>
Date: Thu Jan 25 11:35:07 2024 +0800first
然后我们执行git reset HEAD^
,相当于执行了git reset --mixed HEAD^
。然后再执行git log
看一下,我们可以看到撤销了commit
的记录,但工作区的内容给我们保留了。
git reset HEAD^
PS D:\A_my_codes\git> git log
commit acc55939b31648f88752729c421f52b3ff587d33 (HEAD -> master, origin/master)
Author: 余瑞 <1074121761@qq.com>
Date: Thu Jan 25 11:35:07 2024 +0800
git reset --soft
git log
先看一下,我们提交了create bbb.md。
commit 152fe868eede4afda8e4dca59ba6353f5511c202 (HEAD -> master)
Author: 余瑞 <1074121761@qq.com>
Date: Thu Jan 25 11:56:13 2024 +0800create bbb.mdcommit acc55939b31648f88752729c421f52b3ff587d33 (origin/master)
Author: 余瑞 <1074121761@qq.com>
Date: Thu Jan 25 11:35:07 2024 +0800first
然后我们执行git reset --soft HEAD^
然后再git log
看一下,可以看到撤销了commit并且工作区内容保留着,此外,我们执行git status
可以看到,–soft
参数会保留暂存区的内容。也就是git add
的。
git log
commit acc55939b31648f88752729c421f52b3ff587d33 (HEAD -> master, origin/master)
Author: 余瑞 <1074121761@qq.com>
Date: Thu Jan 25 11:35:07 2024 +0800firstgit status
On branch master
Your branch is up to date with 'origin/master'.Changes to be committed:(use "git restore --staged <file>..." to unstage)new file: bbb.md
git revert
git revert
命令用于创建一个新的提交,该提交包含了要回滚的提交所引入的更改的相反操作,这样就可以撤销这些更改。这个新提交将成为项目历史记录中的一部分,并且需要被推送到远程仓库以应用这些更改。相较于 git reset
命令,git revert
命令更加安全,因为它不会删除任何提交,而是创建新的提交(如果想完全撤销更改,需要使用 git reset
命令。)该命令通常用于回滚已经推送到远程仓库的提交。
目前我们的工作区只有aaa.md很干净接下来我会创建bbb.md并推送到远程仓库。
git status
On branch master
Your branch is up to date with 'origin/master'.Untracked files:(use "git add <file>..." to include in what will be committed)bbb.mdgit add .
git commit -m "add bbb.md file"
git push origin master
然后我们执行git log
查看更改内容
git log --pretty=oneline
0907a85f6b96f7249cfc004e2e663a9e87f0e291 (HEAD -> master, origin/master) add bbb.md file
2e007077746ee5b269c1f5492f8ad0856fcf0a24 Revert "create bbb.mc"
f18cf0d07ada4d338564da064aba29925f7b9df0 create bbb.mc
acc55939b31648f88752729c421f52b3ff587d33 first
然后我们执行git revert
开始回滚
git revert 0907a85f6b96f7249cfc004e2e663a9e87f0e291
执行完改命令git会帮我们创建一个新的commit
进入vim
模式,这里就是commit
的信息,我们可以直接:wq
保存退出,此时可以看到如下
[master a6ad2f8] Revert "add bbb.md file"1 file changed, 1 deletion(-)delete mode 100644 bbb.md
然后我们git status查看状态
git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.(use "git push" to publish your local commits)
可以看到已经提交了,此时我们可以push这样就回退了推送到远程仓库的内容了。
git checkout HEAD^
git checkout HEAD^
的作用是将当前分支移动到前一个提交(上一个提交)的位置,并更新工作目录中的文件的状态。
具体而言,HEAD^
表示当前分支的上一个提交(即父提交)。通过执行 git checkout HEAD^
,将切换到上一个提交并将工作目录中的文件还原为该提交时的状态。
这种操作在以下场景中可能会有用:
- 想撤销最新的提交并回到上一个提交的状态。
- 想查看上一个提交的内容或进行比较。
- 在切换到上一个提交后,可能会创建新的分支或进行其他操作。
需要注意的是,git checkout HEAD^
是一个相对引用,只会移动当前分支的指针而不会影响其他分支。如果希望在移动分支指针的同时也更新其他分支,可以使用 git checkout -B <分支名> HEAD^
命令。
请注意,执行 git checkout HEAD^
后,可以使用 git checkout -
命令返回到先前的分支位置。
撤销修改
撤销修改分两种情况:
- 修改后没有执行
git add
放到暂存区,现在只要撤销修改就和版本库的一样了。 - 已经执行了
git add
添加到暂存区了,现在撤销修改就回到添加暂存区后的状态。
撤销暂存区的修改
我们先git status查看一下当前状态。
git status
On branch master
Your branch is up to date with 'origin/master'.Changes to be committed:(use "git restore --staged <file>..." to unstage)new file: bbb.md
git reset HEAD <file>
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。git restore --staged <file>
同样也可以将暂存区修改回退到工作区。我们挑一个命令执行然后再看一下状态。
git status
On branch master
Your branch is up to date with 'origin/master'.Untracked files:(use "git add <file>..." to include in what will be committed)bbb.mdnothing added to commit but untracked files present (use "git add" to track)
撤销工作区(本地)的修改
git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout
命令。
aaaaa
执行 git checkout -- aaa.md将清除掉我这一行
然后我们执行git checkout -- aaa.md
,就会发现文件内容就恢复了
aaaaa
Rebase和merge
在上一节我们看到了,多人在同一个分支上协作时,很容易出现冲突。即使没有冲突,后push的童鞋不得不先pull,在本地合并,然后才能push成功。每次合并再push后,分支很乱,有强迫症的童鞋会问:为什么Git的提交历史不能是一条干净的直线?
- rebase操作可以把本地未push的分叉提交历史整理成直线;
- rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
git rebase和merge功能一样都是将分支的提交合并到另一个分支上,例如我在master
分支上执行git merge dev
就会将dev
分支的代码合并到master
上,但此时我们git log --graph --pretty=oneline --abbrev-commit
可以查看分支的commit
记录是没有dev分支上的记录的,如果我们希望将commit
记录变成直线就执行rebase
变基就可以了。如下图所示
问题
VSCODE终端无法使用git
如果是因为没有配置路径,在setting.json中配置git.path指向"C:\Program Files\Git\bin\git.exe"路径即可
相关文章:

Git小册-笔记迁移
Git简介 Git是目前世界上最先进的分布式版本控制系统(没有之一)。 所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉…...

【你也能从零基础学会网站开发】Web建站之HTML+CSS入门篇 传统布局和Web标准布局的区别
🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 传统布局与…...

005-事件捕获、冒泡事件委托
事件捕获、冒泡&事件委托 1、事件捕获与冒泡2、事件冒泡示例3、阻止事件冒泡4、阻止事件默认行为5、事件委托6、事件委托优点 1、事件捕获与冒泡 2、事件冒泡示例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /…...

SpringBoot快速入门(介绍,创建的3种方式,Web分析)
目录 一、SpringBoot介绍 二、SpringBootWeb快速入门 创建 定义请求处理类 运行测试 三、Web分析 一、SpringBoot介绍 我们可以打开Spring的官网(Spring | Home),去看一下Spring的简介:Spring makes Java simple。 Spring发展到今天已经形成了一种…...

VMwareWorkstation17.0虚拟机搭建WindowsME虚拟机(完整安装步骤详细图文教程)
VMwareWorkstation17.0虚拟机搭建WindowsME虚拟机(完整安装步骤详细图文教程) 一、Windows ME安装准备工作3.1 Windows ME下载地址3.2 DOS软盘版下载地址3.3 UltraISO 4.用VMware虚拟模仿当年的电脑配置4.1 新建虚拟机4.2 类型配置4.3 类型配置4.4 选择版…...

【Java设计模式】八、装饰者模式
文章目录 0、背景1、装饰者模式2、案例3、使用场景4、源码中的实际应用 0、背景 有个快餐店,里面的快餐有炒饭FriedRice 和 炒面FriedNoodles,且加配菜后总价不一样,计算麻烦。如果单独使用继承,那就是: 类爆炸不说&a…...

python INI文件操作与configparser内置库
目录 INI文件 configparser内置库 类与方法 操作实例 导入INI 查询所有节的列表 判断某个节是否存在 查询某个节的所有键的列表 判断节下是否存在某个键 增加节点 删除节点 增加节点的键 修改键值 保存修改结果 获取键值 获取节点所有键值 INI文件 即Initiali…...

软考笔记--软件系统质量属性
一.软件系统质量属性的概念 软件系统的质量就是“软件系统与明确地和隐含的定义的需求相一致的程度”。更具体地说,软件系统质量就是软件与明确地叙述的功能和性能需求文档中明确描述的开发标准以及任何专业开发的软件产品都应该具有的隐含特征相一致的程度。从管理…...

新型设备巡检方案-手机云巡检
随着科技的不断发展,设备巡检工作也在逐步向智能化、高效化方向转变。传统的巡检方式往往需要人工逐个设备检查,耗时耗力,效率低下,同时还容易漏检和误检。而新型设备巡检应用—手机蓝牙云巡检的出现,则为设备巡检工作…...

node.js 下 mysql2 的 CURD 功能极简封装
此封装适合于使用 SQL 直接操作数据库的小型后端项目,更多功能请查阅MySQL2官网 // 代码保存到单独的 js 文件const mysql require(mysql2/promise)const debug true let conn/*** 执行 SQL 语句* param {String} sql* param {*} params* returns {Array}*/ const…...

Cloud-Eureka服务治理-Ribbon负载均衡
构建Cloud父工程 父工程只做依赖版本管理 不引入依赖 pom.xml <packaging>pom</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.9.RELEA…...

Northwestern University-844计算机科学与技术/软件工程-机试指南【考研复习】
本文提到的西北大学是位于密歇根湖泊畔的西北大学。西北大学(英语:Northwestern University,简称:NU)是美国的一所著名私立研究型大学。它由九人于1851年创立,目标是建立一所为西北领地地区的人服务的大学。…...

【Linux的网络编程】
1、OSI的七层网络模型有哪些,每一层有什么作用? 答:(1)应用层:负责处理不同应用程序之间的通信,需要满足提供的协议,确保数据发送方和接收方的正确。 (2)表…...

vue-seamless-scroll 点击事件不生效
问题:在使用此插件时发现,列表内容前几行还是能正常点击的,但是从第二次出现的列表开始就没有点击事件了 原因:因为html元素是复制出来的(滚动组件是将后面的复制出来一份,进行填铺页面,方便滚动…...

前端工程部署步骤小记
安装mqtt: “mqtt”: “^4.3.7”, npm install git panjiacheng 后台demo下载zip 1、npm install --registryhttps://registry.npmmirror.com 2、npm run dev 前端demo创建 1、安装npm 2、npm install vuenext 3、npm install -g vue/cli 查看版本 vue --version 4、更新插件…...

TS常见问题
文章目录 1. 什么是 TypeScript?它与 JavaScript 有什么区别?2. TS 泛型、接口、泛型工具record、Pick、Omit3. TS unknow和any的区别,如何告诉编译器unknow一定是某个类型?4. 元组与常规数组的区别5. 什么是泛型,有什么作用&…...

linux系统nginx常用命令
查nginx位置 find / -name nginx nginx目录:/usr/local/ 查看nginx进程号 ps -ef |grep nginx 停止进程 kill 2072 启动 ./sbin/nginx /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf 启动并校验校验配置文件 ./sbin/nginx -t 看到如下显…...

MySQl基础入门③
上一遍内容 接下来我们都使用navicat软件来操作数据了。 1.新建数据库 先创建我门自己的一个数据库 鼠标右键点击bendi那个绿色海豚的图标,然后选择新建数据库。 数据库名按自己喜好的填,不要写中文, 在 MySQL 8.0 中,最优的字…...

idea Gradle 控制台中文乱码
如下图所示,idea 中的 Gradle 控制台中文乱码: 解决方法,如下图所示: 注意:如果你的 idea 使用 crack 等方式破解了,那么你可能需要在文件 crack-2023\jetbra\vmoptions\idea.vmoptions 中进行配置…...

嵌入式学习day31 网络
网络: 数据传输,数据共享 1.网络协议模型: OSI协议模型 应用层 实际发送的数据 表示层 发送的数据是否加密 会话层 是否建立会话连接 传输层 数据传输的方式(数据报…...

Docker网络+原理+link+自定义网络
目录 一、理解Docker网络 1.1 运行tomcat容器 1.2 查看容器内部网络地址 1.3 测试连通性 二、原理 2.1 查看网卡信息 2.2 再启动一个容器测试网卡 2.3 测试tomcat01 和tomcat02是否可以ping通 2.4 只要删除容器,对应网桥一对就没了 2.5 结论 三、--link 3.…...

Effective C++ 学习笔记 条款16 成对使用new和delete时要采取相同形式
以下动作有什么错? std::string *stringArray new std::string[100]; // ... delete stringArray;每件事看起来都井然有序,使用了new,也搭配了对应的delete。但还是有某样东西完全错误:你的程序行为未定义。至少,str…...

PokéLLMon 源码解析(四)
.\PokeLLMon\poke_env\exceptions.py """ This module contains exceptions. """# 定义一个自定义异常类 ShowdownException,继承自内置异常类 Exception class ShowdownException(Exception):"""This exception is …...

区块链基础知识01
区块链:区块链技术是一种高级数据库机制,允许在企业网络中透明地共享信息。区块链数据库将数据存储在区块中,而数据库则一起链接到一个链条中。数据在时间上是一致的,在没有网络共识的情况下,不能删除或修改链条。 即&…...

YOLOv9(2):YOLOv9网络结构
1. 前言 本文仅以官方提供的yolov9.yaml来进行简要讲解。 讲解之前,还是要做一些简单的铺垫。 Slice层不做任何的操作,纯粹是做一个占位层。这样一来,在parse_model时,ch[n]可表示第n层的输出通道。 Detect和DDetect主要区别还…...

提取b站字幕(视频字幕、AI字幕)
提取b站字幕(视频字幕、AI字幕) 1. 打开视频 2. 按 F12 进行开发者界面 视频自己的紫米输入的是 json,如果是AI字幕则需要输入 ai_subtitle 3. 进入这个网址:https://www.dreamlyn.cn/bsrt...

JAVA程序员如何快速熟悉新项目?
文章目录 Java程序员快速熟悉一个新项目的步骤通常包括以下几个方面:实例展示:Java程序员加入新项目时可能遇到的技术难题及其解决方案包括: Java程序员快速熟悉一个新项目的步骤通常包括以下几个方面: 理解项目背景和目标&#x…...

慢sql优化记录1
慢sql为: select count(*) from t_wf_process p left join t_wf_core_dofile dofile on p.wf_instance_uid dofile.instanceid join zwkj_department d on p.userdeptid d.department_guid ,t_wf_core_item i,wf_node n where (p.IS_DUPLICATE ! true or p.IS_DU…...

堆和堆排序
堆排序是一种与插入排序和并归排序十分不同的算法。 优先级队列 Priority Queue 优先级队列是类似于常规队列或堆栈数据结构的抽象数据类型(ADT)。优先级队列中的每个元素都有一个相关联的优先级key。在优先级队列中,高优先级的元素优先于…...

STM32 | 零基础 STM32 第一天
零基础 STM32 第一天 一、认知STM32 1、STM32概念 STM32:意法半导体基于ARM公司的Cortex-M内核开发的32位的高性能、低功耗单片机。 ST:意法半导体 M:基于ARM公司的Cortex-M内核的高性能、低功耗单片机 32:32位单片机 2、STM32开发的产品 STM32开发的产品&a…...