我仍然有一些困难要完全理解修改已经推送的提交的过程。
我不是在主分公司工作(不知道是否有这个问题),我在 Commit_2 中承诺并推送了错误的数据(例如,清除密码......)(见下文) 。
我想只更改此提交中的文件,而不是更改其他文件。
当然,我已经阅读了文档git-rebase,cherry-pick等..以及来自SO的一些非常好的答案,如here或here,但我仍然不知道该怎么做它。
所以,基本上,我怎样才能从 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
答案 0 :(得分:1)
我喜欢交互式rebase
git rebase -i ghgzf4x1522qx1x5f222y4d^
将该提交从pick
设置为e
进行编辑。然后进行更改(删除密码)。然后继续。
git rebase --continue
现在您已经重写了历史记录,您将不得不强制推送到遥控器。
git push <remote> <branch> --force
其他人需要非快进。
git fetch <remote>
git reset --hard <remote>/<branch>
或者
git pull --rebase
答案 1 :(得分:1)
无法更改提交中的任何内容。永远。提交由从其所有内容和历史派生的sha1校验和标识,因此当您更改任何内容时,它将具有不同的sha1,因此是不同的提交,因此将跟随它的所有内容。
所以你唯一能做的就是删除来自存储库的有问题的提交,用更好的版本替换它。你可以通过强制推送(git push -f
)一个不包含它的新版本来实现这一点。您使用git commit --amend
(如果是最新提交)创建新版本,git rebase -i
(如果不是)或git filter-branch
,如果它在历史记录的更深处。
但是,如果有人已经从存储库中提取了该提交,那么就可以保留它。你无法阻止他们。
答案 2 :(得分:1)
一种方法可能是还原Commit_2
,这将添加新的提交,这将完全撤消对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'