使用命令行操作git add,commit等操作后发现有问题,需撤销…

git介绍

Git 本地数据管理,大概可以分为三个区,工作区,暂存区和版本库。

  • 工作区(Working Directory)。是直接编辑的地方,肉眼可见,直接操作;
  • 暂存区(Stage 或 Index)。数据暂时存放的区域;
  • 版本库(commit History)。存放已经提交的数据,push 的时候,就是把这个区的数据 push 到远程git仓库了。

将修改添加到暂存区:

1
git add

将暂存区的内容提交到版本库中:

1
git commit
1
2
3
git diff                # 工作区 vs 暂存区
git diff head # 工作区 vs 版本库
git diff –-cached # 暂存区 vs 版本库

建立仓库

全局修改默认分支master到main

1
git config --global init.defaultBranch main

git提交前,现在git网页中新建仓库,获取链接。在本地做如下操作:

本地新建仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 进入仓库文件夹
git init

# 如果在此步骤需要改名为main,先要有commit才能执行该分支名
git add README.md
git commit -m "Init commit"
git branch -M main # 修改master分支名为main

# 改名后执行以下:
git remote add origin git@github.com:***/forward.git # 使用自己的地址
# 如果本地配置了多个git账户,可能造成clone失败,
# 使用配置的Host进行clone,git remote add origin git@Host:***/forward.git
git add .
git commit -m "your message"
git push -u origin main

修改分支名

git init生成的分支名为master,而github新建的默认分支名为main,在init之后修改分支名:

1
2
# git branch -m old_branch new_branch
git branch -m master main

push本地已存在仓库

1
2
3
git remote add origin git@github.com:***/forward.git
git branch -M main
git push -u origin main

git撤销操作

git撤销工作区的修改

git撤销工作区的修改,此时,没有使用git add .

  • 撤销某个文件的修改
    1
    git checkout -- filename
  • 撤销所有文件的修改
    1
    git checkout .

git撤销add

本地操作git add .后发现操作食物或者有些文件不需要add,测试需要撤销该add动作:

  • 撤销所有add

    1
    git reset HEAD
  • 撤销a.cpp和b.cpp文件的add

    1
    git reset HEAD a.cpp b.cpp

再使用git status查看状态,已撤销add操作。

git撤销本地commit

本地操作:

1
2
git add .
git commit -m "msg"

撤销操作:

  • 用法一:git reset [-q] [] [–]
  • 用法二:git reset [–soft | –mixed | –hard | –merge | –keep ] [-q] [commit]

git reset命令一般会修改本地仓库:

  • –mixed HEAD 修改暂存区里面的内容为当前快照里的内容,是git reset默认的参数,因此可缺省;
  • –soft HEAD 本地仓库、暂存区、工作区都不改变。只撤销commit状态,不会删除修改的数据;
  • –hard HEAD 修改暂存区、工作区里面的内容为当前快照里的内容。(这个很危险,曾经踩过坑,电脑的文件丢失了很多,也是导致我决心好好学一学git的原因,慎用)。会删除修改的数据。

实例:

  • 撤销上一个commit,保留修改的数据:

    1
    2
    3
    4
    git reset
    或 git reset --soft HEAD
    或 git reset --soft HEAD~1
    或 git reset [last_commit id]
  • 撤销前n个commit,保留修改的数据:

    1
    2
    git reset --soft HEAD~n
    或 git reset [last good commit id]
  • 撤销上一个commit,不保留数据(慎重使用):

    1
    git reset --hard HEAD 

git撤销push

本地操作:

1
2
3
git add .
git commit -m "msg"
git push

现在本地执行撤销commit操作,回到需要保留的commit上,执行:

1
git push origin branch-name --force

可以看到本地该commit上的内容和远程的保持一致了。

gitignore

取消已经track的文件。

1
2
3
4
5
6
7
8
9
git reset HEAD~1
#修改.gitignore文件
git add .gitignore
git rm -r --cached 文件名
git status #查看
git add .
git status
git commit -m "msg"
git push -f