在特定的分支中,将代码更改为特定推送提交的Git操作

3
我仍然有一些困难,完全理解修改已推送提交的过程。我没有在主分支上工作(不知道是否重要),而是在Commit_2中提交和推送了错误的数据(比如说,明文密码...)。我想仅更改此提交中的文件,而不更改其他文件。当然,我已经阅读了git-rebase、cherry-pick等文档以及一些非常好的SO答案,例如这里这里,但我仍然不确定如何做。所以,基本上,我应该如何从Commit_2中仅更改文件?
commit 54sdf4f4d5f4dsf4555q5aaaa44fr
Author: me <me@me.com>
Date:   Wed Sep 14 10:25:09 2016 +0200

    Commit_3

commit ghgzf4x1522qx1x5f222y4d
Author: me <me@me.com>
Date:   Tue Sep 13 15:01:42 2016 +0200

    Commit_2

commit dfsdc4ycx45ds4fyc6d4fysfsd
Author: me <me@me.com>
Date:   Tue Sep 13 14:57:08 2016 +0200

     Commit_1

更改密码。如果您已经推送了它,那么通过推送它已经被泄露。您无法撤销任何泄露。 - Jan Hudec
仅与小团队分享的私有仓库,因此不重要。 但是如果确实需要,我希望确保自己能够做到。 - Mornor
3个回答

2

我喜欢交互式变基

git rebase -i ghgzf4x1522qx1x5f222y4d^

将该提交从 pick 更改为 e 进行编辑。然后进行更改(删除密码)。然后继续。
git rebase --continue

现在你已经重写了历史记录,需要强制推送到远程。
git push <remote> <branch> --force

其他人需要进行非快进式拉取。

git fetch <remote>
git reset --hard <remote>/<branch>

Or maybe

git pull --rebase

1
无法更改提交中的任何内容。每个提交都由其所有内容和历史派生的sha1校验和标识,因此当您更改任何内容时,它将具有不同的sha1,因此是不同的提交,并且随后的一切也是如此。
因此,您唯一能做的就是从存储库中删除有问题的提交,并用更好的版本替换它。您可以通过强制推送(git push -f)一个不包含有问题提交的新版本到每个使用了该提交的分支来实现这一点。如果它是最新的提交,则使用git commit --amend创建新版本;如果不是,则使用git rebase -i;如果它在历史记录深处,则使用git filter-branch。
但是,如果任何人已经从存储库中提取了该提交,则他们将保留该提交。您无法阻止他们。

如果我执行 git rebase -i [commit_id],进行更改,然后再执行 git push -f,那么是否会丢失最近提交的信息? - Mornor
@Mornor,你将用不包含信息的新版本替换该变基中的所有提交。但是只有该变基中的提交会被替换,如果还有其他基于旧提交的提交,则它们仍然基于旧提交。 - Jan Hudec
他可以使用 git revert 命令来撤销提交,但是原始提交仍然存在,就像你之前提到的那样。 - Tim Biegeleisen
1
@TimBiegeleisen,他可以倒带并从所有当前头部的历史记录中删除它,但由于信息曾经存在,可能已经被获取,因此必须视为已被泄露。 - Jan Hudec

1

一种方法是回退Commit_2,这将添加一个新的提交,它将完全撤消对Commit_2中修改的每个文件所做的更改。如果您想要删除所有更改,则此方法非常完美,但是如果您想要保留某些更改,则不适用。

运行以下命令以查看在Commit_2中更改了哪些文件:

git show --pretty="" --name-only dfsdc4yc

现在确定您想要“保留”的文件,然后针对每个文件类型执行以下操作:
git checkout 54sdf4f4 file/to/restore

其中54sdf4f4Commit_3的SHA-1哈希值。这将有效地重做您想要保留的文件所做的一切更改。

现在,您可以提交此更改。您可以修改还原提交,因为您尚未推送本地工作,方法如下:

git commit --amend -m 'Undo of certain files from Commit_2'

1
通常情况下,这是首选的,但我认为清理错误提交的密码的情况需要重写,否则密码仍然可以在历史记录中被他人利用。 - Jeff Puckett
2
@JeffPuckettII,错误地推送了密码,需要更改该密码 - Jan Hudec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接