1. 初始化本地库
$ git init
文件夹中生成.git版本库,包括stage(index),还有git自动创建的分支master,指向master分支的指针HEAD指针。
2. 工作区→缓存区→版本库 (工作区:电脑中可以看到的目录)
拆分作业
$ git add [file1] [file2] $ git add [dir1] [dir2] $ git add . $ git commit -m "a readme file"
添加、提交一步到位
$ git commit -am "once" $ git commit -a -m "once" $ git commit [file] [folder] -m ""
3. 提交时,漏掉了某文件
$ git add xxx $ git commit --amend 编辑工具会显示最近一次提交的提交message,可以修改 $ git commit --amend -m $ git commit --amend --no-edit (加入--no-edit参数,会修复提交但不修改提交信息)
4. 撤销修改
a. 撤销工作区的修改,不影响缓存区
$ git checkout -- [file1] [file2] $ git checkout -- .
b. 撤销缓存区的修改,将修改内容放回工作区,与工作区后期修改合并(clean 或者合并2处修改)
$ git reset HEAD xxx(文件名) $ git reset HEAD .
5. 查看
$ git status $ git diff xxx 工作区和缓存区 $ git diff --cached/staged 已经暂存起来的文件和上次提交时的快照之间的差异 $ git diff HEAD -- xxx 工作区和版本库 注:修改并add一个版本,工作区再改回来,工作区与版本库无差别。有待add的文件, add 后无待commit的文件了
$ git log 显示从最近到远的提交日志 $ git log --stat 显示commit历史,以及每次commit发生变更的文件 $ git log -p [files] 显示指定文件的每次commit的diff $ git log -p -2 常用 -p 选项展开显示每次提交的内容差异,用 -2 则仅显示最近的两次更新, 还有其他参数可选 $ git log -[number] --pretty --oneline 显示最近number次的log $ git log --pretty=oneline 漂亮地展示 $ git log --graph 分支合并图 $ git log --graph --pretty=oneline --abbrev-commit 分支合并情况
6.回退版本
HEAD表示当前版本,即最新的提交,HEAD^上一个版本, HEAD^^, HEAD~100, clean。(–soft不会clean,modified)
$ git reset --hard HEAD^ $ git reset --hard HEAD 等价于 clean掉工作区和缓存区 $ git reset --hard [commit_id] $ git reset [commit_id] (非clean,有待添加的文件)
7.回到未来版本
当回退到某个版本x后,想回来,发现git log中,看不到x之后的commit记录(x+1)。此时,
a. 你的命令行还没关,你就可以顺着往上找,找到对应的commit id b. $ git reflog,找到对应的commit id
$ git reset --hard 3628164
8.“储藏”和“恢复”工作现场
$ git stash $ git stash list 查看
$ git stash apply stash内容并不删除 $ git stash pop 恢复的同时把stash内容也删了 $ git stash drop (.......)
9.文件重命名
$ git mv README.txt README
其实,运行 git mv 就相当于运行了下面三条命令:
$ mv README.txt README $ git rm README.txt $ git add README
10.删除文件,手动删除之后,2个选择:
a.从版本库中删除 $ git rm xxx / add commit b.误删了,恢复 $ git checkout -- xxx (撤销工作区修改)
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f(译注:即 force 的首字母),以防误删除文件后丢失修改的内容。
另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。用 –cached 选项即可:$ git rm --cached readme.txt
后面可以列出文件或者目录的名字,也可以使用 glob 模式。比方说:
$ git rm log/\*.log
注意到星号 * 之前的反斜杠 ,因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开(译注:实际上不加反斜杠也可以运行,只不过按照 shell 扩展的话,仅仅删除指定目录下的文件而不会递归匹配。上面的例子本来就指定了目录,所以效果等同,但下面的例子就会用递归方式匹配,所以必须加反斜杠。)。此命令删除所有 log/ 目录下扩展名为 .log 的文件。类似的比如:
$ git rm \*~
会递归删除当前目录及其子目录中所有 ~ 结尾的文件。