Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Git修改已提交的commit1 本地修改

Git修改已提交的commit1 本地修改

作者头像
JavaEdge
发布于 2018-08-10 07:52:48
发布于 2018-08-10 07:52:48
2.1K00
代码可运行
举报
文章被收录于专栏:JavaEdgeJavaEdge
运行总次数:0
代码可运行

1 本地修改

由于以下修改本身是对版本历史的修改,在需要push到远程仓库时,往往是不成功的,只能强行push,这样会出现的一个问题就是,如果你是push到多人协作的远程仓库中,会对其他人的远程操作构成影响。通常情况下,建议与项目远程仓库的管理员进行沟通,在完成你强制push操作后,通知其他人同步。

1.1 修改最近一次的commit

  • 修改提交的描述
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git commit --amend

然后会进入一个文本编辑器界面,修改commit的描述内容,即可完成操作。

  • 修改提交的文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git add <filename> # 或者 git rm
git commit --amend # 将缓存区的内容做为最近一次提交

1.2 修改任意提交历史位置的commit

可以通过变基命令,修改最近一次提交以前的某次提交。不过修改的提交到当前提交之间的所有提交的hash值都会改变。 变基操作需要非常小心,一定要多用git status命令来查看你是否还处于变基操作,可能某次误操作的会对后面的提交历史造成很大影响。

首先查看提交日志,以便变基后,确认提交历史的修改

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

变基操作。 可以用commit~n或commit^^这种形式替代:前者表示当前提交到n次以前的提交,后者^符号越多表示的范围越大,commit可以是HEAD或者某次提交的hash值;-i参数表示进入交互模式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git rebase -i <commit range>

以上变基命令会进入文本编辑器,其中每一行就是某次提交,把pick修改为edit,保存退出该文本编辑器。

注意:变基命令打开的文本编辑器中的commit顺序跟git log查看的顺序是相反的,也就是最近的提交在下面,老旧的提交在上面

注意:变基命令其实可以同时对多个提交进行修改,只需要修改将对应行前的pick都修改为edit,保存退出后会根据你修改的数目多次打开修改某次commit的文本编辑器界面。但是这个范围内的最终祖先commit不能修改,也就是如果有5行commit信息,你只能修改下面4行的,这不仅限于commit修改,重排、删除以及合并都如此。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git commit --amend

接下来修改提交描述内容或者文件内容,跟最近一次的commit的操作相同,不赘述。

然后完成变基操作

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

有时候会完成变基失败,需要git add --all才能解决,一般git会给出提示。

再次查看提交日志,对比变基前后的修改,可以看到的内的所有提交的hash值都被修改了

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

如果过了一段时间后,你发现这次历史修改有误,想退回去怎么办?请往下继续阅读

1.3 重排或删除某些提交

变基命令非常强大,还可以将提交历史重新手动排序或者删除某次提交。这为某些误操作,导致不希望公开信息的提交,提供了补救措施

git rebase -i <commit range> 如前面描述,这会进入文本编辑器,对某行提交进行排序或者删除,保存退出。可以是多行修改。

后续操作同上。

1.4 合并多次提交

非关键性的提交太多会让版本历史很难看、冗余,所以合并多次提交也是挺有必要的。同样是使用以上的变基命令,不同的是变基命令打开的文本编辑器里的内容的修改。

将pick修改为squash,可以是多行修改,然后保存退出。这个操作会将标记为squash的所有提交,都合并到最近的一个祖先提交上。

注意:不能对的第一行commit进行修改,至少保证第一行是接受合并的祖先提交。

后续操作同上。

1.5 分离某次提交

变基命令还能分离提交,这里不描述,详情查看后面的参考链接

终极手段

git还提供了修改版本历史的“大杀器”——filter-branch,可以对整个版本历史中的每次提交进行修改,可用于删除误操作提交的密码等敏感信息。

删除所有提交中的某个文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git filter-branch --treefilter 'rm -f password.txt' HEAD

将新建的主目录作为所有提交的根目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git filter-branch --subdirectory-filter trunk HEAD

本地回退 回退操作也是对过往提交的一剂“后悔药”,常用的回退方式有三种:checkout、reset和revert

checkout

对单个文件进行回退。不会修改当前的HEAD指针的位置,也就是提交并未回退

可以是某次提交的hash值,或者HEAD(缺省即默认)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git checkout <commit> -- <filename>
reset

回退到某次提交。回退到的指定提交以后的提交都会从提交日志上消失 注意:工作区和暂存区的内容都会被重置到指定提交的时候,如果不加--hard则只移动HEAD的指针,不影响工作区和暂存区的内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git reset --hard <commit>

结合git reflog找回提交日志上看不到的版本历史,撤回某次操作前的状态

git reflog # 找到某次操作前的提交hash值 git reset <commit> 这个方法可以对你的回退操作进行回退,因为这时候git log命令已经找不到历史提交的hash值了。

revert

这个方法是最温和,最受推荐的,因为本质上不是修改过去的版本历史,而是将回退版本历史作为一次新的提交,所以不会改变版本历史,在push到远程仓库的时候也不会影响到团队其他人。

git revert <commit> 远程修改 对远程仓库的版本历史修改,都是在本地修改的基础上进行的:本地修改完成后,再push到远程仓库。

但是除了git revert可以直接push,其他都会对原有的版本历史修改,只能使用强制push

