当前位置:   article > 正文

Git 误操作救命篇,我不想去财务领工资_github怎么撤回request

github怎么撤回request

1.错误场景

有时我们会遇到这种情况:我们从develop 分支新建一个名为feat/home 分支去做A功能,然后由于一些其他原因A 功能需要延后,然后我们再从develop分支新建一个分支去做B功能或者C功能,在多分支多功能开发时,就容易出现做B功能时,忘记切换分支,一直等做完了提交了push之后才发现 push 错了远端的分支,并且 push 的改动与该分支需要开发的功能并没有交集,因此我们需要将已经提交错的分支内容回滚并提交push到正确的远端分支。


2.已经commit,但是未push到远端

使用 git reset 命令,可以在提交层面在私有分支舍弃一些没有提交的更改:

# 回退到上一个版本 
git reset --hard HEAD^ 
# 向前回退两个版本
git reset --hard HEAD~2
  • 1
  • 2
  • 3
  • 4

git reset 命令主要有三个选项: --soft、--mixed 、--hard,默认参数为 --mixed

  • git reset --soft 软重置,只撤销了git commit操作,保留了 git add 操作
  • git reset --hard 具有破坏性,是很危险的操作,它很容易导致数据丢失,如果我们真的进行了该操作想要找回丢失的数据,那么此时可以使用git reflog 穿梭到未来,找到丢失的commit
  • git reset --mixed 会保留提交的源码改动,只是将索引信息回退到了某一个版本,如果还需要继续提交,再次执行 git addgit commit

第一种方法:

适用于多个分支一起开发的时候将A分支的改动错误的提交到B的场景:

# 将该分支的本不应该提交的commit撤销
git reset HEAD^

# 按需选择想要回到哪个版本
# 回到HEAD
git reset --soft HEAD

# 回到HEAD的前一个版本
git reset --soft HEAD^

# 回到HEAD的前10个版本
git reset --soft HEAD~10

# 利用id回到指定版本
git reset --soft a06ef2f

# 将撤销的代码暂存起来
git stash

# 切换到正确的分支
git checkout feat/xxx

# 重新应用缓存
git stash pop

# 在正确的分支进行提交操作
git add . && git commit -m "update xxxx"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

第二种方法:

适用于在不小心在 master 分支上提交了代码,而实际想要在 feature 分支上提交代码的场景:

# 新建出一个新分支,但是仍在master 分支上,并不会切换到新分支
git branch feat/update

# 恢复master本身提交的状态
git reset --hard origin/master

# 提交错的代码已经在新检出的分支上面了,可以继续进行开发或者push
git checkout feat/update
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

第三种方法:

  • 适用于想要对特定的某一个或几个commit 进行“嫁接”,使其复制一份到正确的 feature 分支的场景;
  • 在功能性迭代开发中发现一个bug,并提交了一个 commit 进行修复,但是发现该bug也存在线上的发布版本上,必须要尽快对线上进行修复,此时可以使用git cherry-pick 将bug修复的commit 嫁接到 fix 分支上进行代码修复,并及时发布,解决线上bug。
# 先切换到正确的分支
git checkout feat/update

# 取出提交错误的或 bug fix的 commit 引入到feat/update 分支中
git cherry-pick a06ef2f

# 回到错误的分支
git checkout feat/feedback

# 将 a06ef2f 的改动从当前分支销毁
git reset --head a06ef2f
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

如果你只想把改动转移到目标分支,但是并不想提交,可以这样做:

# --no-commit 参数会使嫁接过来的改动不会提交,只会放在暂存区
git cherry-pick b9dabf9 --no-commit
  • 1
  • 2

第四种方法:

适用于当多个文件被缓存时,发现其中一个文件是其他分支的功能性改动,想直接取消该文件的缓存:

# 编辑了 1.js 2.js 3.js
# 缓存所有改动的文件
git add .

# 发现 3.js 不应该出现在此时提交的功能上,要取消它的缓存
git reset 3.js

# 此时3.js 被取消了缓存,我们继续提交1.js 2.js
git commit -m "Update 1.js 2.js"

# 将3.js 暂存起来
git stash

# 切换到提交 3.js 改动的分支
git checkout feat/update

# 重新应用缓存起来的 stash(3.js)
# pop 参数会将缓存栈的第一个stash删除,并将对应修改应用到当前分支目录下
git stash pop

# 继续提交
git add && git commit -m "update 3.js"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

3.Commit之后已经 push 到了远端

此时我们需要借助 git revert 命令来撤销我们的操作。

解决方式:

# 撤销最近的一次提交
git revert HEAD --no-edit
  • 1
  • 2

接着我们使用 sourceTree 查看撤销之后的提交历史:

在这里插入图片描述

我们看到想要撤销的 SHA1 为 db6bb3 的 commit(Update 2.js)记录还在,并且多了一个SHA1 为 6e1d7ee 新的 commit(Revert “Update 2.js”)。因此可以看出,git revert 是对给定的 commit 提交进行逆过程,该命令会引入一个新的提交来抵消给定提交的影响。 和 git cherry-pick 一样,revert命令不修改版本库的现存历史记录,相反它只会在记录添加新的提交。

接下来我们已经解决了错误分支的提交,但是还要把这次提交放到正确的分支上,依然可以使用 git cherry pick 去操作:

# 将revert commit push到远端
git push origin feat/feedback

# 切换到正确的分支
git checkout feat/update

将目标commit 嫁接到当前分支
git cherry pick db6bb3f
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

git revert 后面可以加不同的参数达到不同的撤销效果,常用的如下:

  • --edit :该参数为git revert 的默认参数,它会自动创建提交日志提醒,此时会弹出编辑器会话,可以在里面修改提交消息,然后再提交。
  • --no-edit :表示不编辑 commit 信息,revert 的 commit 会直接自动变回 ‘Revert + 想要撤销的commit 的message’ 的格式。上面例子中使用的就是这种方式。
  • --no-commit:该命令会使撤销的 commit 里面的改动放到暂存区,不进行提交,用户可以自行再次提交。这种参数并且适用于将多个 commit 结果还原到索引中,集体放置在缓冲区,进行用户自定义的操作。

4.改动不仅已经 push 到远端,并且已经合到主仓库

当我们把本不属于该分支的代码或者不需要提交的改动提交到主仓库,并合并到了develop 仓库之后,这是想要撤销合到主仓库的改动,解决方式如下:

1. 当以pull request 的方式进行的合并:

Github中支持pull request撤销操作,在对应的pull request页面点击 Revert 按钮救命即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/540634
推荐阅读
相关标签