0%

git记录

旨在记录在使用git过程中出现的一些问题和使用上的一些操作记录、或者是git一些概念上的理解,防止重复踩坑。

1. 强制回滚远程git仓库的某个提交

简单描述一下git的操作流程:

  1. 工作区编写代码通过add命令添加到暂存区
  2. 暂存区通过commit命令添加到本地版本库
  3. 本地版本库通过push命令将本地代码推送到远程代码库

git reset --soft HEAD^ 将本地仓库回滚为指定版本,且多余的提交回滚到暂存区

git reset --fixed HEAD^ 将本地仓库和暂存区回滚为指定版本

git reset --hard HEAD^ 将本地仓库、暂存区和工作区回滚为指定版本

强制回滚一个提交步骤:

  1. 拉取需要修改的分支代码
  2. 通过git reset --hard HEAD^命令回滚一个提交
  3. 通过git push --force强制推送到远程代码库

2. 在git~^的区别

HEAD^, HEAD^1, HEAD~三个表达式都表示HEAD的父提交

HEAD^n: 指的是HEAD的第n个父提交(有多个父提交的前提下[这里的父提交实际上是合并操作])
HEAD~n: 指的是HEAD的第n个祖先提交(这里需要区分父提交和祖先提交的区别),所以HEAD~n=HEAD^^^(n个^)
git中^和~的区别.png

3. logreflog的区别

  • reflog: 可以查看所有分支的所有操作记录(包括已经删除的提交或者是重置的提交)
  • log: 不能查看被删除的提交

基于以上两个命令的区别reflog在一些场景下可以提供一些妙用。
比如:
查看某个分支是基于那个分支迁出: git reflog --date=local | grep <分支名称>

1
2
// 输出信息
077b02d HEAD@{Fri Jan 7 17:03:26 2022}: checkout: moving from 原分支名称 to 迁出后分支名称

4.revert

revert是重做的意思,可以对推送到远程仓库的提交进行撤销。假设不小心将开发分支的功能合并到基线分支,这时就可以通过revert命令进行撤销操作。

这里以gitlab为例:

revert.png

通过使用gitlab进入需要撤回的merge记录,选择右上角options->Revert,这时会生成一个revert-xxxx的分支,同时将该分支合并到基线分支,也就是将revert提交合并到基线分支。

这时基线分支撤销之后,当开发分支的功能开发完毕后,将开发分支合并到基线分支,会发现部分代码丢失,而丢失的正是之前revert操作撤销的那部分提交。所以只需要对之前的revert操作再次进行revert操作即可。简单来说就是负负得正的逻辑。

2023/07/24补充:

假设现在有两个分支的情况如下:master表主线分支,dev表开发分支

1
2
3
init -> m1 -> m2 -> m3  (master)
\
d1 -> d2 (dev)

这时dev分支以开发完成,所以将dev分支合并到master分支。

1
2
3
init -> m1 -> m2 -> m3 -- merge commit1 (master)
\ /
d1 --> d2 (dev)

合并之后就会产生一个合并的提交,使用git log命令可以看到这个提交信息。

1
2
3
4
5
6
commit ced0a13d5d463b212a321f193ffb8f4608673920 (HEAD -> dev1, origin/dev1)
Merge: ef6cc16 8f1cad0
Author: xiaocainiaoya <xiaocainiaoyao@foxmail.com>
Date: Mon Jul 24 15:41:19 2023 +0800

Merge branch 'master' into dev1

这个合并之后开发分支还在继续开发dev,同时其他开发完成的功能也会合并到master分支。

1
2
3
4
5
init -> m1 -> m2 -> m3 -- merge commit1 -> m4 -> merge commit2 (master)
\ \ / /
\ d1 --> d2 --> d3 --> d4 (dev)/
\ /
a1 --> a2 -------------------a3 (dev2)

这时突然由于dev分支合并到master,导致master出现了一些bug,需要进行紧急回滚,但是不能将dev2已经提交的合并回滚。

