撤消 git 变基以保存本地更改
Undo git rebase to save local changes
我用 git 做了一件蠢事。我对 file_a 进行了(良好的)本地更改,我已提交但未推送。我的同事对 file_a 进行了(错误的)更改,然后她将其推送。我提取了她的更改,并在没有完全意识到发生了什么的情况下重新定位它们。现在 file_a 已经无可救药了,我不知道如何解决它。
很显然,未来多推是关键。我现在 想做的是撤消变基,然后更仔细地重做。不过,我想确保不会丢失本地提交,但我不确定该怎么做。
如果我执行此命令:git reset --hard ORIG_HEAD
,是否会保留我的两个本地提交?还是我应该做点别的?
更新:
我最终使用 reflog 找到了好的提交。然后,我使用另一个分支挑选它们并验证一切都按预期工作。然后我在原来的分支中使用了 git revert fix_rebase_branch --hard
。
我会返回 git reflog
并从您想要的提交创建一个新分支(即使用 git checkout -b <new-branch-name> <orphaned-commit-hash>
)。 rebase 将重写你最近的两个提交,但原件应该仍然在参考日志中。
简单的方法只有在你还没有 "undone" 变基,除了环顾四周也没有做太多其他事情的情况下才有效(这样你当前的分支仍然只是变基的结果,并且没有un -致力于工作)。这还要求您不使用 rebase 的自动存储功能,或者如果您 正在 使用自动存储,那么如果您有任何未提交的工作树更改,则在第 2 步之前手动 git stash
.
- 运行
git branch save-my-rebased-work
创建一个指向当前提交的新分支名称(选择一个对你自己来说很明显的名称;注意 git branch
将创建这个新分支没有上游集)。
- 运行
git reset --hard ORIG_HEAD
撤消变基并使当前分支(和工作树)看起来像变基之前的样子。
如果您已经撤消了 rebase,请使用 reflog 查找 rebase 的新提交。请记住,rebase 所做的是 copy 您的原始提交到新副本。这些新副本在 git reset --hard ORIG_HEAD
之后通过 reflog 保留(无论如何,直到 reflog 条目在一个月左右过期)。之所以在步骤1中起一个新的分支名称是因为原件和副本看起来几乎一模一样,并且在reflogs中很难区分。
我用 git 做了一件蠢事。我对 file_a 进行了(良好的)本地更改,我已提交但未推送。我的同事对 file_a 进行了(错误的)更改,然后她将其推送。我提取了她的更改,并在没有完全意识到发生了什么的情况下重新定位它们。现在 file_a 已经无可救药了,我不知道如何解决它。
很显然,未来多推是关键。我现在 想做的是撤消变基,然后更仔细地重做。不过,我想确保不会丢失本地提交,但我不确定该怎么做。
如果我执行此命令:git reset --hard ORIG_HEAD
,是否会保留我的两个本地提交?还是我应该做点别的?
更新:
我最终使用 reflog 找到了好的提交。然后,我使用另一个分支挑选它们并验证一切都按预期工作。然后我在原来的分支中使用了 git revert fix_rebase_branch --hard
。
我会返回 git reflog
并从您想要的提交创建一个新分支(即使用 git checkout -b <new-branch-name> <orphaned-commit-hash>
)。 rebase 将重写你最近的两个提交,但原件应该仍然在参考日志中。
简单的方法只有在你还没有 "undone" 变基,除了环顾四周也没有做太多其他事情的情况下才有效(这样你当前的分支仍然只是变基的结果,并且没有un -致力于工作)。这还要求您不使用 rebase 的自动存储功能,或者如果您 正在 使用自动存储,那么如果您有任何未提交的工作树更改,则在第 2 步之前手动 git stash
.
- 运行
git branch save-my-rebased-work
创建一个指向当前提交的新分支名称(选择一个对你自己来说很明显的名称;注意git branch
将创建这个新分支没有上游集)。 - 运行
git reset --hard ORIG_HEAD
撤消变基并使当前分支(和工作树)看起来像变基之前的样子。
如果您已经撤消了 rebase,请使用 reflog 查找 rebase 的新提交。请记住,rebase 所做的是 copy 您的原始提交到新副本。这些新副本在 git reset --hard ORIG_HEAD
之后通过 reflog 保留(无论如何,直到 reflog 条目在一个月左右过期)。之所以在步骤1中起一个新的分支名称是因为原件和副本看起来几乎一模一样,并且在reflogs中很难区分。