[git] 细说commit (git add/commit/diff/rm/reset 以及 index 的概念)

时间:2023-01-06 20:58:33
http://kasicass.blog.163.com/blog/static/39561920133294219374/
创建测试仓库
$ git init
$ echo "line one" >> foo.txt
$ git add foo.txt
$ git commit -m "first commit"
 
说说 add/reset/diff
我们修改一下 foo.txt,看看效果。
$ echo "line two" >> foo.txt
$ git diff
diff --git a/foo.txt b/foo.txt
index 2d00bd5..e5c5c55 100644
--- a/foo.txt
+++ b/foo.txt
@@ -1 +1,2 @@
 line one
+line two
此时,git diff 可以看到修改内容,但不能 git commit 提交之。
修改的内容,默认会处于 unstage 状态(修改了,但commit不提交),git status 可以看到状态。
$ 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:   foo.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
如果想提交,需要显式 git add 一下。修改的文件状态会变为 staged。
然后 git diff 就看不到修改内容了,而 git diff --cached 才能看到。
当然,也可以用 git commit -a foo.txt 直接提交,而不需要显式 git add foo.txt。
$ git add foo.txt
$ git diff
$ git diff --cached
diff --git a/foo.txt b/foo.txt
index 2d00bd5..e5c5c55 100644
--- a/foo.txt
+++ b/foo.txt
@@ -1 +1,2 @@
 line one
+line two
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
# modified:   foo.txt
#
这个优点,同时修改了两处代码,只想提交某一处修改,则显式 git add 想提交的文件即可。
已经 git add 的文件,可以通过  git reset <file> 来 un-add。
$ git reset foo.txt
Unstaged changes after reset:
M foo.txt
$ git diff --cached
$ git diff
diff --git a/foo.txt b/foo.txt
index 2d00bd5..e5c5c55 100644
--- a/foo.txt
+++ b/foo.txt
@@ -1 +1,2 @@
 line one
+line two
如果要将 foo.txt 恢复到修改前的状态,可以 git checkout。
$ git checkout foo.txt
$ git diff
$ git status
# On branch master
nothing to commit (working directory clean)
 
rm、mv 和 log --follow
先给仓库再加入个文件 bar.txt
$ echo "barbar" >> bar.txt
$ git add bar.txt
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: bar.txt
#
此时,bar.txt 并没有通过 git commit 提交到仓库,如果想 unadd foo.txt,需要:
$ git rm --cached bar.txt
rm 'bar.txt'
$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
# bar.txt
nothing added to commit but untracked files present (use "git add" to track)
顺便说一下,对于未 git add 的文件,处于 untracked 状态。git commit 不会提交 untracked 的文件。
对于已经 git add && commit 的文件,直接通过 git rm && commit 将起删除即可。
$ git add bar.txt
$ git commit -m "add bar.txt"
[master 0fa635d] add bar.txt
 1 file changed, 1 insertion(+)
 create mode 100644 bar.txt
$ git rm bar.txt
rm 'bar.txt'
$ git commit -m "remove bar.txt"
[master fcdfd15] remove bar.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 bar.txt
$ ls
foo.txt
我们还可以通过 git mv 来重命名文件。而 git log 的 --follow 参数,可以查看到文件 mv 之前的修改记录。
$ git mv foo.txt rename.txt
$ git commit -m "rename it"
[master 788b36d] rename it
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename foo.txt => rename.txt (100%)
$ git log rename.txt
commit 788b36d799e4f8cea226b29efe13e62ecadea7b8
Author: kasicass <kasicass@gmail.com>
Date:   Thu Apr 4 10:29:47 2013 +0800
 
    rename it
$ git log --follow rename.txt 
commit 788b36d799e4f8cea226b29efe13e62ecadea7b8
Author: kasicass <kasicass@gmail.com>
Date:   Thu Apr 4 10:29:47 2013 +0800
 
    rename it
 
commit 3cc14639388770d01eb8db5fbe57f917584508bf
Author: kasicass <kasicass@gmail.com>
Date:   Thu Apr 4 10:10:42 2013 +0800
 
    first commit
 
深入理解 index
git 中 index 的概念,就是“当前要提交的内容(tracks what you want to commit)”。
我们先来修改一下 rename.txt 并 git add 之。
$ echo "line two" >> rename.txt 
$ git add rename.txt 
$ git diff --cached
diff --git a/rename.txt b/rename.txt
index 2d00bd5..e5c5c55 100644
--- a/rename.txt
+++ b/rename.txt
@@ -1 +1,2 @@
 line one
+line two
我们再修改一下 rename.txt 的内容。
你会发现 git diff 和 git diff --cached 的结果是不一样的。
$ echo "line three" >> rename.txt 
$ git diff
diff --git a/rename.txt b/rename.txt
index e5c5c55..0c2aa38 100644
--- a/rename.txt
+++ b/rename.txt
@@ -1,2 +1,3 @@
 line one
 line two
+line three
$ git diff --cached
diff --git a/rename.txt b/rename.txt
index 2d00bd5..e5c5c55 100644
--- a/rename.txt
+++ b/rename.txt
@@ -1 +1,2 @@
 line one
+line two
对的,git diff --cached 是查看即将提交到仓库的变化,而 git diff 是查看当前与 --cached 的变化。
要想提交最新修改,还得再 git add rename.txt 一次。
$ git add rename.txt 
$ git diff
$ git diff --cached
diff --git a/rename.txt b/rename.txt
index 2d00bd5..0c2aa38 100644
--- a/rename.txt
+++ b/rename.txt
@@ -1 +1,3 @@
 line one
