第二种情况 改变工作目录 ,又改变暂存区
把ccc追加到a文件
[root@ci-node1 git_test]# echo "ccc" >> a [root@ci-node1 git_test]# git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: a no changes added to commit (use "git add" and/or "git commit -a")
现在本地工作目录改变了 ,git add 提交到缓存区
现在本地工作目录和缓存区是一致的,唯一不一致是和本地仓库有区别
[root@ci-node1 git_test]# git add a
[root@ci-node1 git_test]# git diff --cached a diff --git a/a b/a index 126f52b..26a3227 100644 --- a/a +++ b/a @@ -1,2 +1,3 @@ test bbb +ccc
这时候可以拿本地仓库内容 覆盖暂存区,覆盖完暂存区,用暂存区覆盖本地工作目录
仓库状态覆盖暂存区,使仓库和暂存区是一样的
//撤销上一次的提交
git reset HEAD
//撤销上一次的提交 [root@ci-node1 git_test]# git reset HEAD a Unstaged changes after reset: M a // 查看工作区内容 [root@ci-node1 git_test]# cat a test bbb ccc
// 暂存区和本地工作目录不一致
[root@ci-node1 git_test]# git diff a diff --git a/a b/a index 126f52b..26a3227 100644 --- a/a +++ b/a @@ -1,2 +1,3 @@ test bbb +ccc
// 没有输出说明暂存区和本地仓库是一致的,
把本地仓库状态覆盖到暂存区
[root@ci-node1 git_test]# git diff --cached a [root@ci-node1 git_test]#
然后使用git checkout 把暂存区覆盖本地工作目录
[root@ci-node1 git_test]# git checkout -- a [root@ci-node1 git_test]# git status On branch master nothing to commit, working tree clean
第三种情况
[root@ci-node1 git_test]# echo "ccc" >>a // 加到暂存区 [root@ci-node1 git_test]# git add a [root@ci-node1 git_test]# cat a test bbb ccc
现在我发现改错了 不应该加ccc和 bbb ,要回退加上test的时候,跳过了bbb,跨commit
回退到某一次commit
git reset --hard 后面接要回到某一次commit 的唯一标识
commit 标识不需要加那么多 能标识到唯一就行 复制5 6 个字母
要通过 git log 查看提交日志,找到commit唯一标识,也可直接指定提交编号或序
[root@ci-node1 git_test]# git log commit ac31205c363e10a2860d836f22442a7ac8e6a6c0 Author: mingerlcm <892287990@qq.com> Date: Sat Mar 14 19:47:58 2020 +0800 commit a commit 353666de3969c9423cdc11a8f1046d62d11ace2c Author: mingerlcm <892287990@qq.com> Date: Sat Mar 14 19:43:18 2020 +0800 a commit af5856a1ebc7f2242ea0ec2a130ee90047a13531 Author: mingerlcm <892287990@qq.com> Date: Mon Aug 26 21:12:31 2019 +0800 modify a
要回到第一次修改a文件时候
// 加上要回到的commit id 标识 ,要跳到哪次commit 就加上哪次commit id [root@ci-node1 git_test]# git reset --hard af5856a1ebc HEAD is now at af5856a modify a // 回到刚开始加test的时候 [root@ci-node1 git_test]# cat a test
[root@ci-node1 git_test]# git status
On branch master
nothing to commit, working tree clean
再看看git log
之前加上bbb ,ccc的commit id log没有了
[root@ci-node1 git_test]# git log commit af5856a1ebc7f2242ea0ec2a130ee90047a13531 Author: mingerlcm <892287990@qq.com> Date: Mon Aug 26 21:12:31 2019 +0800 modify a commit 52e89813dff7c9e1261a6bdc94f284705cb8b4fb Author: mingerlcm <892287990@qq.com> Date: Mon Aug 26 17:55:44 2019 +0800 rename a.txt to a commit cc8bd8044be923aae7d44641fb99d25f574db8a5 Author: mingerlcm <892287990@qq.com> Date: Mon Aug 26 17:49:50 2019 +0800 rename a to a.txt commit 73d723093b88edda997936aa1fa7cc5ff1175e98
如果有这种需求,我们回退操作完,发现这个回退不是我们需要的,跳错了
原来想跳到加上bbb 那一次commit,跳到了加上test 那一次commit了
发现 git log 记录 没有那一次commit 没有那一次id
解决:看之前执行历史, 使用git reflog
查看本地历史操作 git reflog
git log 仅能查看终在仓库存在的提交信息,无法查看被删除的提交,以及在本地具体 Git 命令操作记录,这时候你需要使用 git reflog。
git reflog 可以查看所有在仓库所有做过commit历史记录
记录了每一次操作,这样就可以找到commit id
[root@ci-node1 git_test]# git reflog af5856a HEAD@{0}: reset: moving to af5856a1ebc ac31205 HEAD@{1}: commit: commit a 353666d HEAD@{2}: commit: a af5856a HEAD@{3}: commit: modify a 52e8981 HEAD@{4}: commit: rename a.txt to a cc8bd80 HEAD@{5}: commit: rename a to a.txt 73d7230 HEAD@{6}: commit (initial): commit a
现在想回到 加上bbb那一次commit
[root@ci-node1 git_test]# git reset --hard ac31205 HEAD is now at ac31205 commit a [root@ci-node1 git_test]# cat a test bbb
git log 只列出当前仓库状态提交自己之前commit ,但是回退到某一天点之后记录是没有了
git log 列出仓库到当前状态为止的所有日志
git reflog 列出所有历史操作的commit id , 每一次历史操作可以查到要去的commit 配合git reset --hard commit id使用
git 的撤销 和回退