// 初始化仓库
git init
// 添加文件到缓存区
// 使用通配符
git add *.c
// 当前目录下所有文件
git add .
// 只添加改动,不增加新建的文件,比如说测试文件和编译中间文件
git add -u
// 只增加指定文件
git add xxx.txt
// 提交到本地仓库
git commit -m "add:first commit"
// 如果想要修改一同提交的注释
git commit --amend
// 克隆
git clone git://github.com/schacon/grit.git mygrit
// git status获取在上次提交后,文件是否有改动,其中-s获得简短输出
git status -s
A 代表,相比于上次提交时的状态,缓存区又增加了新的文件,还没有被commit;
M代表,缓存区的该文件又发生了变化,还没有被add.
// git diff
// 文件在工作区和暂存区的区别
git diff [file]
// 文件在暂存区和上一次提交的区别
git diff --cached [file]
或
git diff --staged [file]
// 两次提交之间的差异
git diff [first-branch]...[second-branch]
// git rm
// 同时从工作区和暂存区删除文件
git rm <file>
// 如果该文件在工作区又修改过了,需要强制删除
git rm -f runoob.txt
// 如果只想在暂存区删除,本地工作区保存,则
git rm --cached <file>
// 分支管理
// 创建分支
git branch (branchname)
// 删除分支
git branch -d (branchname)
// 列出当前所有分支
git branch -a
// 切换分支
git checkout (branchname)
// 合并分支(合并前先切换到该分支,再执行型merge合并另一分支)
git merge (branchname)
// 取消合并
git reflog
git reset --hard 版本号
// 上面这种操作不仅会取消最近的合并和节点,而且本地工作区也会改回去,就像从未发生merge之前一样
// 如果只是取消合并和删除该节点,但是工作区保持不变,比如说对合并结果做修改后再提交
git reset 版本号
// 只所以这么做,是为了既删除旧的节点,又保留了merge的结果在本地工作区,可以对未引发冲突的merge改动再进行人为修改
// 重命名分支
git branch -m old_name new_name
// 版本切换(可能发生在同一个分支之内)
// 这里的版本指的是一次commit,每次commit后都会生成一个新的版本号
git log;// 可以查看所有历史版本号
// 想回退一个版本,只需:
git checkout HEAD^;// 其中HEAD指目前版本.HEAD^指的是上一个版本,HEAD^^就是上上版本
// 如果再想回退回来,但是此时,git log已经记录不到比较新的那个版本了,需要通过查看历史指令的方式,确定"回退"这个操作发生在哪个版本
git reflog;
// 然后执行
git checkout 12345*;// 其中后面的版本号可以自动补全
// 需要注意的是,回退版本后,如果想要做修改,应该先新建一个新的分支,不应该(可能也不能在这个版本上直接修改,否则破坏了该版本与后面的关系)
2021.6.3 更新
对于untracked files,可以正常切换branch,且本地的文件并不会被覆盖掉,在两个不同分支下都可以看到该文件。但是,如果在某个分支下add了该文件开始进行跟踪,那么它就不再属于untracked本地文件,在其他分支下自然就看不到该文件了。
与此类似,如果在本地a分支下创建了一个untracked文件,然后切换到b分支也能看到,然后pull的时候,发现remote端b分支有一个同名的文件(可能是同事先tracke并且push了),无法正常进行合并,需要先备份或者删除本地的该同名文件(请注意,到这里本地该文件就没了,和分支无关),然后pull的过程中b分支从remote端下载了该文件,但是对于a分支,如果远端没有该分支或者文件,那么本地切换回到a的之后,文件也“丢了”。