Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Git 使用记录 - 各种撤销

Git 使用记录 - 各种撤销

作者头像
orientlu
发布于 2018-09-13 02:49:23
发布于 2018-09-13 02:49:23
1.2K00
代码可运行
举报
文章被收录于专栏:orientluorientlu
运行总次数:0
代码可运行

@(版本控制)git

前面通过 Git使用记录 - 基础 一文记录了平时的一些git基础操作。由于篇幅限制,只能作为一个基础参考,更加详细建议阅读《git 权威指南》 或官方提供的文档

本文主要记录在不同情景下,如何恰当地撤销错误操作。

个人开发环境 ubuntu 14.04

说明:

  • $ 表示终端执行命令
  • 命令注释
  • [] 表示可选

撤销本地(工作区)的修改

场景:我直接修改 pySerial.py 做个小测试, 测试后想取消掉那些修改。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git checkout pySerial.py
$ git status 
On branch master
Your branch is up-to-date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   pySerial.py

以上操作用于撤销保存在工作区修改,但是不会撤销暂存区中的修改。

由于修改还没记录到 git 中,撤销无法恢复,请慎重!

修正最后一个commit

场景:我修正了一个惊天大 bug,赶紧提交炫耀一下,然后下一秒,我发现提交说明拼写错误,好尴尬怎么办。

使用 git commit 加 "--amend" 用于修改最后一条 commit。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git commit -m "#110 Fix for a real a bug bug"
[master 6665748] Fix for a real a bug bug
 1 file changed, 1 insertion(+), 3 deletions(-)
$ git commit --amend -m "#110 Fix for a real big bug"
[master 6375a9b] Fix for a real big bug
 1 file changed, 1 insertion(+), 3 deletions(-)

再比如提交后发现漏了某些文件, 可以添加修改到暂存区后执行上述命令修正。

注意到上述提交的 SHA 修正后发生改变,说明改变了 git 的历史,所以对于已经推到共享服务器的 commit,修改也可能导致其他合并冲突!

撤销本地提交

场景:修改提交了几个 commit,但是后面发现简直难看或着啥来的,决定撤销掉(这里还在本地,没有推到共享服务器)

找到你想保留的最后一条 commit 的 SHA_last

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git reset [--mixed] SHA_last

git reset 默认使用模式 --mixed, 操作后,原先提交的 commit 被撤销,但是对应的文件修改依然会保留在工作区。

如果想把修改内容也抛弃,可以使用参数 --hard, 之后,全部都干净了。

重置上面的操作 (抬头..就上面)

场景:我把前面几个 commit 撤销了,而且还使用了 --hard,而后,我发现把有用的提交也不小心撤销了,怎么撤销上面的撤销....

使用 git log 已经无法查看想回退版本的 SHA,但是秉承走过就一定会留下痕迹(浮现老大那轻蔑的眼神,又提了什么傻逼commit然后偷偷回退....)的理念, 方法就是使用git reflog,查看到你提交过所有痕迹,包括已经撤销的(其实git 回定期清除用不到的对象,所以时间太长久,分支改动删除了的,就不要指望记录还在了)。

如列子, 我回退到 83a852b, 发现出错,想跳回到d2ef270,使用 git log 没有记录,使用 git reflog, 可以看到对应 SHA,然后直接 reset 到对应提交。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git log --pretty=format:"%h %an %ar : %s"
83a852b luchaodong 20 hours ago : fix uart error with thread & add setup.py
5ec962d luchaodong 12 days ago : add doc 9b16bc4 luchaodong 12 days ago : add py serial rx/tx

$ git reflog 
83a852b HEAD@{0}: reset: moving to 83a852b
d2ef270 HEAD@{1}: commit: test more commit
4e50ae7 HEAD@{2}: commit (amend): #110 Fix for a real big bug
c2e7dbb HEAD@{3}: commit: #110 Fix for a real a bug bug
83a852b HEAD@{4}: commit: fix uart error with thread & add setup.py
5ec962d HEAD@{5}: commit: add doc
9b16bc4 HEAD@{6}: commit (initial): add py serial rx/tx

