文章目录
- 1、git回退未commit
- 2、git回退已commit
- 3、git回退已push的代码
- 3.1 直接丢弃某一次的push
- 3.2 撤销push后,不丢弃改动,重新修改后要再次push
- 4、合并某一次commit到另一个分支
整理几个工作上遇到的git问题。
1、git回退未commit
git回退未commit,即 在一个分支修改代码后,还没commit提交,不想要这些修改了,想回到刚开始的样子
- 查看修改的文件
git status
- 放弃单个文件的修改
// 注意:
// 1、--和文件路径之间是有个空格的
// 2、后面跟git status返回的文件的全路径
git checkout -- 你的文件path/your-file.java
- 也可直接放弃所有修改
git checkout .
= = = = = = = = = = = 完成分割线 = = = = = = = = = = = =
两点补充说明:
-
1) git checkout -b 分支名 是切换分支,注意
-b
-
2)
git checkout -- main.go
: 这个命令的作用是撤销对文件 main.go 的修改,它会丢弃工作区中 main.go 的更改,常用于恢复意外的修改或者放弃不需要的更改 -
3) git checkoout --main.go时,可能会有以下弹窗:内存变更Memory Changes即你新加的那些变更,既然不要这些改动了,那就选Load File System Change即可,也可先Show Difference确认下不同
2、git回退已commit
git回退已commit,即 在一个分支修改代码并commit到了本地仓库,但没push到远程仓库,想回到刚开始的样子
。回退所有已commit的文件:
图形界面操作
打开git log,直接Drop Commit
,注意,这样不仅会让这次commit从待push列表移除,且这次commit里对代码的修改也会回退到原样,即这次commit的修改会丢失
那这样,也可以解决上面的场景(git回退未commit),即先commit,再drop commit
指令操作
用指令的话:
- 先看下当前分支的head位置,发现就是我刚commit的那次
git log --pretty=oneline --all --graph --abbrev-commit
- 回退,丢弃一次提交,HEAD~n,其中 n 是你要回退的提交数。如,HEAD~2 表示回退两个提交,注意–hard相当于上面的
Drop Commit
,会放弃commit并丢失这次commit对代码的修改
git reset --hard HEAD~1
- 如果只是想放弃commit,但这次commit对代码的修改需要保留,可以使用
--soft
git reset --soft HEAD~1
回退某一个已commit的文件
如果只是放弃已commit文件里的某一个文件,可以先放弃提交:
git reset --soft HEAD~1
然后重新提交需要的文件,试了半天git checkout,好像不好使。
3、git回退已push的代码
图形界面操作
最近一次的push我不要了,那就选择上一次push的位置,右键Reset Current Branch to Here(注意这里改的是本地仓库,远程仓库此时还是那个样子
)
此时,上一次push的代码就在你的待commit列表里:
要改的话,就改,直接不要了的话,就git checkout --filename
强推到远程:
git push --force origin <branch-name>
// 或者
git push -f origin <branch-name>
之所以强推到远程,是因为刚才reset,改变的是本地仓库,远程还是没变,因此需要强推到远程,直接git push也不行,因为此时远程仓库比本地版本超前,会报错non-fast-forward
指令操作
3.1 直接丢弃某一次的push
- 用commit编号或者
HEAD~n
(注意,–hard是这次commit或者push的修改直接丢弃,–soft则是保留修改),如果是直接不要这次push的改动了,就用–hard,如果是想撤回这次push的改动后重新修改,就用–soft
git reset --hard <commit-hash>
git reset --hard HEAD~1
强推到远程:
git push --force origin <branch-name>
// 或者
git push -f origin <branch-name>
3.2 撤销push后,不丢弃改动,重新修改后要再次push
git reset --soft HEAD~1
此时最好就别强推了,直接push,会有冲突,合并下冲突即可。
4、合并某一次commit到另一个分支
只把A分支的一次提交,合并到B分支:
- 切换到A分支,找到要合过去的那次提交的哈希值,比如abcdef1234567890
git log
// q退出
- 切换到B分支,将那一次commit合过来
git cherry-pick abcdef1234567890
- 处理冲突