+line two
+line three
所以,可以理解为 current diff ==> index cache ==> repo。
当前的修改,通过 git add 提交到 index cache,再通过 git commit 正式提交到 repo。
[git] 细说commit (git add/commit/diff/rm/reset 以及 index 的概念)
 
ps.
如果 git commit 没有 -m 参数,git 会启用 GIT_EDITOR 来编辑 message。
$ export GIT_EDITOR=vim
 
 
 
 
 

[git] 细说commit (git add/commit/diff/rm/reset 以及 index 的概念)的更多相关文章

  1. git分支,git commit,git流程

    1. git分支命令规范 1. Master 主分支 2. Dev 开发分支 3. Feature 功能分支(例如:feature-x) 4. Release 预发布分支(例如:release-1.2 ...

  2. Git(6)-- 记录每次更新到仓库(git clone、status、add、diff、commit、rm、mv命令详解)

    @ 目录 1.克隆现有仓库:git clone 2.检查当前文件状态 :git status 3.跟踪新文件:git add 4.暂存已修改的文件:git add 5.状态简览: git status ...

  3. Git 学习(三)本地仓库操作——git add &amp&semi; commit

    Git 学习(三)本地仓库操作——git add & commit Git 和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念.这在上文已有提及,本文具体说明什么是工作区及暂存区,以及 ...

  4. 第二章——建立一个HelloWorld项目,练习使用git的add&sol;commit&sol;push&sol;pull&sol;fetch&sol;clone等基本命令。比较项目的新旧版本的差别-----答题者:徐潇瑞

    1.首先下载安装git,很简单所以就不详细说了,当弹出一个类似的命令窗口的东西,就说明Git安装成功 2.因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识 3.接着,注册githu ...

  5. Git学习01 --git add&comma; git commit &comma; git log &comma;git status&comma; git reset --hard&comma; head

    Git官方提供的快速入门教程:https://try.github.io/levels/1/challenges/1 特点:Git极其强大的分支管理:分布式版本 集中式版本控制系统,版本库是集中存放在 ...

  6. 删除GitHub或者GitLab 上的文件夹&comma;git rm -r --ceched 文件夹名 &comma;提交commit&comma;git push

    方法一 这里以删除 .setting 文件夹为案例 git rm -r --cached .setting #--cached不会把本地的.setting删除 git commit -m 'delet ...

  7. Git CMD连接&comma;管理&lpar;remote&comma;add&comma;commit&comma;push&rpar;github repository

    git initmd testcd testgit statusgit add test  //git add test/a.txtgit status git remote add origin g ...

  8. Git学习 --&gt&semi; 个人常用命令add&comma;commit以及push

    Git命令行配置1 安装Github2 安装msysgit3 要配置用户名和油箱  git config --global user.name <用户名> 我的命令就是:git confi ...

  9. git 命令的使用(一) add commit push pull

    一. commit 和 push 的区别 git作为支持分布式版本管理的工具,它管理的库(repository)分为本地库.远程库.git commit操作的是本地库,git push操作的是远程库. ...

随机推荐

  1. SpringMVC Mybatis Shiro RestTemplate的实现客户端无状态验证及访问控制【转】

    A.首先需要搭建SpringMVC+Shiro环境 a1.pom.xml配置 spring: <dependency> <groupId>org.springframework ...

  2. 第十章:Javascript子集和扩展

    本章讨论javascript的集和超集,其中子集的定义大部分处于安全考虑.只有使用这门语言的一个安全的子集编写脚本,才能让代码执行的更安全.更稳定.ECMScript3标准是1999年版本的,10年后 ...

  3. Delphi Unable to invoke Code Completion due to errors in source code

    这时因为在.pas文件中存在delphi无法识别的编码,也就是说.pas文件中的字符并非是纯粹的可由文本文件编辑器所能识别的编码.所以,delphi就不可能有效地解释这些编码.因而就出现了自动代码提示 ...

  4. appium&plus;robotframework的简单实例

    在上篇文章中,我们搭建好了appium+robotframework的环境,这篇文章中主要是一个简单实例. 一.测试用例编写前提 1.模拟器(或手机)连接电脑 adb devices         ...

  5. 23个mysql查询语句

    一查询数值型数据: SELECT * FROM tb_name WHERE sum > 100; 查询谓词:>,=,<,<>,!=,!>,!<,=>,= ...

  6. cocos2d导入iOS原生项目

    最近公司最新发下任务让融合一个cocos2dx写的游戏项目融合进现有项目,当看到要求时内心瞬间无数羊驼奔腾.------ 虽说内心是拒绝的,但是任务已经派发就必须要完成啊.所以在网上搜了大量的融入教程 ...

  7. 利用GDI&plus;在Winfrom绘制验证码

    string yzm: private void yangzhengma() { Bitmap bt = new Bitmap(70,22);//创建位图对象 Graphics gs = Graphi ...

  8. Codeforces878 A&period; Short Program

    题目类型:位运算 传送门:>Here< 题意:给出\(N\)个位运算操作,要求简化操作数量,使之结果不受影响(数据在1023之内) 解题思路 我们发现数字的每一位是独立的.也就是说,每一个 ...

  9. 常用sql语句总结(二)(更新数据&comma;序列&comma;创建数据表&comma;约束&comma;注释)

    常用sql语句总结(二)(更新数据,序列,创建数据表,约束,注释) 一. 增 INSERT INTO 数据表(字段,字段,-) VALUES(值,值-); INSERT INTO emp(empno, ...

  10. ODAC(V9&period;5&period;15&rpar; 学习笔记(四)TMemDataSet (3)

    3.其他 名称 类型 说明 GetBlob TBlob 按照字段名获取当前数据集中某个Blob类型的字段值,并以TBlob对象形式返回 Prepared Boolean 检查Query的SQL是否已准 ...