Git更改特定分支上特定推式提交的代码

Git更改特定分支上特定推式提交的代码,git,version-control,Git,Version Control,我仍然有一些困难,无法完全理解修改已推式提交的过程 我没有在主分支上工作(不知道这是否重要),我在Commit_2中提交并推送了错误的数据(例如,清除密码…)(见下文) 我只想更改此提交中的文件,不更改其他文件 当然,我已经阅读了git rebase、cherry pick等文档。。还有一些非常好的答案,比如说,或者,但是我仍然不知道怎么做 因此,基本上,我如何从更改文件,并且仅从Commit_2更改文件 提交54SDF4D5F4DSF45555Q5AAAA44FR 作者:我 日期:星期三9月1

我仍然有一些困难,无法完全理解修改已推式提交的过程
我没有在主分支上工作(不知道这是否重要),我在Commit_2中提交并推送了错误的数据(例如,清除密码…)(见下文)
我只想更改此提交中的文件,不更改其他文件
当然,我已经阅读了git rebase、cherry pick等文档。。还有一些非常好的答案,比如说,或者,但是我仍然不知道怎么做

因此,基本上,我如何从更改文件,并且仅从Commit_2更改文件

提交54SDF4D5F4DSF45555Q5AAAA44FR
作者:我
日期:星期三9月14日10:25:09 2016+0200
承诺3
提交ghgzf4x1522qx1x5f222y4d
作者:我
日期:2016年9月13日星期二15:01:42+0200
提交2
提交dfsdc4ycx45ds4fyc6d4fysfsd
作者:我
日期:2016年9月13日星期二14:57:08+0200
承诺1

我喜欢互动式再基地

git rebase -i ghgzf4x1522qx1x5f222y4d^
将提交设置为从
pick
e
进行编辑。然后进行更改(删除密码)。然后继续

git rebase --continue
现在您已经重写了历史,您将不得不强制推到远程

git push <remote> <branch> --force

无法更改提交中的任何内容。曾经提交由从其所有内容和历史中派生的sha1校验和标识,因此,当您更改任何内容时,它将具有不同的sha1,因此是不同的提交,随后的所有内容也将是不同的提交

因此,您唯一能做的就是从存储库中删除有问题的提交,并将其替换为更好的版本。您可以通过强制推送(
gitpush-f
)一个新版本来实现这一点,该版本不包含所有包含它的分支。您可以使用
git commit--amend
(如果是最新的提交)、
git rebase-i
(如果不是)或
git filter branch
创建新版本,如果它在历史中的位置更深


但是,如果任何人已经从存储库中获取了该提交,他们将保留该提交。您无法阻止它们。

一种方法可能是还原
Commit_2
,这将添加一个新的Commit,它将完全撤消对
Commit_2
中修改的每个文件所做的更改。如果您希望删除所有更改,但希望保留一些更改,那么这将是完美的

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

git show --pretty="" --name-only dfsdc4yc
现在确定要保留哪些文件,然后针对每种文件类型执行以下操作:

git checkout 54sdf4f4 file/to/restore
其中
54sdf4f4
Commit_3
的SHA-1散列。这将有效地重做对要保留的文件所做的一切

现在您可以提交此更改。由于您尚未推动本地工作,您可以通过以下方式修改回复提交:

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

如果我
git-rebase-i[commit_id]
,进行更改,然后
git-push-f
,我会从最近的提交中释放信息吗?@Mornor,您将用不包含该信息的新版本替换该rebase中的所有提交。但只有在该重新基址中的提交-如果有任何其他提交基于旧提交,它们仍然基于旧提交。他可以
git revert
,这将在功能上撤销提交,尽管原始提交仍将存在,如您所述。@TimBiegeleisen,他可以倒带并将其从所有当前头的历史记录中删除,但是,由于信息曾经存在,它可能已经被获取,因此必须视为已被泄露。请更改密码。如果你推了它,它就被推了。你不能不妥协。私人回购只与一个小团队共享,所以不重要。但我想确保在确实需要的情况下我可以这样做。这通常是首选,但我认为清除错误提交的密码需要重写,否则该密码在历史上仍然可用,其他人可以利用。@JeffPuckettII,错误推送的密码需要更改该密码。
git show --pretty="" --name-only dfsdc4yc
git checkout 54sdf4f4 file/to/restore
git commit --amend -m 'Undo of certain files from Commit_2'