在多人合作程序开发的过程中,有时会将错误提交的情况,此时希望能撤销提交操作,让程序回到提交前的样子,解决方法:回退(reset)、反做(revert)。

常用命令

  • 添加用户
1    git config --global user.name "clibing"
2    git config --global user.email "wmsjhappy@gmail.com" 
  • 查看git配置及用户信息
1    git config –list
  • 生成SSH秘钥(2种方式:1.git GUI图形界面化操作; 2.git命令,即以下流程)
    • 1查看是否有秘钥,有则备份然后删除文件夹
      1    cd ~/.ssh 
      2    ls 
      
    • 2正式生成,输入指令再 按三次回车,也就是第三次回车指纹密码输入可以为空
      1    ssh-keygen -t rsa -C "clibing@gmail.com"
      
    • 3添加私钥到 ssh(如果配置过指纹密码就要输入验证)
      1    ssh -add id_rsa
      
  • 进入计算机系统用户文件夹,找到id_rsa.pub,打开复制到github的setting的SSH keys当中(该网站服务器可以添加多个ssh key公钥)
  • 测试本机是否有访问GitHub的权限
    1  ssh git@github.com
    

基本概念

3个步骤

工作区->暂存区->本地仓库->远程仓库

正常情况下,我们的工作流就是3个步骤,对应上面的的3个箭头线:

1git add .   注意"."为当前目录会将全部加入,不建议使用。使用git add 具体到某个文件
2git commit -m "填写本次提交的信息"
3git push
  1. git add .: 将所选文件加入暂存区
  2. git commit -m 'commit message': 将所有文件从暂存区提交进本地仓库
  3. git push:把所有文件从本地仓库推送到远程仓库, 如果时分支推送可能会用到git push -o origin 分支的具体名字

4个区

用过svn的人知道,svn addsvn ci这些命令,git比svn多出了一个暂存区的概念

  • 工作区(Working Area)
  • 暂存区(Stage)
  • 本地仓库(Local Repository)
  • 远程仓库(Remote Repository)

5中状态

  • 未修改(Origin)
  • 已修改(Modified)
  • 已暂存(Staged)
  • 已提交(Committed)
  • 已推送(Pushed)

根据上面的5中状态会出现一下几种情况

  • 已修改-未暂存
  • 已暂存-未提交
  • 已提交-未推送

阶段撤销

git reset 是将HEAD指针指定到某个位置。位置之后的丢失代码

根据以上几种情况进行撤销

  • 未加入暂存区

    文件已经修改未执行git add .加入暂存区时,如果回退可以执行git checkout .或者git reset --hard 注意执行后修改的记录会丢失

  • 已暂存未提交

    文件修改后,执行了git add .当时没有执行git commit -m "commit message",此时需要撤销,可以执行

    1git reset
    2git checkout .
    

    git reset只是把文件退回到git add .之前的状态,注意文件还是处于已修改未暂存的状态,如果想回到未修改状态还需要执行git checkout .或者用一条命令git reset --hard

    1git reset --hard
    
  • 已提交未推送

    即已经执行了git commit -m "commit message"此时代码已经进入了本地仓库,如果此时想回退可以执行git reset --hard orgin/master,此方法多了一个origin/master,意思是从远程仓库拉取到本地仓库

  • 已推送

    当指向某就一个提交最为当前分支的HEAD,如果之前的提交已经推送。这是再次git push会失败,此时需要采用git push -f强行推送

    此时代码已经推送到了中央仓库,此时本地仓库与远程仓库相同了,需要先恢复本地仓库在强push到远程仓库

    1git reset --hard HEAD^`
    2git push -f
    
  • 当撤销后想再次撤销时

     1root@rock64:/share/dockerfile# git reflog
     242d8afa HEAD@{0}: commit: add postgresql and docker-clean shell
     3a07c7da HEAD@{1}: reset: moving to origin/master
     46fe27f6 HEAD@{2}: reset: moving to 6fe27f6
     5a07c7da HEAD@{3}: reset: moving to origin/master
     66fe27f6 HEAD@{4}: commit: add postgresql and add clean docker no used or exist
     7a07c7da HEAD@{5}: commit: add armhf and alpine minirootfs
     8a9a7a65 HEAD@{6}: commit: fix glibc lib
     9863b8f3 HEAD@{7}: commit: add nginx mariadb dockerfile
    10b845e3d HEAD@{8}: commit: add arm64v8 base
    11161e612 HEAD@{9}: commit: rename
    123c1b2cc HEAD@{10}: commit: add build date
    130acafff HEAD@{11}: commit: add build base alpine
    14e4b6400 HEAD@{12}: commit: rename rock64 to aarch64(arm64v8)
    15bd3a2e2 HEAD@{13}: commit: add armhf x86_64 from private version server
    16a6fbf52 HEAD@{14}: commit (initial): add rock64 dockerfile from respi
    17# 进入到指定版本
    18git reset --hard 6fe27f6
    
  • revert某个一个版本

    使用 git log 进行查看提交的记录

    使用git revert -n "版本号"进行版本撤销。注意会产生冲突。需要解约

总结

以上4种状态的撤销我们都用到了同一个命令git reset --hard,前2种状态的用法甚至完全一样,所以要掌握了git reset --hard这个命令的用法