我有以下提交历史记录:
头部头部~头部~2头部~3
gitcommit--修改当前HEAD提交。但是如何修改HEAD~3?
我有以下提交历史记录:
头部头部~头部~2头部~3
gitcommit--修改当前HEAD提交。但是如何修改HEAD~3?
当前回答
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
我很喜欢这一点,因为它不会挤压其他无关的修复。
其他回答
我解决了这个问题,
1) 通过使用我想要的更改创建新的提交。。
r8gs4r commit 0
2) 我知道我需要合并哪个提交,即提交3。
因此,gitrebase-i HEAD~4#4表示最近的4次提交(此处提交3位于第4位)
3) 在交互式rebase中,最近的提交将位于底部。它看起来很像,
pick q6ade6 commit 3
pick vr43de commit 2
pick ac123d commit 1
pick r8gs4r commit 0
4) 如果您想与特定的提交合并,我们需要重新排列提交。应该是这样的,
parent
|_child
pick q6ade6 commit 3
f r8gs4r commit 0
pick vr43de commit 2
pick ac123d commit 1
重新排列后,需要将p pick替换为f(fixup将在没有提交消息的情况下进行合并)或s(带有提交消息的压缩合并可能在运行时发生变化)
然后保存你的树。
现在与现有提交合并完成。
注意:除非你自己维护,否则这不是更好的方法。如果你的团队规模很大,重写git是不可接受的方法这棵树最终会陷入你们知道其他人不会发生的冲突。如果你愿意为了用更少的提交来保持树的整洁,可以尝试这样做,如果小团队,否则不可取。。。。。
采用这种方法(它可能与使用交互式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 commit --amend
// or
git commit --amend -m "an updated commit message"
不修改公共承诺修改后的提交实际上是全新的提交,以前的提交将不再位于当前分支上。
例如,如果您想更改最后三个提交消息或该组中的任何一个提交消息,您可以向git rebase-i提供一个参数,该参数是您要编辑的最后一个提交的父级,即HEAD~2^或HEAD~3。记住~3可能更容易,因为您正在尝试编辑最后三次提交,但请记住,您实际上是在指定四次提交之前,即您要编辑的最后一次提交的父级:
$ git rebase -i HEAD~3
了解更多信息
完全非交互式命令(1)
我只是想分享一个我正在使用的别名。它基于非交互式交互式数据库。要将其添加到git中,请运行以下命令(解释如下):
git config --global alias.amend-to '!f() { SHA=`git rev-parse "$1"`; git commit --fixup "$SHA" && GIT_SEQUENCE_EDITOR=true git rebase --interactive --autosquash "$SHA^"; }; f'
或者,一个也可以处理未暂存文件的版本(通过先暂存,然后再卸载):
git config --global alias.amend-to '!f() { SHA=`git rev-parse "$1"`; git stash -k && git commit --fixup "$SHA" && GIT_SEQUENCE_EDITOR=true git rebase --interactive --autosquash "$SHA^" && git stash pop; }; f'
这个命令的最大优点是它不是vim。
(1) 当然,考虑到重新启动期间没有冲突
用法
git amend-to <REV> # e.g.
git amend-to HEAD~1
git amend-to aaaa1111
将名称修改为似乎合适IMHO。将流程与--修订:
git add . && git commit --amend --no-edit
# vs
git add . && git amend-to <REV>
解释
git-config—全局别名<名称>'<COMMAND>'-创建名为<NAME>的全局git别名,该别名将执行非git命令<COMMAND>f(){<BODY>};f-一个“匿名”bash函数。SHA=`git rev parse“$1”`;-将参数转换为gitrevision,并将结果赋给变量SHAgitcommit--fixup“$SHA”--fixup提交SHA。参见git提交文档GIT_SEQUENCE_EDITOR=true GIT rebase--交互式--autosquash“$SHA^”gitrebase——交互式“$SHA^”部分已被其他答案覆盖。--autosquash与gitcommit一起使用--fixup,有关更多信息,请参阅gitrebase文档GIT_SEQUENCE_EDITOR=true是使整个事情非交互式的原因。这是我从这篇博客文章中学到的。
使用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。