Git 后悔药,指的是咱们操做本地代码以后想要恢复以前的代码,所须要作的一系列操做,好像是作过后悔了,想要吃后悔药同样,生活中虽没有后悔药,可是 git 的世界中是存在的哦!
# 注意跟切换分支不要搞混了,这个有两个横线,放弃对单个文件的修改 git checkout -- filename # 放弃对全部文件的修改 git checkout .
<!--more-->git
# 单个文件回到修改以后,add以前 git reset HEAD filename # 全部文件回到修改以后, add以前 git reset HEAD .
# 回到add以后,commit以前 git reset --soft HEAD^ # 回到修改以后,add以前 git reset --mixed HEAD^ # 回到修改以前,放弃对文件的修改 git reset --hard HEAD^ # 能够恢复到以前任意版本 git reset --hard 提交版本号
# 例若有三次提交,提交一、提交二、提交3,假如提交2版本有问题,想要撤销,可是不想影响以后的提交3 的内容,这就能够反作提交2 git revert -n 版本号 # 反作以后会自动生成一个新的提交,这个提交会撤销提交2,而保留提交3 #这里可能会出现冲突,那么须要手动修改冲突的文件。并且要git add 文件名
#切换到主分支 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 文件"命令一块儿用与修复冲突,提示开发者,一步一步地有没有解决冲突。
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直接提交,省略后面的
# 当临时须要去别的分支解决问题,又不想提交当前分支没写完的代码 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到远程就能够了