软重置和修改后返回上次提交
Going back to last commit after soft reset and amend
我有 2 次提交(本地),我的历史是:A - B:
- 在提交 A 中,文件 myfile_v1.txt
- 在提交 B 中,多个其他文件。
- 在我的工作目录中,我更新了第一个提交的文件并做了一个小修正:myfile_v2.txt
我想修改提交 A 并以新形式替换文件,以便在推送任何内容之前拥有干净的历史记录。
我这样做了:
reset --soft
在 A
add
myfile_v2.txt
commit --amend
现在我可以看到我的提交 A 中有更正后的文件,但我不知道如何回到我以前的 HEAD 中,也不知道如果不再次提交 B 是否可行。
有什么想法吗?
提交散列包含此提交的完整历史记录。因此,如果您更改历史记录,历史记录将不再属于该提交,但必须重新创建该提交。
有很多方法可以做到这一点。在你的情况下,你可以 cherry-pick
B
一切都很好。
我会怎么做是一个交互式的变基(rebase -i
)。首先进行交互式变基,将 A
的节更改为 edit
,然后进行提交修改,然后继续变基。或者首先在 B
之上创建一个新提交,然后使用 rebase -i
重新排序,然后使用 squash
或 fixup
第二个提交。甚至使用自动修复或自动压缩。
您不能修改以前的提交。每个提交都是唯一的。
您可以做的是用新的提交重新创建历史。使用命令 git-rebase
我了解到您现在的情况:
Pre_A - A - B
\
A1
您丢失了 "B" 提交。要恢复提交,请使用 git-reflog
git reflog
您将看到分支的最新位置HEAD
。其中之一是 B 提交。记下行开头的哈希值。示例:
git reflog
a123b Ammend Commit of Previous A that generates A1 commit
b234c git reset soft to A Commit
c345d B Commit
b234c A Commit ##Look that the HASH is the same that the git-reset##
一旦你有了 B Commit 的 HASH。创建一个分支来恢复提交。
git branch tmpBranch c345d
此时,您需要的是将此提交放入 "A1" 的新历史记录中,而不是放在 "A" 中。你可以使用 git-rebase
我假设你在你的 master 分支工作。
git checkout tmpBranch
git rebase --onto master tmpBranch~1 tmpBranch
这会在 master(指向 A1 提交)中重新创建从 tmpBranch 提交向后的一次提交到 tmpBranch 提交(在您的情况下只有一次提交,即 B 提交)的历史记录。
我有 2 次提交(本地),我的历史是:A - B:
- 在提交 A 中,文件 myfile_v1.txt
- 在提交 B 中,多个其他文件。
- 在我的工作目录中,我更新了第一个提交的文件并做了一个小修正:myfile_v2.txt
我想修改提交 A 并以新形式替换文件,以便在推送任何内容之前拥有干净的历史记录。
我这样做了:
reset --soft
在 Aadd
myfile_v2.txtcommit --amend
现在我可以看到我的提交 A 中有更正后的文件,但我不知道如何回到我以前的 HEAD 中,也不知道如果不再次提交 B 是否可行。
有什么想法吗?
提交散列包含此提交的完整历史记录。因此,如果您更改历史记录,历史记录将不再属于该提交,但必须重新创建该提交。
有很多方法可以做到这一点。在你的情况下,你可以 cherry-pick
B
一切都很好。
我会怎么做是一个交互式的变基(rebase -i
)。首先进行交互式变基,将 A
的节更改为 edit
,然后进行提交修改,然后继续变基。或者首先在 B
之上创建一个新提交,然后使用 rebase -i
重新排序,然后使用 squash
或 fixup
第二个提交。甚至使用自动修复或自动压缩。
您不能修改以前的提交。每个提交都是唯一的。
您可以做的是用新的提交重新创建历史。使用命令 git-rebase
我了解到您现在的情况:
Pre_A - A - B
\
A1
您丢失了 "B" 提交。要恢复提交,请使用 git-reflog
git reflog
您将看到分支的最新位置HEAD
。其中之一是 B 提交。记下行开头的哈希值。示例:
git reflog
a123b Ammend Commit of Previous A that generates A1 commit
b234c git reset soft to A Commit
c345d B Commit
b234c A Commit ##Look that the HASH is the same that the git-reset##
一旦你有了 B Commit 的 HASH。创建一个分支来恢复提交。
git branch tmpBranch c345d
此时,您需要的是将此提交放入 "A1" 的新历史记录中,而不是放在 "A" 中。你可以使用 git-rebase
我假设你在你的 master 分支工作。
git checkout tmpBranch
git rebase --onto master tmpBranch~1 tmpBranch
这会在 master(指向 A1 提交)中重新创建从 tmpBranch 提交向后的一次提交到 tmpBranch 提交(在您的情况下只有一次提交,即 B 提交)的历史记录。