我有以下提交历史记录:

头部头部~头部~2头部~3

gitcommit--修改当前HEAD提交。但是如何修改HEAD~3?


当前回答

最好的选择是使用“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完全相同),但对我来说,这有点简单。

注:我提出这种方法是为了说明你能做什么,而不是日常的选择。因为它有很多步骤(可能还有一些警告)

假设您要更改提交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 -i HEAD~6

~6是要显示的提交历史记录的数量。

从pick更改为编辑要编辑的提交。然后我保存并退出(在ubuntu中:Ctrl+O保存,Ctrl+X退出)然后我运行:gitcommit--modify--date=“2022-09-02TT1:10:04”-m“NEW_MSG”如果编辑已打开,只需保存并退出即可。然后,为了确认并转到下一个提交或完成(如果是最后一个),我执行:gitrebase--continue

如果有更多提交要编辑,则从第1点开始重复

最后,我验证更改,如果一切正常,我会推送

我也有同样的问题,这是:

首先将分支复制为x,然后努力休息到你想回去的地方然后修改新的更改之后,从原始分支中选择所有其他更改签出原始分支在修改的恢复之前重置原始分支将基重设为x分支

我的骑手日志:

git checkout -b x 77164a510f1c17ed650b87c2ebf0f7762ac6b2a2 --
git reset --hard 0d038b5e3e3e2adef4bd6aab7653f922c3fdc63f
git add --ignore-errors -A -f -- src/Mores.Warehouse.Core.Api.ClientSdk/Mores.Warehouse.Core.Api.ClientSdk.csproj
git commit -F C:\Users\Hassan\AppData\Local\Temp\git-commit-msg-.txt --amend --
git cherry-pick 77164a510f1c17ed650b87c2ebf0f7762ac6b2a2
git checkout feature/MOR-2947 --
git reset --hard 0d038b5e3e3e2adef4bd6aab7653f922c3fdc63f
git rebase x

如果出于某种原因,您不喜欢交互式编辑器,可以使用gitrebase--on。

假设您要修改Commit1。首先,从Commit1之前分支:

git checkout -b amending [commit before Commit1]

第二,用樱桃核抓取Commit1:

git cherry-pick Commit1

现在,修改您的更改,创建Commit1':

git add ...
git commit --amend -m "new message for Commit1"

最后,在隐藏了任何其他更改后,将其余的提交移植到master之上新提交:

git rebase --onto amending Commit1 master

阅读:“将Commit1(不包括在内)和master(包括在内)之间的所有提交重新纳入修改分支”。即Commit2和Commit3,将旧的Commit1完全删除。你可以随便摘,但这样更容易。

记得清理你的树枝!

git branch -d amending

使用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。