Git 常用命令

初始化与配置

1
2
3
4
5
6
git init         # 初始化仓库
git config --list # 检查配置信息
git config --global user.name # 设置用户名
git config --global user.email # 设置用户邮箱
git config --global core.editor # 设置文本编辑器
git config --global alias.xx xxxx # 设置命令别名

文件基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
git add       # 对当前追踪的文件制作快照,并将其索引添加至暂存区, 用于下一次提交(快照备份 + 建立索引)
git status # 查看文件状态,是否追踪,修改,(待)提交等
git diff    # 比较工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容

git commit   # 生成提交信息(git status 里的内容),并将暂存区快照(索引)提交至仓库
          -a: 跳过 git add 步骤,直接将追踪的文件以及相应的提交信息,提交至仓库
--amend: 执行后本次提交会覆盖上次提交(git log 可以发现前后两次提交记录只算一次)

git rm     # 删除已追踪文件
          -f: 强制删除已加入暂存区的文件
          -cached: 取消文件已追踪状态,但会保留其本地存储内容

git mv # 移动文件或者重命名文件
git log # 查看提交历史
--pretty=oneline master: 查看某一分支提交历史
git reset # 取消文件暂存, 但并不会修改工作目录的文件. 可以理解为取消对 tracked 文件更新做快照备份
git checkout -- # 撤销修改,恢复文件至上一次提交时的状态, (所以这命令比较危险,因为会直接修改覆盖本地工作目录的文件)
git clean # 清理工作目录
          -f: 强制移除文件
          -d: 必须跟-f 一起,表示文件夹也一起移除
          -n: 显示哪些文件将被删除
          -x: 表示将 .gitignore 里忽略的文件一起删除

注意 git rm 只能对已追踪的 (tracked) 文件进行操作,对于已追踪但是未加入暂存区 (index) 的文件 (unstaged),直接 git rm file_name;
对已加入 index 的文件则需要加入 -f 进行强制删除,git rm -r file_name;
这两个命令会将整个文件从本地磁盘删掉,如果只是希望不再追踪此文件,但是仍希望保存其在本地目录,那么需要执行 git rm -cached file_name 或是 git rm filefolder/\*.suffix;

如果文件已经被添加至 index,同时在外部删除该文件,那么 git status 会显示 unstaged commit.
此时执行 git add.,或者 git rm 会有一点类似,都会在下一次 commit 时提交信息中会包含这一改动,如 “deleted xx_file”; 如果

虽然通过 .gitignore 添加文件也可以取消某类文件的追踪,但是要取消已追踪文件还是要通过 git rm. 

仓库基本操作

1
2
3
4
5
6
7
8
9
10
11
12
git branch     # 得到当前所有分支的一个列表, * 字符标记的分支表示当前所在分支
            -v: 查看每一个分支的最后一次提交
-d: 删除分支
-r: 查看远程分支
-a: 查看所有分支,包括本地分支,以及远程分支
-u: 设置本地分支
--merged: 查看哪些分支已经合并到当前分支
--no-merged: 查看尚未合并到当前分支的分支

git merge      # 合并分支至 master
git checkout   # 切换分支
-b: 切换并新建分支

远程仓库操作

1
2
3
4
5
6
7
8
9
10
11
12
13
git remote   # 显示远程仓库的简写
         -v: 显示远程仓库使用的 Git 保存的简写与其对应的 URL
-add: <shortname> <url> 添加一个新的远程 Git 仓库, 并指定其简写名称
rename: 远程仓库重命名
   rm: 移除远程仓库
        show: [remote-name] 显示远程仓库信息

git clone # 获取远程仓库所有数据至本地, git clone url filefolder 可以指定本地仓库文件夹名     
git fetch # 从远程仓库获取更新,并将本地远程引用指向最新一次提交对象
git pull   # 获取远程仓库某一分支数据,并
git push # 推送本地分支至远程仓库分支
git push origin branch # 推送本地 branch 至远程相同 branch
         git push origin local_branch:remote_branch # 推送指定本地 branch 至远程指定 branch

如果远程仓库发生变化,比如其他用户进行了更新,那么此时推送会被拒绝.必须先将远程仓库 git pull.
git clone 会给远程仓库自动添加 origin 的简称, 且自动设置本地 master 分支跟踪 colned 远程仓库的 master 分支(或其他默认分支)

底层命令

1
2
3
4
5
git hash-object -w file_name   # 将文件保存为 blob 对象,返回校验和(SHA-1哈希值)
git write-tree          # 创建树对象
git update-index --add --cacheinfo # 更新索引文件, 后面应给出文件模式,文件校验和,文件名
git cat-file -t 'hash-value' # 查看 Git 存储文件类型,输出为: tree, blob, 或者 commit
git cat-file -p 'hash-value' # 根据给定的哈希值, 查看对应 .git/objects 下的存储文件信息

`

至此,可以看出每次暂存操作会计算每个文件校验和,将每个文件保存成 blob 对象,并以生成的校验和作为目录名和文件名