1 概述 git命令的工作流程
- workspace: 本地的工作目录。(记作A)
- index:缓存区域,临时保存本地改动。(记作B)
- local repository: 本地仓库,只想最后一次提交HEAD。(记作C)
- remote repository:远程仓库。(记作D)
2 命令笔记
采用上述的标记的A、B、C、D的方式来阐述
2.1 初始化
git init //创建
git clone /path/to/repository //检出
git config --global user.email "you@example.com" //配置email
git config --global user.name "Name" //配置用户名
2.2 操作
git add <file> // 文件添加,A → B
git add . // 所有文件添加,A → B
git commit -m "代码提交信息" //文件提交,B → C
git commit --amend //与上次commit合并, *B → C
git push origin master //推送至master分支, C → D
git pull //更新本地仓库至最新改动, D → A
git fetch //抓取远程仓库更新, D → C
git log //查看提交记录
git status //查看修改状态
git diff//查看详细修改内容
git show//显示某次提交的内容
2.3 撤销操作
git reset <file>//某个文件索引会回滚到最后一次提交, C → B
git reset//索引会回滚到最后一次提交, C → B
git reset --hard // 索引会回滚到最后一次提交, C → B → A
git checkout // 从index复制到workspace, B → A
git checkout -- files // 文件从index复制到workspace, B → A
git checkout HEAD -- files // 文件从local repository复制到workspace, C → A
2.4 分支相关
git checkout -b branch_name //创建名叫“branch_name”的分支,并切换过去
git checkout master //切换回主分支
git branch -d branch_name // 删除名叫“branch_name”的分支
git push origin branch_name //推送分支到远端仓库
git merge branch_name // 合并分支branch_name到当前分支(如master)
git rebase //衍合,线性化的自动, D → A
2.5 冲突处理
git diff //对比workspace与index
git diff HEAD //对于workspace与最后一次commit
git diff <source_branch> <target_branch> //对比差异
git add <filename> //修改完冲突,需要add以标记合并成功
2.6 其他
gitk //开灯图形化git
git config color.ui true //彩色的 git 输出
git config format.pretty oneline //显示历史记录时,每个提交的信息只显示一行
git add -i //交互式添加文件到暂存区
3 .gitignore规则无效
解决.gitignore文件忽略规则无效git依然跟踪修改的问题
3.1 .gitignore规则无效的原因
- 一种是忽略规则的语法错误
- 另一种:项目中的文件或目录已经被纳入到Git的版本管理里面/跟踪文件清单,此时你再往
.gitignore
里添加此文件/目录的忽略规则就会发现毫无作用,因为已经被Git跟踪(track)的文件/目录无法被.gitignore忽略掉
! -
已经被纳入到Git的版本管理里面/跟踪文件清单
- 已使用
add
命令开始跟踪项目文件或者将修改的文件放入暂存区/索引
- 已使用
- 已使用
commit
命令提交更新到本地仓库
- 已使用
- 已使用
push
命令将项目文件推送到了Git远程仓库了(例如GitHub)
- 已使用
上述的三种操作只要进行了其中一项,再添加对应文件的忽略规则都是不生效的
3.2 具体的解决方法
3.2.1 未进行提交操作的处理方式
- 如果此时还未进行提交操作,赶紧使用如下命令可及时挽救:
git rm --cached <file>
,其中<file>表示要从暂存区移除出去的文件名或者目录路径,注意可以使用通配符。 - 不过Git有自己的通配符规则,所以要注意下差异,例如官方文档有提到在
*
号前面是需要加反斜杠\的(我有测试过不加也没事但是最好按照规范来),结合上面的案例,因为我们要移除bin文件夹下的所有文件,所以完整的Git命令为(注意路径一定要正确):
git rm --cached WebApplication1/WebApplication1/bin/\*
这里要留意忽略规则的添加时机,在命令执行后会有不同的影响,假设忽略规则是在git rm --cached <file>命令执行前就设置了,那么当命令执行完成后马上就可以看到效果,bin文件夹及里面的所有文件会被Git直接忽略。如果在命令执行后还没有添加忽略规则,你会发现bin文件夹下的文件变成未被跟踪的状态,也就是最初的状态,此时你再添加忽略规则这些文件就会被忽略了。
3.2.2 本地缓存删除
解决方法就是先把本地缓存删除(改变成未被追踪状态),然后再提交:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'