我有以下提交历史记录:

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

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


当前回答

如果出于某种原因,您不喜欢交互式编辑器,可以使用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存储+再基础自动化

因为当我需要多次修改Gerrit审查的旧提交时,我一直在做:

git-amend-old() (
  # Stash, apply to past commit, and rebase the current branch on to of the result.
  current_branch="$(git rev-parse --abbrev-ref HEAD)"
  apply_to="$1"
  git stash
  git checkout "$apply_to"
  git stash apply
  git add -u
  git commit --amend --no-edit
  new_sha="$(git log --format="%H" -n 1)"
  git checkout "$current_branch"
  git rebase --onto "$new_sha" "$apply_to"
)

GitHub上游。

用法:

修改源文件,如果已在repo中,则无需gitaddgit修改旧$old_sha

我很喜欢这一点,因为它不会挤压其他无关的修复。

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撤消(几乎)任何操作

更改上次提交:

git commit --amend
// or
git commit --amend -m "an updated commit message"

不修改公共承诺修改后的提交实际上是全新的提交,以前的提交将不再位于当前分支上。

例如,如果您想更改最后三个提交消息或该组中的任何一个提交消息,您可以向git rebase-i提供一个参数,该参数是您要编辑的最后一个提交的父级,即HEAD~2^或HEAD~3。记住~3可能更容易,因为您正在尝试编辑最后三次提交,但请记住,您实际上是在指定四次提交之前,即您要编辑的最后一次提交的父级:

$ git rebase -i 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我希望这可以帮助新用户:)。

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

首先将分支复制为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