问题描述
场景:1.修改文件A,commit并push到远程仓库
2.修改文件B,commit,也push到了远程
3.现在A文件的修改错误了,需要回滚到之前的版本,但是文件B的修改需要保存下来,请问现在应该如何操作?
如果用git reset --hard命令回滚到A修改的版本号,那么B的修改也被丢弃了
问题解答
回答1:$ mkdir test$ cd test$ git init$ echo aaaa>a.txt$ echo bbbb>b.txt$ git commit -a -m 'init two files'[master (root-commit) 2ca34b8] init...$ echo update>a.txt$ git commit -a -m 'update file a'[master **e216f56**] update file a...$ echo update>b.txt$ git commit -a -m 'update file b'[master 6906147] update file b...$ git revert **e216f56**unix2dos: converting file f:/test/.git/COMMIT_EDITMSG...dos2unix: converting file f:/test/.git/COMMIT_EDITMSG...[master 2a9c653] Revert 'update file a'...回答2:
git revert (版本号)
回答3:这么做不会丢吧,我们都是这么做的..git reset --hard命令回滚到A修改的版本号git pull --rebase origin 分支号 拉下来B的代码看看有没有冲突,有冲突解决后 git push ..
回答4:git reset --soft HEAD@{id},这样就是将提交撤回了,但是工作区的修改不会消失,然后将错误的修改改对了再提交并push到远端吧
回答5:这种情况,我一般直接查log,把A文件还原,保证B文件完整
回答6:不可以直接把错了的修改好,然后提交一次覆盖掉吗?
回答7:不要在 public branch 上对已经提交的 commit 使用 git reset,如果有人已经 pull 了这些 commit,会很麻烦这种情况下应该用 git revert,会产生一个单独的 commit
回答8:git rebase -i HEAD^^^用默认编辑器打开一个文档,修个A那次提交前面改成drop或简写为d 保存。会自动舍弃那次提交(如果有冲突要自己解决冲突)
回答9:git log 查看 A之前 A B的commitId
git reset --hard A之前的commitId
git cherry-pick B的commitId
这个功能叫检出功能,可以拿到某一次提交的修改
回答10:只能revert,不能reset,凡是已经push到远程的commit都不能reset或者commit --amend,这个会破坏别人的版本历史。
关于revert可以看看我的这篇文章:/a/11...