「Git 笔记」修改一个 staged 但未提交文件 & git log 丢失问题

初始状态


比如我们编辑 git 仓库内的 README.md,并将其 add to stage

这时候仓库状态

然后我们再对 README.md 进行修改

再来查看仓库状态

出现了同一文件同时处于 staged 和 modified 状态(接下来的操作全部都是从这个状态作为初始状态的进行测试的)

用这个状态依次试试 add/checkedout/commit/commit -a 这个文件,并查看文件和仓库状态

操作


add

先看 shell 的提示符:git:master o,说明当前仓库已经 clean 了,使用 status 命令查看也证实了这一说法

查看文件发现是第二次 modify 的版本(> Test ref)

可以推断在 add 了 unmodified 内容至 staged(覆盖原有 staged 内容) 之后自动地将 staged 内容提交了

但是这样就有一个问题,我们并没有为这次 commit 添加任何信息,让我们再来看看 git log,下面是最新的一次提交信息

看时间明显不是我这次 add 造成的自动 commit 的 log(上面 shell 中有显示当前系统时间)

那是不是可以视为这次提交的 log 丢失了呢?有知道具体原因的可以在评论区告诉博主

checkout

可以看到 unmodified 的文件已经消失了

再查看一下文件内容,发现变回了### Test h3

checkout 完全地撤销了 README.md 的这次 modify

commit

可以看到暂存区中的内容已经被提交了(有一个 deletion 的原因是我 REAME.md 文件中本来就有一行数据,被我 echo 命令给覆盖了),而 modified 文件依旧

再查看一下文件内容,发现还是> Test ref(已经 commit 的那个版本中是### Test h3,因此当前仓库还是处于 not clean 状态

commit -a

可以看到这次提交失败了

有意思的是提示当前仓库是 clean 的,但我们查看仓库状态发现当前状态和执行这条失败的 commit 前是一样的,这应该是一个 bug

不出意外,文件是第二次 modify 的内容(> Test ref)

### 总结

总而言之,为了方便管理和避免不必要的麻烦,我们自己在进行操作的时候应该尽量避免这种状态

但是无意进入这种状态之后:

  • 尽量选择 commit 操作把当前 staged 内容处理之后,再去处理 unmodified 内容

  • 如果第二次 modify 的内容不重要的话也可以直接 checkout 这次 modify,但是不推荐

  • 特别不推荐的就是在这种情况下使用 add,我在测试中就出现了无 log 提交的情况,如果第一次 modify 的内容很重要的话就很麻烦了

以上

6 评论

  1. 我用2.18版本的git无法复现第6步,博主你用的git是最新版的么?(你的Let’s Encrypt的证书今天过期了)

    Admin@DESKTOP-FRQ1D3O MINGW64 /d/Users/Admin/Documents/git/1 (master)
    $ git add 1.txt

    Admin@DESKTOP-FRQ1D3O MINGW64 /d/Users/Admin/Documents/git/1 (master)
    $ git status
    On branch master
    Changes to be committed:
    (use "git reset HEAD ..." to unstage)

    modified: 1.txt

    1. 下面是我的复现结果(使用的不是一个环境),果然不一样了…我现在的版本是 2.11
      最终结果是第二次修改覆盖第一次修改并 staged,明天有空的话我会去找找之前哪个环境的版本并测试的(QAQ,对了谢谢提醒证书问题,已刷新,最近关注博客很少…过段时间可能会提高活跃度…=v=)
      下面是我的详细复现过程:

      # yx17 @ FRAN-LAPTOP-X1C18 in ~/src/test on git:master o [23:15:33]
      $ touch t.md

      # yx17 @ FRAN-LAPTOP-X1C18 in ~/src/test on git:master x [23:15:52]
      $ ls
      t.md

      # yx17 @ FRAN-LAPTOP-X1C18 in ~/src/test on git:master x [23:15:53]
      $ git status
      On branch master

      Initial commit

      Untracked files:
      (use "git add ..." to include in what will be committed)

      t.md

      nothing added to commit but untracked files present (use "git add" to track)

      # yx17 @ FRAN-LAPTOP-X1C18 in ~/src/test on git:master x [23:15:58]
      $ git add t.md

      # yx17 @ FRAN-LAPTOP-X1C18 in ~/src/test on git:master x [23:16:30]
      $ git status
      On branch master

      Initial commit

      Changes to be committed:
      (use "git rm --cached ..." to unstage)

      new file: t.md

      # yx17 @ FRAN-LAPTOP-X1C18 in ~/src/test on git:master x [23:16:33]
      $ echo '> test ref ' > t.md

      # yx17 @ FRAN-LAPTOP-X1C18 in ~/src/test on git:master x [23:17:09]
      $ git status
      On branch master

      Initial commit

      Changes to be committed:
      (use "git rm --cached ..." to unstage)

      new file: t.md

      Changes not staged for commit:
      (use "git add ..." to update what will be committed)
      (use "git checkout -- ..." to discard changes in working directory)

      modified: t.md

      # yx17 @ FRAN-LAPTOP-X1C18 in ~/src/test on git:master x [23:17:16]
      $ git add t.md

      # yx17 @ FRAN-LAPTOP-X1C18 in ~/src/test on git:master x [23:17:52]
      $ git status
      On branch master

      Initial commit

      Changes to be committed:
      (use "git rm --cached ..." to unstage)

      new file: t.md

      1. 唉呀,你的邮件被过滤器过滤了,导致我一直以为你没有回复我。今天突然想起来这里看一下,才看到有回复。过滤器我已经关了。电脑装双系统是什么感觉啊?

        1. 把电脑带出去用时耗电极快(滑稽)

          其实个人建议如果不是必须的话不要双系统, 单 WIndows 或者 Linux 把.
          如果工作学习必须 WIndows 相关, 推荐用 Windows; 除此之外, 如果工作学习需要在 Linux 上也可以经过一定的学习和配置完成的话, 单 Linux 很赞, 能学到很多东西(还能减少打游戏的时间)

          我用 Windows 作为主力主要是电量的原因, 在 Windows 省电模式下, 不插电源续航 8h+, Linux 下简直尿崩…可能是因为我不知道怎么优化把

          另外如果真有一定的双系统需求的话, 好点的配置(特别是内存) + 虚拟机 这个解决方案其实还是不错的, 新手也不容易搞崩 QAQ

          另外为什么我的提醒邮件会被 spam…是要手动配置些什么吗…

          以上

          1. 8小时续航很不错嘛。我自己还是喜欢用虚拟机,不喜欢直接装在物理机上。怕搞崩了又浪费一天时间重装系统和软件。
            是我这邮箱本身的问题,加到白名单就行了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注