如何在git中的先前提交中回滚文件中的更改

时间:2009-08-29 00:16:35

标签: git

我做了3'git commit',但我没有做过'git push'。

1. commit 1
2. commit 2
   touches fileA
   touches fileB
   touches fileC
3. commit 3

那我怎么能

  1. 回滚我在文件b中为提交2做的更改? (因为我已经'git commit'了,我不能做'git checkout - fileB'了,我怎么能回滚我的更改?
  2. 在fileC中进行更改并使其成为提交2的一部分?我想我现在可以改变文件,然后运行'git rebase -i HEAD~2'正确吗?

4 个答案:

答案 0 :(得分:5)

这应该有效:

1. git rebase -i HEAD~2
2. in your editor, select the following:

edit 9b86592 commit 2
pick f3907cb commit 3

3. at this point roll back the changes you made in fileB, for example with
   `git checkout <version_you_want>` or by manually editing the file
4. make the changes in fileC you want to be part of commit 2
5. `git add fileB fileC`
6. `git commit --amend`
7. `git rebase --continue`

如果在git尝试应用提交时发生冲突,您可能需要解决合并问题3.解决后再次运行{/ 1}}。

答案 1 :(得分:2)

使用git rebase -i HEAD~2并编辑第二次提交。

答案 2 :(得分:0)

假设你在分支主人身上且有一棵干净的树:

# checkout incorrect commit
git checkout <sha1_of_commit2>

# revert the changes to fileB by checking out the parent version
git checkout HEAD^ -- fileB

# make an amended commit
git commit --amend

# go back to master
git checkout master

# transplant the changes since the bad commit onto the amended commit
git rebase --onto HEAD@{1} <sha1_of_commit2>

答案 3 :(得分:0)

我就是这样做的。

签出旧版本的fileB并提交

git checkout HEAD~3 -- fileB
git commit -m"fix fileB" fileB

现在使用旧提交来修改你的修复

git rebase -i HEAD~3

现在将您最近的提交“修复文件B”移动到提交2之后,并将“选择”指令更改为“压缩”,加入提交更改文件B并重置提交。