git push -f <remote> <branch> 总结 git commit --amend改写单次commit git rebase -i <commit range>删改排以及合并多个commit git checkout <commit> -- <filename>获取历史版本的某个文件 git reset [--hard] <commit>移动HEAD指针 git revert <commit>创建一个回退提交 git push -f <remote> <branch>强制push,覆盖原有远程仓库

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Git撤销&回滚操作(git reset 和 get revert)
俗话说,老虎也有打盹的时候。我们提交代码,也会有出错的时候。 我今天不小心把不该提交的文件给提交了。
赵云龙龙
2020/02/13
38.4K0
Git撤销&回滚操作(git reset 和 get revert)
使用 Git,10个最需要常备的后悔药
https://segmentfault.com/a/1190000022951517
前端老道
2020/07/07
1K0
使用 Git,10个最需要常备的后悔药
Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase
上篇博客聊了《git分支管理之rebase 以及 cherry-pick相关操作》本篇博客我们就以Learning Git中的关卡进行展开。下方列举了LearningGit中的 merge、rebase、reset、revert、cherry-pick 以及交互式rebase相关关卡的操作以及对应的解析。后边在聊交互式rebase操作是,不单单给出了LearningGit中的内容,而且给出了真正的Git分支在交互式rebase操作时的具体案例。 learngitbranching的地址为:https://l
lizelu
2018/03/28
16K0
Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase
珍藏多年的 Git 问题和操作清单
本文整理自工作多年以来遇到的所有 Git 问题汇总,之前都是遗忘的时候去看一遍操作,这次重新整理了一下,发出来方便大家收藏以及需要的时候查找答案。
猿天地
2019/09/03
1.4K0
珍藏多年的 Git 问题和操作清单
GIT常用指令
注:并不是修改上一次commit,而是生成新的commit取代上一次commit。
Careteen
2022/02/14
4220
GIT常用指令
一文读懂Git
版本控制就是记录项目文件的历史变化。它为我们查阅日志,回退,协作等方面提供了有力的帮助。
onlythinking
2020/06/02
6600
一文读懂Git
学会这 11 条,你离 Git 大神就不远了!
支持使用 merge 的开发者,他们认为仓库的提交历史就是记录实际发生过什么,它是针对于历史的一个文档,本身其实是有价值的,我们不应该随意修改。我们改变历史的话,就相当于使用“谎言”来掩盖实际发生过的事情,而这些痕迹是应该被保留的。可能,这样并不是很好。
民工哥
2021/04/21
3620
Git 修改已提交 commit 的信息
由于 Github 和公司 Git 使用账号不一样,偶尔没注意,提交出错后就需要修改 commit 信息。
叨叨软件测试
2020/10/27
107.7K0
常用的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 对我们工作的重要性,无论是前端后端,都是离不开 Git 的,下面就让我们一探究竟吧。
政采云前端团队
2021/07/19
1.9K0
git使用步骤_小猪酸奶的使用步骤
接触Git也些年头了,对于Git的使用也算是略有心得,想着 出于自己日后回顾,也便于他人查阅学习的目的,遂有此文, 相信看完此文你的Git使用会更进一步,谢谢~
全栈程序员站长
2022/11/08
1.1K0
git使用步骤_小猪酸奶的使用步骤
git 奇技淫巧
和 revert 的区别:reset 命令会抹去某个 commit id 之后的所有 commit
s_在路上
2018/09/30
6600
一些常用的 Git 进阶知识与技巧
假设我们在同一电脑上拥有多个 Git 账号,例如公司内部使用的是 Gitlab,个人使用的是 Github 或者 Gitee。那就会遇到一种情况,上班时想给个人开源项目提交代码,但是 Git 绑定的是公司的账号。
谭光志
2022/03/24
4420
一些常用的 Git 进阶知识与技巧
【linux命令讲解大全】013.Git:分布式版本控制系统的先驱和常用命令清单(二)
我还遇到了如下面错误,lab默认给master分支加了保护,不允许强制覆盖。Project(项目)->Setting->Repository 菜单下面的Protected branches把master的保护去掉就可以了。修改完之后,建议把master的保护再加回来,毕竟强推不是件好事。
全栈若城
2024/03/02
1140
十分钟了解 git 那些 “不常用” 命令
链接:https://segmentfault.com/a/1190000022107836
好好学java
2020/03/31
5020
代码管理工具的扛把子-Git
但是最近小❤发现很多人(包括我自己)只熟悉日常代码的拉取和提交,连 git revert/rebase 都不知道怎么用,太尴尬了 T.T
xin猿意码
2023/10/18
3430
代码管理工具的扛把子-Git
Git 实用指南
Git 是一个分布式的版本控制工具,因此远程和本地可以视为两个独立的 Git 仓库。上图是一张经典的 Git 中的数据流与存储级别的介绍,其中储存级别主要包含几部分:
grain先森
2019/05/06
6590
Git 实用指南
深入理解 git 一切皆 commit
git 入门教程推荐: 简介 - Git教程 - 廖雪峰的官方网站 Git入门图文教程(1.5W字40图)🔥🔥—深入浅出、图文并茂 - 安木夕 - 博客园
jgrass
2024/12/25
970
深入理解 git 一切皆 commit
相关推荐
Git撤销&回滚操作(git reset 和 get revert)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验