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

时间:2016-09-19 11:51:11

标签: git version-control

我仍然有一些困难要完全理解修改已经推送的提交的过程。
我不是在主分公司工作(不知道是否有这个问题),我在 Commit_2 中承诺并推送了错误的数据(例如,清除密码......)(见下文) 。
我想只更改此提交中的文件,而不是更改其他文件。
当然,我已经阅读了文档git-rebase,cherry-pick等..以及来自SO的一些非常好的答案,如herehere,但我仍然不知道该怎么做它。

所以,基本上,我怎样才能从 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

3 个答案:

答案 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

其中54sdf4f4Commit_3的SHA-1哈希值。这将有效地重做对要保留的文件所做的所有事情。

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

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