1、恢复到某个commit的两种方法
回退:git reset
原理: git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本。
适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。
回滚:git revert
原理: git revert是用于回滚某一个版本,以达到撤销该版本的修改的目的。
适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。
区别
reset: 目标版本之后的版本不见了。
revert: 目标版本之后的版本还在,并生成一次最新的提交记录。
比如,我们commit了三次提交(commit_id_1、commit_id_2、 commit_id_3),突然发现commit_id_2有问题不需要了,想要撤销commit_id_2的提交。两种方法操作的结果区别:
git reset commit_id_2
# commit_id_2提交没了,commit_id_3提交也没有了。
git revert commit_id_2
# commit_id_2没了,commit_id_3还有,还生成了最新的commit_id_4。
具体操作
## git reset ,三种模式:soft,mixed,hard
# 回退到上个版本
git reset --hard HEAD^
# 回退到前2次提交之前,以此类推,回退到n次提交之前
git reset --hard HEAD~2
# 退到/进到 指定commit的sha码
git reset --hard commit_id
## git revert
# 回滚最新一次的提交
git revert HEAD
# 回滚前一次的提交
git revert HEAD^
# 回滚历史上的某次commit
git revert commit_id
最后别忘了强推覆盖远程
git push origin/test --force
或
git push origin/test -f
git reset 的三种模式:hard、soft、mixed
reset --hard: 重置暂存区(stage)和工作目录(working tree)。
reset --soft: 保留工作目录(working tree),并把重置 HEAD 所带来的新的差异放进暂存区(stage)。
reset --mixed: 保留工作目录,并清空暂存区。简而言之,就是把所有差异放在工作目录中。reset 如果不加参数,那么默认使用 --mixed 参数。
示例
# 将分支回退到指定提交,工作区维持现状不变,暂存区会在现有基础上增加该commit之后的提交。
# 例如提交了两次,id为commit_id_1、commit_id_2
# 将分支回退到指定提交commit_id_2,暂存区和工作区都会被同步为该指定的提交
git reset --hard commit_id_2
# 想要commit_id_2的提交回到工作区则需执行
git reset --soft commit_id_1
# (默认操作,参数--mixed可不加)将分支回退到指定提交,暂存区也被同步为该指定提交,工作区保持不变
git reset --mixed commit_id_2
# 执行完之后不能git pull,否则又会把远程的拉到本地,这里应该强制推送到远程覆盖掉
git push origin/test -f
2、合并代码的三种方法
区别
如果需要另一个分支的所有代码变动,那么就采用合并
merge: 保持修改内容的历史记录,但是历史记录会很复杂。
rebase: 历史记录简单,是在原有提交的基础上将差异内容反映进去。
想简化合并的历史记录就用rebase。
只需要部分代码变动(某几个提交),这时可以采用 Cherry pick
具体操作
# 仓库有 master 和 feature 两个分支
a - b - c - d master
\
e - f - g feature
# 将 feature 分支合并到 master 分支
# 切换到 master 分支
git checkout master
# merge
git merge feature
# rebase
git rebase feature
# cherry-pick
# 现在将提交f应用到 master 分支
# Cherry pick 操作
git cherry-pick f
# 合并多个提交
git cherry-pick e f
# 合并一系列连续的提交
# 下面这个不包含 e
git cherry-pick e..g
# 包含 e
git cherry-pick e^..g
取消合并
git merge --abort
git rebase --abort
git cherry-pick --abort
3、重置分支
用master重置test分支
# 先切换到test分支
git checkout test
# 再将本地的test分支重置成远程的master
git reset --hard origin/master
# 最后推送到远程test分支
git push origin/test --force
4、暂存代码
# 暂存
git stash
或
git stash save “修改的信息"
# 弹出代码
git stash pop
或
git stash list
git stash apply stash@{0}
5、Git放弃修改
取消已提交到暂存区的修改
# 1、先获取到远程的所有更新
git fetch --all
# 2、指向远程库origin的master(可更改成自己想要取的远程分支)
# 执行需要被远程哪个分支给覆盖掉
git reset --head origin/master
# 3、更新到本地
git pull
取消还在工作区的修改
git checkout .
其他命令
# 创建分支
git checkout -b f-dev-001