到达某个提交并丢弃在它之前完成的所有提交

reach to certain commit and discard all the commits that were done ahead of it

我已经将主分支合并到我的功能分支中。然而,提交并不顺利。它搞砸了应该来自主人的变化。功能分支提前 45 次提交,这些是其中最新的 4 次提前提交:

现在我需要伸手去提交 a3aec79。并丢弃在此特定提交之后完成的所有提交。

为了安全起见,您可以先去较新的分行结帐。

git checkout -b bug_fix

您可以获取要切换到的提交 ID 并使用:

git revert <commit_id>

据我所知,你只需要做一个 git reset a3aec79。如果要放弃工作副本更改,请使用 --hard 标志。

如果您已经提前提交,则必须使用 git push --force。在那种情况下最好恢复而不是重置。

如果您想撤消该合并提交并将您的功能分支设置回 master 合并之前的确切状态,那么您可以这样做:

git checkout feature
git reset --hard HEAD^

这假定在您进行合并后功能分支中没有执行任何其他操作。

HEAD^ 是 git cli 中的 shorthand 表示法,意思是 "the previous commit"。在您的情况下,功能分支指向特定的提交。由于我们知道提交是合并提交(将 master 合并到功能分支),因此我们知道该合并提交的第一个父级将是功能分支的先前状态。 git reset 命令将获取您当前的分支,并强制它指向不同的提交。因此,我们将这两个事实都用于 运行 上述命令和中提琴!你的生意回来了。

这就是我最终解决这个问题的方式。

第 1 步: 使用重置硬命令以及要遍历到的提交的 sha。

git reset --hard <SHAsum of your commit>

在我的例子中是 git reset --hard a3aec79c1f47f6d8df95f61236fc212556b5c224。 如果你检查状态,你会发现你的分支落后于已经推送的提交。此时不要拉取更改。

第 2 步: 使用

从当前版本创建一个新分支
git checkout -b new_branch_name

在新创建的分支上为 feature/issues 工作。