$ git reset d2ef270
Unstaged changes after reset:
M   pySerial.py

$ git log --pretty=format:"%h %an %ar : %s"
d2ef270 luchaodong 69 seconds ago : test more commit
4e50ae7 luchaodong 2 minutes ago : #110 Fix for a real big bug
83a852b luchaodong 20 hours ago : fix uart error with thread & add setup.py
5ec962d luchaodong 12 days ago : add doc
9b16bc4 luchaodong 12 days ago : add py serial rx/tx

另外也可以记录对应几个提交的 SHA,然后通过git cherry-pick SHA把那几个提交撤销重置。

提交到错误分支的处理方法

场景:开发并提了几个 commit,发现当前在 mater 分支,但是之前的这几个提交是新功能,还不想提交到主分支。

你可以这么做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git branch new_feture            # 保存当前的提交到新分支
$ git reset --hard origin/master   # 恢复主分支
$ git checkout new_feture

保证在最新上更新

场景:几天前你从 master 分支创建 new_fea 分支开发新特性,但是到了今天,master 分支有了其他提交,new_feam 已经滞后master 分支,但是你希望这几天开发的新特性是从今天开始的,而不是滞后那么多天。

当然你可以直接 merge 或者 reset 暂存更新再重新提交,但是这里有一种更加优雅的做法时 rebase

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git rebase master

上述 rebase 过程如下:

  • 找到当前分支与 master 的共同祖先
  • Reset 到共同祖先位置,暂存 new_fea 后续的提交
  • Fast merge 到 master 末尾,然后再重新 commit 暂存的 new_fea 提交

撤销多个不连续的commit

场景:需要修改到一个早期提交的消息;发现一个早期提交漏了一些修改,想把几个提交合并,让log更加简洁的时候等可以尝试以下方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git rebase -i SHA_last

使用参数 -i 打开缺省编辑器

我刚测试提交了#1111-1 -- #1111-6 6个提交,输入后会看到如下

按时间先后排下来每个提交:第一列是执行的命令,第二列是SHA, 第三列是提交说明

里面也有详细的使用说明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pick e77c88d #1111-1 test - edit commit
pick 5a1425b #1111-2 test - edit commit
pick b1d7e93 #1111-3 test - edit commit
pick 240d1b7 #1111-4 test - edit commit
pick 2073df0 #1111-5 test - edit commit
pick f61e1ee #1111-6 test - edit commit

# Rebase 83a852b..f61e1ee onto 83a852b
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

执行操作

1 撤销某个commit及其修改 : 在编辑器里面直接删除对应那一行。

2 修改 commit 消息 : 把第一列的 pick 替换为 reword (或者直接用 r); 退出保存后, 会提示重新编辑消息。

3 把两个 commit 合并到一起 : 使用 squash 或 fixup 命令 “向上” 合并

带有这两个命令的 commit 会被合并到它的 前一个(更早的提交) commit 里。

  • squash, Git 会提示我们给新合并的 commit 一个新的 commit 消息;
  • fixup 则会把合并清单里第一个 commit 的消息直接给新合并的 commit 。

4 改变提交顺序 : 修改每一行的顺序来改变对应commit 的顺序。

很容易失败

撤销一个已经有副本的commit

场景:做错事了,而且 push 到服务器,并且被其他人 pull,使用前面的 reset 可能给后续带来冲突。

聚集反物质,把你之前的提交抵消掉,回产生一条新记录,但是内容被重置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git revert SHA_I_dont_want_you

这是 Git 最安全、最基本的撤销场景,因为它并不会改变历史, 然后勇敢地push 到服务器吧。

停止追踪文件

场景 : .gitignore 会阻止 Git 追踪文件的修改,甚至不关注文件是否存在,但这只是针对那些以前从来没有追踪过的文件。一旦有个文件被加入并提交了,Git 就会持续关注该文件的改变。

如果你希望从 Git 的追踪对象中删除那个本应忽略的文件,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git rm --cached file_name