使用revert命令,对merge commit1这个提交进行回滚。这里会报错,这是因为git在尝试撤销两个分支的合并的时候,不知道需要保留那个分支上的修改,git提供了-m命令来指定需要保留的分支修改。

-m后面使用参数1表示:表示保留当前分支的更改,使用参数2表示:表示保留另一个分支的更改。

1
2
3
git revert ced0a13d5d463b212a321f193ffb8f4608673920
error: commit ced0a13d5d463b212a321f193ffb8f4608673920 is a merge but no -m option was given.
fatal: revert failed

这里我要保留master分支的修改,也就是在master分支的工作空间下执行-m 1

1
git revert -m 1 ced0a13d5d463b212a321f193ffb8f4608673920

之后,git log中就会多一个撤销的提交。

1
2
3
4
5
6
7
8
commit f491e063ea4cd9fd4117eec888b29d7d4c45561a (HEAD -> develop, origin/develop)
Author: xiaocainiaoya <xiaocainiaoya@foxmail.com>
Date: Mon Jul 24 15:51:07 2023 +0800

Revert "Merge branch 'master' into dev1"

This reverts commit ced0a13d5d463b212a321f193ffb8f4608673920, reversing
changes made to ef6cc16eb85e64883b79c3b86e6475f488a40b93.

注意:之后,当dev1分支上修复了这个bug,需要重新合并到master之前,需要先将这个f491e063提交revert,这是因为revert是通过添加提交的方式,撤销某个或者某些提交,它并不是删除提交,所以在将dev1合并到master之前,需要对之前撤销的提交执行撤销命令。

1
git revert f491e063ea4cd9fd4117eec888b29d7d4c45561a

这时又会产生一个新的提交:

1
2
3
4
5
6
7
commit 6f7f80c2d28ae17ae8679f1dc543a9b65fdd8559(HEAD -> develop, origin/develop)
Author: jiangjiamin <jiangjiamin@bosssoft.com.cn>
Date: Mon Jul 24 16:35:35 2023 +0800
## 可以从这里看出, 对之前撤销的提交进行撤销操作
Revert "Revert "Merge branch 'main' into develop""

This reverts commit f491e063ea4cd9fd4117eec888b29d7d4c45561a.

revert不仅可以对合并的提交进行撤销,也可以对某个单独的提交进行撤销。

这里要有别于reset,如果你使用这个命令作用于某个提交上:

1
reset commitId

它的意思是将这个提交之后的所有提交都移除,也就是这个提交之后的所有提交都删掉了,也就查不到这个提交之后的log信息,这个命令用回滚这个词形容感觉更贴切。

当然reset有它的应用场景,对于一些提交,由于各种原因推向远程仓库,可以通过reset强制还原。点击查看reset简单用法。

5.映射

命令:git remote add

表示将远程仓库URL映射成为本地仓库中对远程仓库的别名shortname。默认情况下一般使用shortname=origin

可以通过git remote -v查看对本地仓库设置的别名和远程仓库之间的关系:

1
2
3
4
testname   http://127.0.0.1:1000/xxx/xxx.git (fetch)
testname http://127.0.0.1:1000/xxx/xxx.git (push)
origin http://127.0.0.1:2000/xxx/xxx (fetch)
origin http://127.0.0.1:2000/xxx/xxx (push)

6.推送

命令:git push <远程仓库名> <本地分支名>:<远程分支名>

git push -u origin master:首次推送添加-u参数,git会将本地master分支内容推送到远程的master分支,同时将本地master分支与远程master分支关联,之后的推送仅通过git push即可。(这里忽略了:<远程分支名>的情况下,默认远程分支名与本地分支名一致)

7.跟换项目的远程仓库

1
2
3
4
5
6
7
8
##查看当前远程仓库
git remote -v
## 删除远程仓库
git remote rm origin
## 查看删除远程仓库操作是否成功
git remote -v
## 把远程仓库和本地同步,并消除差异
git pull origin master --allow-unrelated-histories

博客地址:https://xiaocainiaoya.github.io/

联系方式:xiaocainiaoya@foxmail.com

-------------本文结束感谢您的阅读-------------