zoukankan      html  css  js  c++  java
  • Git 后悔药系列

    关注我,更多精彩文章第一时间推送给你

    Java之康庄大道

    Git 后悔药,指的是我们操作本地代码之后想要恢复之前的代码,所需要做的一系列操作,好像是做事后悔了,想要吃后悔药一样,生活中虽没有后悔药,但是 git 的世界中是存在的哦!

    系列一:add 之前,也就是还没有添加到暂存区之前

    # 注意跟切换分支不要搞混了,这个有两个横线,放弃对单个文件的修改
    git checkout -- filename
    
    # 放弃对所有文件的修改
    git checkout .
    

    系列二: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到远程就可以了
    

    每次pull 和push都需要密码

    # 执行下面这条命令,之后再 git pull一次,会让你输入密码,这次输入之后,下次就不需要了
    git config --global credential.helper store
    git pull
    

    git cherry-pick 38361a68

    当在dev和main分支同步后,dev上push了一次修改,不用合并merge命令怎么把这次修改应用到main分支上?

    # 首先在dev上获取提交号 commitId,我这里是38361a68
    git log
    # 然后去main分支
    git checkout main
    # 应用这次提交
    git cherry-pick 38361a68
    # 推送到远程
    git push
    
    
  • 相关阅读:
    Multisim的电路分析方法
    转载论文关于fir滤波器的fpga实现
    verilog数组定义及其初始化
    FIR滤波器的FPGA实现方法
    matlab的fda工具使用方法
    卷积的幽默解释
    lvds配置
    latch的产生和消除
    时序优化实例
    第九篇:使用 lstat 函数获取文件信息
  • 原文地址:https://www.cnblogs.com/yunqing/p/14687311.html
Copyright © 2011-2022 走看看