Git 如何检出提交进行一些更改并将其推回同一个提交

Git how to checkout to a commit make some changes and push it back to the same commit

我正在开发一个功能分支,比方说 git checkout -b "Cool_Feature_1"。我创建了 4 个具有原子更改的提交,因为它更容易查看它们并且它们都被分组,例如“移动文件结构”或“删除一些重复的代码”。

假设我在 4 次提交中的 1 次中移动了一个文件。

工作完成后,我推送了所有更改并创建了合并请求。 Reviewer 告诉我更改 commit 1 中的文件路径,其他的看起来不错。

我该怎么做?

我的做法: git log 找出必要的提交

然后git checkout 7c802ef576fbad061c6fefb350fde386e7d09087

再次进行更改

git add .

git commit --amend

但是现在,如果我这样做 git push 我会收到:

git push                                                                                                         
 ✔  10137  18:59:06
fatal: invalid refspec '(HEAD detached from 7c802ef57)'

我到底想做什么 git push -f origin Cool_Feature_1 并且仅在该 1 次提交中覆盖该小更改。基本上,我想从一个已经存在的合并请求中更改 1 个提交。

伙计们 建议创建一个新分支,但这对我来说不是一个选择。

如果你的编辑很容易,并且你想重新开始,你可以这样做:

git checkout Cool_Feature_1
git reset --hard origin/Cool_Feature_1

现在您有一个本地分支,就像 gitlab

上的分支一样
git rebase -i HEAD^^^^^

将启动交互式变基

您将获得最近提交的列表。如果您不将默认编辑器设置为其他内容,它将是 vim,如果您不知道如何操作,则很难使用。

那么每次提交之前都会有一个pick。对于要编辑的提交,将 pick 更改为 e。然后保存文件并退出编辑器。然后它将在您提交后立即停止。你可以像你说的那样修改它......然后输入git rebase --continue。比你 should 有一些东西就像原始的一样,除了那个提交更改。为了确保,请这样做:

git diff origin/Cool_Feature_1

此外,我喜欢使用 gitk

gitk Cool_Feature_1 origin/Cool_Feature_1

将并排向您展示这两个历史以及它们的不同之处。

然后,如果您对本地版本的分支感到满意,请像您在问题中所做的那样将其强制推送到原点。


或者做你所做的:

git checkout 7c802ef576fbad061c6fefb350fde386e7d09087

但现在您处于“分离的头脑”状态 - 但没关系。

进行更改

那么您需要获取您检出之后的所有提交。您可以从原始分支中挑选每一个:

git cherry-pick origin/Cool_Feature_1^^
git cherry-pick origin/Cool_Feature_1^
git cherry-pick origin/Cool_Feature_1

^ 表示前一个。所以我上面写的是最后 3 次提交。如果您编辑的是倒数第 4 个,那么请这样做。如果您正在编辑倒数第三个,则只需:

git cherry-pick origin/Cool_Feature_1^
git cherry-pick origin/Cool_Feature_1

然后看看你这样做对不对:

git diff origin/Cool_Feature_1

此外,我喜欢使用 gitk

gitk HEAD origin/Cool_Feature_1

这次本地分支被称为 HEAD 因为您签出该提交的方式。

实际上,像这样打开gitk并在整个过程中保持打开状态并在每个步骤之后查看它真的很有帮助。

如果您很高兴您的本地分支与您的远程分支相同,除了一个提交更改,然后强制推送它。

由于在这种情况下您没有本地分支机构,因此请执行以下操作:

git 推送原点 HEAD:Cool_Feature_1 -f