Allen's blog Allen's blog
首页
面经
算法 (opens new window)
分类

Allen

前端CV工程师
首页
面经
算法 (opens new window)
分类
  • shadowsocks代理架构

  • 博客搭建

  • 数据结构与算法

  • Git

    • Git常用命令快速查找
    • 初始(全局)配置
    • 代码回撤与回滚
      • 修补提交
      • 查看提交历史
      • 撤销对文件的修改
        • 取消暂存的文件
      • 版本回滚
        • git reset
        • 三个参数--soft --mixed(默认) --hard
        • 使用场景
        • git revert
        • 撤销普通 commit
        • 撤销 merge commit
        • revert 之后重新上线
    • 远程仓库
    • 分支管理
    • Git忽略文件语法
  • 其他技术
  • Git
Allen
2023-02-15
目录

代码回撤与回滚

# 修补提交

如果在本地开发,刚提交完发现还有几个文件没有添加,可以使用git commit --amend进行修补

git commit -m 'initial commit'
git add forgotten_file
git commit --amend
1
2
3

最终您只会有一个提交——第二次提交将代替第一次提交的结果。

# 查看提交历史

命令:git log 可以使用git log --pretty=oneline显示一行提交信息

# 撤销对文件的修改

git checkout -- <file> 可以丢弃工作区的修改:

git checkout -- <file>
1

请务必记得 git checkout -- 是一个危险的命令。您对那个文件在本地的任何修改都会消失——Git 会用最近提交的版本覆盖掉它。 除非您确实清楚不想要对那个文件的本地修改了,否则请不要使用这个命令。

# 取消暂存的文件

git reset HEAD <file> 可以把暂存区的修改撤销掉(unstage),重新放回工作区。 git reset 命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用 HEAD 时,表示当前的指针(最新的版本)。

那么如果您想要丢弃工作区和暂存区全部更改呢? 不要忘了 HEAD 就是当前指针,所以

git reset --hard HEAD
1

就是丢弃工作区与暂存区的全部文件啦

# 版本回滚

git reset用于版本回退,回退后,前面的提交会消失 git revert用于回撤某一次提交,会生成新的提交

# git reset

git reset 命令是在更改 git 指针 HEAD 的指向,具体是更改指向不同的版本号。

想要用好 reset 命令,必须理解三个参数--soft --mixed(默认) --hard

# 三个参数--soft --mixed(默认) --hard

--soft 参数

git reset --soft commitId
1

soft 参数的作用是:将本地仓库回滚到 commitId 版本,暂存区和工作区保持不变。 --mixed 参数

git reset --mixed commitId 或者 git reset commitId
1

mixed 参数的作用是:将本地仓库和暂存区回滚到 commitId 版本,工作区保持不变。 --hard 参数

git reset --hard commitId
1

hard 参数的作用是:将本地仓库和暂存区、工作区都回滚到 commitId 版本

注意:工作区还有未提交的代码不要使用这个命令,因为工作区会回滚,没有提交的代码会消失。可以使用 git stash 暂存工作区,避免回滚导致修改的代码消失

# 使用场景

具体使用的时候,要分清的就是用哪个参数最合适,下面举几个例子。再次提醒,工作区有未提交的改动时,不要用--hard 参数。

  1. 如何撤销上一次 push? 此时用--soft 参数比较合适,只回滚本地仓到上一个版本,然后通过 git push -f 命令,撤销上次的 push,最后更改好代码后重新 push

    // ① 将本地仓回滚到上一个版本号
    git reset --soft HEAD~1
    // ② 通过-f 命令,将回滚后的版本号强制推送上去,
    // 相当于撤销了最新的 push
    git push origin master -f
    
    1
    2
    3
    4
    5
  2. 如何撤销一次 commit? 如果你要同时撤销暂存区的话,就用--mixed 参数,如果要撤销工作区的修改就用--hard 参数,否则用--soft 最安全。

# git revert

参考文章:Git 之 revert (opens new window)

git revert用于撤销指定提交的内容,撤销后会生成一个新的 commit

使用git show可以查看 commit 详细信息

  1. 普通 commit
    git show 3e853bd
    commit 3e853bdcb2d8ce45be87d4f902c0ff6ad00f240a
    
    1
    2
  2. merge commit
     git show bd86846
     commit bd868465569400a6b9408050643e5949e8f2b8f5
     Merge: ba25a9d 1c7036f
    
    1
    2
    3
    这代表该 merge commit 是从 ba25a9d 和 1c7036f 两个 commit 合并过来的。 而常规的 commit 则没有 Merge 行

# 撤销普通 commit

直接使用git revert commitId

# 撤销 merge commit

如果直接使用 git revert <commit id>,git 也不知道到底要撤除哪一条分支上的内容,这时需要指定一个 parent number 标识出"主线",主线的内容将会保留,而另一条分支的内容将被 revert。

从 git show 命令的结果中可以看到,merge commit 的 parent 分别为 ba25a9d 和 1c7036f,其中 ba25a9d 代表 master 分支(从图中可以看出),1c7036f 代表 will-be-revert 分支。需要注意的是 -m 选项接收的参数是一个数字,数字取值为 1 和 2,也就是 Merge 行里面列出来的第一个还是第二个,其含义用来保留某个分支。

git revert -m 1 bd86846
1

# revert 之后重新上线

参考文章:Git 之 revert (opens new window) 假设狗蛋在自己分支 goudan/a-cool-feature 上开发了一个功能,并合并到了 master 上,之后 master 上又提交了一个修改 h,这时提交历史如下:

a -> b -> c -> f -- g -> h (master)
           \      /
            d -> e   (goudan/a-cool-feature)
1
2
3

突然,大家发现狗蛋的分支存在严重的 bug,需要 revert 掉,于是大家把 g 这个 merge commit revert 掉了,记为 G,如下:

a -> b -> c -> f -- g -> h -> G (master)
           \      /
            d -> e   (goudan/a-cool-feature)
1
2
3

然后狗蛋回到自己的分支进行 bugfix,修好之后想重新合并到 master,直觉上只需要再 merge 到 master 即可(或者使用 cherry-pick),像这样:

a -> b -> c -> f -- g -> h -> G -> i (master)
           \      /               /
            d -> e -> j -> k ----    (goudan/a-cool-feature)
1
2
3

i 是新的 merge commit。但需要注意的是,这 不能 得到我们期望的结果。因为 d 和 e 两个提交曾经被丢弃过,如此合并到 master 的代码,并不会重新包含 d 和 e 两个提交的内容,相当于只有 goudan/a-cool-feature 上的新 commit 被合并了进来,而 goudan/a-cool-feature 分支之前的内容,依然是被 revert 掉了。

所以,如果想恢复整个 goudan/a-cool-feature 所做的修改,应该先把 G revert 掉:

a -> b -> c -> f -- g -> h -> G -> G' -> i (master)
           \      /                     /
            d -> e -> j -> k ----------    (goudan/a-cool-feature)
1
2
3

其中 G' 是对 G 的 revert 操作生成的 commit,把之前撤销合并时丢弃的代码恢复了回来,然后再 merge 狗蛋的分支,把解决 bug 写的新代码合并到 master 分支。

上次更新: 2023/12/16, 09:22:46
初始(全局)配置
远程仓库

← 初始(全局)配置 远程仓库→

最近更新
01
rollup使用配置文件rollup.config.ts打包
12-08
02
package.json导出类型
12-08
03
关键问题方案
11-17
更多文章>
Theme by Vdoing | Copyright © 2023-2023 Allen | Github
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式