修改git中以前提交的更改
我意识到我在以前承诺的改变中犯了一个错误。还有几个其他的提交依赖于这个(错误的)提交修改git中以前提交的更改,git,Git,我意识到我在以前承诺的改变中犯了一个错误。还有几个其他的提交依赖于这个(错误的)提交 我可以修改它并将这些更改传播到工作副本吗?如果已推送提交,您可以通过 git revert <commit hash> git还原 为了获得提交散列,只需使用git log命令就可以了,但我不想这样做。改变过去有副作用。您的分支或提交树不会是快进的,您必须覆盖服务器上的分支(如果有的话)。换句话说,除非你是最后一个看到它的人,而且它只在你的电脑上。这可能会产生更多的问题,如果出现任何问题,你就有
我可以修改它并将这些更改传播到工作副本吗?如果已推送提交,您可以通过
git revert <commit hash>
git还原
为了获得提交散列,只需使用
git log
命令就可以了,但我不想这样做。改变过去有副作用。您的分支或提交树不会是快进的,您必须覆盖服务器上的分支(如果有的话)。换句话说,除非你是最后一个看到它的人,而且它只在你的电脑上。这可能会产生更多的问题,如果出现任何问题,你就有失去东西的风险
如果你准备好进入时间旅行和另类现实的世界
欢迎来到git-rebase
首先要开始,创建一个新的分支,在那里你想要重新设置基础,这将创建一个你想要更改的分支的副本,以防出现任何错误,只要删除基础,任何事情都不会改变。您可以只注意提交散列
最简单的入门方法是使用git-rebase-i HEAD~N
,其中N是过去要更改的提交次数
它应该打开一个编辑器,您可以将每行的第一个单词更改为类似“编辑”的内容。然后保存文件,然后重新定基
重定基址时,您可以执行任何更改、添加文件、删除文件等操作。提交时,如果没有冲突,则应自动继续。一旦所有的事情都完成了,那个么你们将有一个重定基础的分支,其中的commit要么被删除,要么被编辑,要么被重命名,或者是你们想要的任何东西。如果一切顺利的话。删除旧分支(未重定基址)推送新的重定基址分支,瞧
编辑
除非它不是很清楚,当它打开编辑器时。删除一行将删除选定的提交。如果您删除文件中的所有内容,它将不起任何作用。在重定基期的任何时候,您都可以中止它,git项目的状态不应该改变。重新定基是一件非常安全的事情,因为它实际上不会改变任何事情。如果保留对旧提交的引用,则它们不会消失。重定基址后,它会创建一个替代路径。您将拥有一条旧路径和一条新路径。旧路径可能会被取消引用,任何引用到此旧路径的内容都应移动到新路径
重要的
顺便说一句,我要做的一件事是,只提交一些修复旧提交的东西。我认为,只有在需要时才使用重新基。例如,当您的同事意外提交4gb数据库备份时。(关于修改公共历史记录的常见警告…)
考虑到修改提交的需要,最简单的方法之一如下:
1) 使用git checkout
检查要修改的提交(使用gitk
或git log
查找正确的SHA)
2) 使用git checkout-b
在此提交时创建一个新分支
3) 根据需要修改代码
4) 使用git commit--amend
修改提交
5) 执行“到”重基,将原始分支中的其余提交跨行移动。要执行此操作,请在从上面修改更改提交之前重新调用更改提交的SHA,然后:
- 使用
切换到原始分支git checkout
- 运行
git-rebase--on
git branch-d
删除新分支
像往常一样,在这种情况下,查看
gitk
中发生的事情,以确保它是您所想的,并且(为了安全起见)在进行重新基础之前标记原始分支。首先进行更改并作为修复提交!原件的提交消息
然后决定你想在回购协议中看到什么(以及允许看到什么)。
如果你不被允许重写历史,那就到此为止吧,你尽了一切可能
如果允许,则在原始提交的父级上启动交互式重基。您将看到前两个条目“拾取原始”和“修复”。将所有其他提交设置为“编辑”,然后启动
该过程将在每次进一步提交时停止,在这里编译、重写内容以了解更改,工作正常。并使用
rebase--continue
。然后强制推送分支(并执行为历史重写案例规定的所有仪式)。您还可以使用git commit--fixup original-sha1
而不是复制/粘贴原始提交主题。