git diff 后直接按n按键--快速找diff关键字
reset命令:
第一步. 移动HEAD指针 git reset --soft HEAD~
第二步. 更新索引 git reset --mixed HEAD~
第三步:更新工作区 git reset --hard HEAD~ //这一步会真正销毁你所修改的文件内容,谨慎处理。
直接用 git reset HEAD~ ,相当于第二步,修改的文件内容还在,只是需要重新add(这条命令正好和git add反着来)
git reset HEAD test.txt 和上面一行的命令效果一样。
git reset eb43df test.txt //指定某一个提交的文件来回退。仅仅改变暂存区的记录,工作区和提交的不变。
git 文件(也叫数据对象)有三种模式:1.普通文件->100644 2.可执行文件->100755 3.符号链接->120000
git cat-file -t hash_value // -t查看SHA-1值指向的对象类型, p参数可将hash指定的值显示为看得懂的内容
git ls-files --stage //查看暂存区(也叫索引)的内容,暂存区保存的只是个索引,真正的文件存在git/objects
步骤一:
echo 'test content' | git hash-object -w --stdin //hash-object命令可以存储git文件,并返回对应键值。
Git 以对象类型作为开头来构造一个头部信息,本例中是一个“blob”字符串。 接着 Git 会添加一个空格,随后
是数据内容的长度,最后是一个空字节(null byte)。Git 会将上述头部信息和原始数据拼接起来,并计算出这条新内容的 SHA-1 校验和,比如原始内容为“version 1”,则拼接后为"blob 9\u0000version 1",然后计算SHA-1校验和。
git存储内容的方式为:一个文件对应一条内容,这个文件存储在objects目录下,文件名以SHA-1值命名;而内容则为git add的目标文件(即使你只是改动了一行代码,它也会将整个c文件的内容计算为一个SHA-1值并生成一个新的文件存在objects目录下)。
步骤二:
上述的hash-object操作只是保存了文件的内容,文件名test.txt没保存。所以需要一个树对象这样一个目录结构来保存。
git树对象有两个作用:1.可以解决文件名保存的问题 2. 可以将多个数据对象或者树对象结合一起。
创建树对象,首先得把数据对象的哈希值罗列到索引区中:
git update-index --add --cacheinfo 100644 \
83baae61804e65cc73a7201a7252750c76066a30 test.txt //这个就是git add的底层操作
然后创建树对象:git write-tree //这一步才真正创建了一个可用于commit的树对象
暂存区和树对象会随着add越来越大,这个怎么理解????
步骤三:
上述的树对象同样也只有一个哈希值对应,没有指明作者等一些基本信息,不方便查看,commit可以解决这个问题。
commit对象作用:保存每一笔提交的基本信息,包括树对象、作者、父提交对象、注释。
echo 'first commit' | git commit-tree d8329f //为树对象d8329f 创建一个commit id
echo 'second commit' | git commit-tree 0155eb -p fdf4fc3 // -p 后指定父提交对象
步骤四:
创建引用对象。
git引用就是每一笔提交的SHA-1值的别名,比如master、tag。
git update-ref refs/heads/master SHA-1 //用git log SHA-1 和git log master 效果一样
Git 分支也是一种引用。当你用git branch 新建一个分支时,git实际上会运行update-ref命令,去取得当前master分支最新的 SHA-1 值,然后赋给refs/heads/branch_name
HEAD指针也是一种引用,它是一个指向master的指针。
cat .git/HEAD 可查看HEAD指向。
git reset head^ 回溯到上个版本,只是修改了commit,修改的文件还没回溯。
远程引用,位于.git/refs/remotes/目录下,只是用来记录服务器分支的状态。
git branch -v 查看每个分支最后一次提交
查看单个文件的修改状态
git log -p filename //可以显示该文件的每次提交的diff
git show commit-id filename //查看某次提交中的单个文件的变化
删除服务器文件,然后再push一版,此时github上已经不存在了
git rm --cached useless.log
git commit -m "remove file from remote repository" git push
2. git add file
把新增的或者修改的文件添加到暂存区中(有新增的文件,此命令一定要用,不然追踪不到,也就提交不了)
查看工作区与暂存区之间的差异信息:git diff
撤销已修改还未提交到暂存区的修改项: git checkout -- file (checkout管不了已经add到暂存区的文件)
撤销已经提交到暂存区的修改项:git reset HEAD file (只是撤销暂存区的修改项,工作区的不会撤销,想要撤销工作区的还需checkout)
3. git commit
把暂存区的包提交到本地仓库中
查看暂存区和最近commit区之间的差异信息:git diff --staged
查看已经commit信息:git show
撤销已经commit的修改项:git reset --hard origin/master(origin/master 指针还未移动到本地最新的commit上)
修改commit注释:git commit --amend
4. git push origin master
上传到远程仓库中。
查看修改信息:git show / git diff master origin/master
撤销远程仓库的修改项:git reset --hard commitID
切换到远程分支:
- 确保在最新的本地master上(如果本地master不是最新,则会出现 updating paths is incompatible with switching branches.)
- 确保工作目录是干净的(可以用git clean -df),然后git checkout -b newLocalBranch tag (新建新的分支newbranch并切换过去,新的分支可以不用跟远程分支名一样,此处的tag既可以是origin/master上的,也可以是origin/other_branch 的)
或者用 git checkout -b newLocalBranch origin/branchname
- git push origin newLocalBranch:remoteBranch
(git push <远程主机名> <本地分支名>:<远程分支名>)
git remote 查看远程仓库名(也叫远程主机名),一般叫origin
git remote -v 查看当前远程分支的路径
git push/add 之前一定要先 git pull 来拉到最新code
版本回退
git reset --hard 加 git clean-df (确保clean的目录是在工作文件夹里,最好先cd)
版本向前
git reflog 查询回退后消失的版本,然后reset --hard
git log --name-status 每次修改的文件列表, 显示状态
git log --name-only 每次修改的文件列表
git log --stat 每次修改的文件列表, 及文件修改的统计
git whatchanged 每次修改的文件列表
git whatchanged --stat 每次修改的文件列表, 及文件修改的统计
git show 显示最后一次的文件改变的具体内容