我有以下提交历史记录:

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

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


当前回答

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

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

其他回答

采用这种方法(它可能与使用交互式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提交(虽然我不能说在多大程度上)。

注意:所有提交散列都是从我们最初打算更改的提交开始更改的。

我解决了这个问题,

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是不可接受的方法这棵树最终会陷入你们知道其他人不会发生的冲突。如果你愿意为了用更少的提交来保持树的整洁,可以尝试这样做,如果小团队,否则不可取。。。。。

如果您还没有推送提交,则可以使用git reset HEAD^[1,2,3,4…]返回到上一次提交

例如

git commit <file1> -m "Updated files 1 and 2"
git commit <file3> -m "Updated file 3"

抱歉,忘记在第一次提交时添加file2。。。

git reset HEAD^1 // because I only need to go back 1 commit

git add <file2>

这将在第一次提交时添加file2。

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

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

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

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