Git 会从追踪对象中删除它,但让文件在磁盘上保持原封不动。因为现在它已经被忽略了,你在 git status 里就不会再看见这个文件,也不会再偶然提交该文件的修改了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016.08.09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Git 帮助手册
国外网友制作了一张 Git Cheat Sheet,总结很精炼,各位不妨收藏一下。
硬件开源小站
2023/04/07
4.4K1
Git 帮助手册
45个 GIT 经典操作场景,专治不会合代码
git对于大家应该都不太陌生,熟练使用git已经成为程序员的一项基本技能,尽管在工作中有诸如 Sourcetree这样牛X的客户端工具,使得合并代码变的很方便。但找工作面试和一些需彰显个人实力的场景,仍然需要我们掌握足够多的git命令。
程序员小富
2022/03/04
1.8K0
45个 GIT 经典操作场景,专治不会合代码
如何在 Git 里撤销(几乎)任何操作
git技能 任何版本控制系统的一个最有的用特性就是“撤销 (undo)”你的错误操作的能力。在 Git 里,“撤销” 蕴含了不少略有差别的功能。 当你进行一次新的提交的时候,Git 会保存你代码库在那个特定时间点的快照;之后,你可以利用 Git 返回到你的项目的一个早期版本。 在本篇博文里,我会讲解某些你需要“撤销”已做出的修改的常见场景,以及利用 Git 进行这些操作的最佳方法。 撤销一个“已公开”的改变 场景: 你已经执行了 git push, 把你的修改发送到了 GitHub,现在你意识到这些 c
小小科
2018/05/02
1K0
Git 从入门到精通,这篇包教包会!
集中化的版本控制系统,诸如 CVS,Subversion 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
java思维导图
2020/03/03
2.7K0
Git 使用规范流程
团队开发中,遵循一个合理、清晰的Git使用流程,是非常重要的。 否则,每个人都提交一堆杂乱无章的commit,项目很快就会变得难以协调和维护。 下面是ThoughtBot 的Git使用规范流程。我从中
ruanyf
2018/04/13
9600
Git 使用规范流程
git撤销修改各种情况
如何在Git里撤销(几乎)任何操作 一、撤销一个已经公开的改变 场景:已经执行了gitpush,将修改发送到了github,需要撤销某一个commit。 方法:git revert<commit版本号>,则改commit的所有改变都会被反转。这是git最安全、最基本的撤销场景。 二、修正最后一个commit消息 场景:在最后一条commit消息里有一个笔误,已经执行git commit –m’xxx’,但在push之前发现说明信息有误 方法:git commit–-amend 或者git commit –a
fanfan
2018/01/24
1.5K0
Git 实用技巧记录,看这篇你就明白了!
如果我们希望能够快速了解或体验一下 Git 的操作的话,我这里推荐搭建前往这个网站进行学习,其不需要我们安装工具,而且我们的每一步操作都可以在右侧实时看到状态,对于我们学习和理解 Git 工作方式和原理非常有帮助的。—— 欢迎光临 => https://oschina.gitee.io/learn-git-branching/
小明互联网技术分享社区
2021/11/12
4660
如何使用 Git 撤消(几乎)任何操作
任何版本控制系统最有用的功能之一就是能够“撤消”错误。在 Git 中,“撤消”可能意味着许多略有不同的事情。
madneal
2023/12/05
2490
如何使用 Git 撤消(几乎)任何操作
常用的Git Tips
一、Configuration:配置 列举所有的别名与配置 git config --list Git 别名配置 git config --global alias. git config --global alias.st status 设置git为大小写敏感 git config --global core.ignorecase false 二、Help:常用的辅助查询命令 在git 命令行里查看everyday git git help everyday 显示git常用的帮助命令 git help -g 获取Git Bash的自动补全 ~/.git-completion.bash && echo '[ -f ~/.git-completion.bash ] && . ~/.git-completion.bash' >> ~/.bashrc 设置自动更正 git config --global help.autocorrect 1 三、Remote:远端仓库配置 获取所有远端引用配置 git remote 或者 git remote show 修改某个远端的地址 git remote set-url origin URL Repo 查看当前仓库中的所有未打包的objects和磁盘占用 git count-objects --human-readable 从object数据库中删除所有不可达的object git gc --prune=now --aggressive 四、文件类操作 ,Cache:缓存,Track:文件追踪, 展示所有被追踪的文件 git ls-files -t 展示所有未被追踪的分支 git ls-files --others 展示所有被忽略的文件 git ls-files --others -i --exclude-standard git check-ignore* git status --ignored Manipulation:操作 停止追踪某个文件但是不删除它 git rm --cached <file_path 或者 git rm --cached -r <directory_path 强制删除未被追踪的文件或者目录 git clean -f git clean -f -d git clean -df 清空.gitignore git clean -X -f Changes:修改 Info:信息查看 查看上次提交之后的未暂存文件 git diff 查看准备用于提交的暂存了的修改的文件 git diff --cached 显示所有暂存与未暂存的文件 git diff HEAD 查看最新的文件版本与Stage中区别 git diff --staged dd:追踪某个修改,准备提交 Stage某个文件的部分修改而不是全部 git add -p Reset:修改重置 以HEAD中的最新的内容覆盖某个本地文件的修改 git checkout -- <file_name> Stash:贮存 Info:信息查看 展示所有保存的Stashes git stash list Manipulation:操作 Save:保存 保存当前追踪的文件修改状态而不提交,并使得工作空间恢复干净 git stash 或者 git stash save 保存所有文件修改,包括未追踪的文件 git stash save -u 或者 git stash save --include-untracked Apply:应用 应用任何的Stash而不从Stash列表中删除 git stash apply <stash@{n}> 应用并且删除Stash列表中的最后一个 git stash pop 或者 git stash apply stash@{0} && git stash drop stash@{0} 删除全部存储的Stashes git stash clear 或者 git stash drop <stash@{n}> 从某个Stash中应用单个文件 git checkout <stash@{n}> -- <file_path> 或者 git checkout stash@{0} -- <file_path> Commit:提交 检索某个提交的Hash值 git rev-list --reverse HEAD | head -1 Info:信息查看 List:Commit列表 查看自Fork Master以来的全部提交 git log --no-merges --stat --reverse master.. 展示当前分支中所有尚未合并到Master中的提交 git cherry -v master 或者 git cherry -v master <branch-to-be-merged> 可视化地查看整个Version树
竹清
2018/08/31
7120
工作中如何优雅的使用 Git
在本系列的前两篇博文中,笔者对 Git 以及 Git flow 进行了大致的介绍,相信各位读者已经对 Git 有了大致的了解。但是,在我们的日常工作中使用 Git 时常会遇到的各种突发状况,那么我们应该怎么合理的应对这些状况呢?俗话说,无规矩不成方圆,在团队协作中,如何规范 Git Commit 呢?本文将针对以上问题展开讨论,探讨一下在日常工作中,我们应该如何优雅的使用 Git?
BUG弄潮儿
2021/04/26
6540
日常开发过程中实际场景下使用git的一些简单总结
公司内部有代码仓库和 github 仓库邮箱不一致。例如已经全局配置了公司内的信息
ACK
2020/05/26
4730
图解常用的 Git 指令含义
当项目中包含多条功能分支时,有时就需要使用 git merge 命令,指定将某个分支的提交合并到当前分支。Git 中有两个合并策略:fast-forward 和 no-fast-forward。
苏南
2020/12/16
1.2K0
图解常用的 Git 指令含义
通过 41 个 问答方式快速了解学习 Git
个人比较喜欢 git add -p. 这增加了“补丁模式”的变化,这是一个内置的命令行程序。它遍历了每个更改,并要求确认是否要执行它们。
前端小智@大迁世界
2019/11/03
1.4K0
5. Git 进阶高频操作
--include-untracked 参数可以额外储藏新的未被追踪的文件。 --all 选项将收集所有未跟踪的文件以及在 .gitignore 和 排除文件中明确忽略的文件。
acc8226
2022/05/17
7300
5. Git 进阶高频操作
相关推荐
Git 帮助手册
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验