共计 2918 个字符,预计需要花费 8 分钟才能阅读完成。
Git 后悔药,指的是咱们操作本地代码之后想要复原之前的代码,所须要做的一系列操作,如同是做事悔恨了,想要吃后悔药一样,生存中虽没有后悔药,然而 git 的世界中是存在的哦!
系列一:add 之前,也就是还没有增加到暂存区之前
# 留神跟切换分支不要搞混了,这个有两个横线,放弃对单个文件的批改
git checkout -- filename
# 放弃对所有文件的批改
git checkout .
<!–more–>
系列二:add 之后,commit 之前
# 单个文件回到批改之后,add 之前
git reset HEAD filename
# 所有文件回到批改之后,add 之前
git reset HEAD .
系列三:commit 之后,push 之前
# 回到 add 之后,commit 之前
git reset --soft HEAD^
# 回到批改之后,add 之前
git reset --mixed HEAD^
# 回到批改之前,放弃对文件的批改
git reset --hard HEAD^
# 能够复原到之前任意版本
git reset --hard 提交版本号
反做一个版本,生成一个新的提交
# 例如有三次提交,提交 1、提交 2、提交 3,如果提交 2 版本有问题,想要撤销,然而不想影响之后的提交 3 的内容,这就能够反做提交 2
git revert -n 版本号
# 反做之后会主动生成一个新的提交,这个提交会撤销提交 2,而保留提交 3
#这里可能会呈现抵触,那么须要手动批改抵触的文件。而且要 git add 文件名
合并分支之 rebase
# 切换到主分支
git checkout main
# 拉取最新代码
git pull
# 切换到开发分支
git checkout dev
# 将本地屡次提交合并成一次提交,益处是只须要解决一次抵触
git rebase -i HEAD~2 #合并提交 --- 2 示意合并两个
# 同步主分支的最新代码到 dev 分支
git rebase main #----> 解决抵触 --->git rebase --continue
# 切换回主分支
git checkout main
# 在主分支上合并 dev 分支
git merge dev
# 推送近程
git push
## 记录性能
git rebase --abort #会放弃合并,回到 rebase 操作之前的状态,之前的提交的不会抛弃;git rebase --skip #则会将引起抵触的 commits 抛弃掉(慎用!!);git rebase --continue #合并抵触,联合 "git add 文件" 命令一起用与修复抵触,提醒开发者,一步一步地有没有解决抵触。
一次性回退多个提交,并把 log 合并为一条 git revert + git rebase,
git revert 597ace36
:wq
git revert f187d3ef
:wq
git revert d301fafe
:wq
# 回退了三个版本之后会生成三个新的 log
# 而后能够应用 rebase 合并三个新的 log
git rebase -i 597ace36 #也能够 HEAD~3 相当于合并三个提交历史
# 留神 -i 前面的参数是不须要合并的 commit 的 hash 值,这里即从以后工夫往前推的第四个提交,包含新生成的三个提交 log
#pick 的意思是要会执行这个 commit
#squash 的意思是这个 commit 会被合并到前一个 commit
# 把前面两个 pick 批改成 squash
:wq
# 而后进入编辑合并日志的模式,把其中两个 Revert 正文正文掉,只剩一个合并日志如下:#Revert "后悔药系列,revert 三个之后合并为一个正文 rebash"
# This reverts commit 597ace360be8f00575bae40d5bf9bfea551a1c48.
# This reverts commit f187d3ef9c9eb0de74b4ad6c0fa5854b0e612539.
# This reverts commit d301fafe75cb5fadf5b98f0711c39243e4174e34.
:wq
分支创立系列
# 基于以后分支创立并切换到本地新分支,新分支 dev
git checkout -b dev
# 基于近程 dev 分支创立新的本地分支,本地没有 dev 分支呢
git chechout -b dev origin/dev
# 提交本地分支到近程
git push origin dev:dev
# 删除近程分支,相当于推送一个空分支到近程分支
git push origin :dev
# 本地切换分支
git checkout dev
# 删除本地分支
git branch -d dev
# 设置本地分支与近程分支的关联,设置关联之后,如果只有一个关联能够间接 git push
git push --set-upstream origin dev
# 也能够写全
git branch –set-upstream dev origin/dev
# 查看本地分支与近程关联
git branch -vv
# 如果只有一个关联,则能够应用 git push 间接提交,省略前面的
如何紧急切换分支?如何先 pull 在提交代码
# 当长期须要去别的分支解决问题,又不想提交以后分支没写完的代码
git stash save "暗藏以后没写完的代码"
# 这时候就能够切换分支操作了,解决完回来之后进行如下操作
# 查看暗藏的列表
git stash list
# 如果执行此命令会间接删除暗藏列表,如果只有一条方才的暗藏记录,间接用能够, 用完之后之前暗藏的代码就回来了,还会删除暗藏列表
git stash pop
# 如果只想代码回来,不删除暗藏列表,能够执行,stash@{0}, 复原暗藏列表中的 stash@{0} 的代码
git stash apply stash@{0}
# 提交代码之前,能够先暗藏本人代码,而后 pull, 之后 pop 放出本人暗藏的代码,解决抵触,提交,这样能够缩小合并的代码
git stash save "暗藏本人代码"
git pull
git stash pop
# 解决抵触
# 其中 Updated upstream 和 ===== 之间的内容就是 pull 下来的内容,==== 和 stashed changes 之间的内容就是本地批改的内容。碰到这种状况,git 也不晓得哪行内容是须要的,所以要自行 #确定须要的内容。#解决实现之后,就能够失常的提交了。git add .
git commit -m "正文"
git push
# 留神,发生冲突之后,即便 git stash pop, 代码也取出来了,然而 git stash list 中的储存代码记录仍然存在
# 这时候因为代码取出来了,所以能够间接删除 list 中的记录
# 不加参数默认删除最新的编号为 stash@{0} 的记录
git stash drop
# 或者本人指定删除的编号
git stash drop stash@{0}
近程删除了一些分支,本地还存在怎么办?
# 同步本地和近程的分支
git remote prune origin
# 用新的提交替换上一次提交,如果没有改变,则替换上一次的提交正文
git commit --amend -m "替换上次提交"
# 查看以后分支的最近几次提交
git reflog
合并分支
# 例如把 dev 分支合并到 main 分支
# 首先切换到 main 分支,并保障所有提交均最新,都 pull 过了
git checkout main
git merge dev
# 如果有抵触解决抵触,之后 push 到近程就能够了
关注我,更多精彩文章第一工夫推送给你
正文完