我有以下提交历史记录:
头部头部~头部~2头部~3
gitcommit--修改当前HEAD提交。但是如何修改HEAD~3?
我有以下提交历史记录:
头部头部~头部~2头部~3
gitcommit--修改当前HEAD提交。但是如何修改HEAD~3?
当前回答
采用这种方法(它可能与使用交互式rebase完全相同),但对我来说,这有点简单。
注:我提出这种方法是为了说明你能做什么,而不是日常的选择。因为它有很多步骤(可能还有一些警告)
假设您要更改提交0,并且您当前处于功能分支
some-commit---0---1---2---(feature-branch)HEAD
签出此提交并创建一个快速分支。您还可以将功能分支克隆为恢复点(启动之前)。
?(git checkout -b feature-branch-backup)
git checkout 0
git checkout -b quick-branch
现在,您将看到如下内容:
0(quick-branch)HEAD---1---2---(feature-branch)
换舞台,把其他东西都藏起来。
git add ./example.txt
git stash
提交更改并签回功能分支
git commit --amend
git checkout feature-branch
现在,您将看到如下内容:
some-commit---0---1---2---(feature-branch)HEAD
\
---0'(quick-branch)
将功能分支重新设置为快速分支(解决过程中的任何冲突)。涂抹涂抹物并移除快速分支。
git rebase quick-branch
git stash pop
git branch -D quick-branch
最后你会得到:
some-commit---0'---1'---2'---HEAD(feature-branch)
Git不会在重基时复制0提交(虽然我不能说在多大程度上)。
注意:所有提交散列都是从我们最初打算更改的提交开始更改的。
其他回答
使用git-rebase。例如,要修改提交bbc643cd,请运行:
$ git rebase --interactive 'bbc643cd^'
请注意命令末尾的插入符号^,因为您实际上需要在要修改的提交之前重新返回提交。
在默认编辑器中,在提到bbc643cd的行中修改pick以进行编辑。
保存文件并退出。git将解释并自动执行文件中的命令。您将发现自己处于之前创建提交bbc643cd的情况。
此时,bbc643cd是您最后一次提交,您可以很容易地修改它。进行更改,然后使用以下命令进行提交:
$ git commit --all --amend --no-edit
之后,使用以下命令返回到上一个HEAD提交:
$ git rebase --continue
警告:请注意,这将更改该提交的SHA-1以及所有子项——换句话说,这将重写从此点开始的历史。如果使用命令gitpush-force进行推送,则可以断开repos。
使用令人惊叹的交互式rebase:
git rebase -i @~9 # Show the last 9 commits in a text editor
找到所需的提交,将pick更改为e(编辑),然后保存并关闭文件。Git将返回到该提交,允许您:
使用gitcommit--修改以进行更改,或使用gitreset@~放弃最后一次提交,但不放弃对文件的更改(即,将您带到编辑文件但尚未提交的位置)。
后者对于执行更复杂的任务(如拆分为多个提交)非常有用。
然后,运行git-rebase--continue,git将在修改后的提交之上回放后续更改。可能会要求您修复一些合并冲突。
注意:@是HEAD的简写,~是指定提交之前的提交。
阅读Git文档中有关重写历史的更多信息。
不要害怕重新启动
ProTip公司™: 不要害怕尝试“危险”的命令来重写历史*-默认情况下,Git不会在90天内删除您的提交;你可以在reflog中找到它们:
$ git reset @~3 # go back 3 commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started
*注意一些选项,比如硬和强制,它们可以丢弃数据。*此外,不要重写您正在合作的任何分支的历史。
在许多系统上,git-rebase-i将默认打开Vim。Vim不像大多数现代文本编辑器那样工作,所以看看如何使用Vim重新设置基础。如果您希望使用不同的编辑器,请使用git-config--global-core.editor或您最喜欢的文本编辑器对其进行更改。
Run:
$git rebase--交互式commit_hash^
每个^表示要编辑的提交次数,如果只有一个(指定的提交哈希),则只需添加一个^。
使用Vim,您可以更改要更改、保存和退出的提交的单词pick to reword(:wq)。然后git将提示您标记为reword的每个提交,以便您可以更改提交消息。
您必须保存并退出(:wq)以转到下一个提交消息的每个提交消息
如果要退出而不应用更改,请按:q!
编辑:要在vim中导航,请使用j向上,k向下,h向左,l向右(所有这些都在正常模式下,按ESC键转到正常模式)。要编辑文本,请按i以进入INSERT模式,在该模式下插入文本。按ESC返回正常模式:)
更新:这里有一个来自github的链接,列出了如何使用git撤消(几乎)任何操作
最好的选择是使用“Interactive rebase命令”。
gitrebase命令非常强大。它允许您编辑提交消息,合并提交,重新排序。。。等每次重新提交时,都会为每个提交创建一个新的SHA无论内容是否更改,都要提交!你应该是使用此命令时要小心,因为它可能具有剧烈的特别是如果你与其他人合作开发人员。他们可能会在你重新设置一些基础。在您强制推送提交后,它们将退出同步,你可能会在混乱的情况下发现。所以要小心!建议在重新定基之前创建一个备份分支,以便当你发现事情失控时,你可以回到以前的状态。
现在如何使用此命令?
git rebase -i <base>
-我代表“交互式”。请注意,您可以在非交互式模式下执行重新基准。前任:
#interactivly rebase the n commits from the current position, n is a given number(2,3 ...etc)
git rebase -i HEAD~n
HEAD表示您的当前位置(也可以是分支名称或提交SHA)。~n的意思是“n之前”,因此HEAD~n将是您当前所在的提交之前的“n”个提交列表。
git-rebase有不同的命令,如:
p或pick保持原样。r或reword:保留提交的内容,但更改提交消息。s或squash:将此提交的更改合并到上一次提交中(列表中位于其上方的提交)。等注意:最好让Git与代码编辑器一起工作,以使事情更简单。例如,如果您使用可视化代码,您可以像这样添加git-config--global-core.editor“code--wait”。或者你可以在谷歌中搜索如何将你喜欢的代码编辑器与GIT相关联。
git rebase示例
我想更改最后两次提交,所以我这样处理:
显示当前提交:#这将在一行中显示所有提交$git日志--单行4f3d0c8(HEAD->documentation)docs:添加项目描述和包含的文件“4d95e08文档:添加创建日期和项目标题“eaf7978(origin/master,origin/HEAD,master)初始提交46a5819创建README.md现在我使用gitrebase来更改最后两个提交消息:$git rebase-i头~2它将打开代码编辑器并显示以下内容:pick 4d95e08文档:添加创建日期和项目标题pick 4f3d0c8文档:添加项目描述和包含的文件#将eaf7978..4f3d0c8重新设置为eaf7978(2个命令)##命令:#p,pick<commit>=使用commit#r,reword<commit>=使用commit,但编辑commit消息...因为我想更改这两次提交的提交消息。所以我会用r或reword代替pick。然后保存文件并关闭选项卡。请注意,rebase是在多步骤过程中执行的,因此下一步是更新消息。还请注意,提交按时间顺序显示,因此最后一次提交显示在该提交中,第一次提交显示第一行中,依此类推。更新消息:更新第一条消息:docs:将创建日期和项目标题添加到文档“README.md”#请输入更改的提交消息。行开始#带有“#”的将被忽略,并且空消息将中止提交。...保存并关闭编辑第二条消息docs:将项目描述和包含的文件添加到文档“README.md”#请输入更改的提交消息。行开始#带有“#”的将被忽略,并且空消息将中止提交。...保存并关闭。在重基结束时,您将收到这样的消息:成功重基并更新refs/heads/documentation,这意味着您成功了。您可以显示更改:5dff827(HEAD->documentation)文档:将项目描述和包含的文件添加到文档“README.md”4585c68文档:将创建日期和项目标题添加到文档“README.md”eaf7978(origin/master,origin/HEAD,master)初始提交46a5819创建README.md我希望这可以帮助新用户:)。
当我需要更深入地修复历史中以前的提交时,我经常使用交互式rebase和--autosquash。它本质上加快了ZelluX的回答所说明的过程,当您需要编辑多个提交时,它特别方便。
根据文档:
--自动撤销当提交日志消息以“squash…“(或”修复…“),并且有一个提交的标题以相同的开头…, 自动修改rebase-i的todo列表,以便标记为挤压的提交在要修改的提交之后立即出现
假设您的历史记录如下:
$ git log --graph --oneline
* b42d293 Commit3
* e8adec4 Commit2
* faaf19f Commit1
并且您有要修改为Commit2的更改,然后使用
$ git commit -m "fixup! Commit2"
或者,您可以使用commit sha而不是commit消息,因此“fixup!e8adec4”或甚至只是commit消息的前缀。
然后在提交之前启动交互式重新基础
$ git rebase e8adec4^ -i --autosquash
编辑器将打开已正确排序的提交
pick e8adec4 Commit2
fixup 54e1a99 fixup! Commit2
pick b42d293 Commit3
你只需要保存并退出