版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
git 核心简介
- 工作流: 工作区 ->暂存区 ->版本库
初始化: git init(初始化本地仓库)->git add(工作区文件到暂存区)->git commit(暂存区到版本库,并生效)
远程仓库:git remot add -> git pull(拉去)->git push ->git clone
分支管理:git branch->git checkout ->git merge
标签管理:git tag->git push(标签只在本地起作用,需git push到远端)
标签:发布版本,设定标签,通过标签回滚版本
查看所有标签 git tag
创建标签 git tag name
指定提交信息 git tag -a name -m "comment"
删除标签 git tag -d name
标签发布 git push origin name
2.git 心得
1.git 子目录有 .git 无法 add
- 无论使用啥命令,都无法将文件夹下的某些文件添加进 Git 进行版本控制,Git 提示信息如下:
后来经过艰难的搜索,终于发现原来是子文件夹下面含有 .git 文件夹,因此导致该子文件夹无法被 Git 跟踪,可以通过以下方法解决: - git rm --cached folder
- git add folder
其中 folder 为子文件夹。
2.远端比当前版本超前造成无法提交
强制推送:
- git push origin HEAD -force
拉下来合并:
3.想修改上次提交的代码,做一次更完美的commit
git reset commitId
,(注:不要带--hard)到上个版本git stash
,暂存修改git push --force
, 强制push,远程的最新的一次commit被删除git stash pop
,释放暂存的修改,开始修改代码git add .
->git commit -m "massage"
->git push
总结:
- git reset commitId:本地文件没有变话,但是退回了 版本+id ,你可以add commit 重新提交
- git reset –-soft commitId:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可;
- git reset -–hard commitId:彻底回退到某个版本,本地的源码也会变为上一个版本的内容,撤销的commit中所包含的更改被冲掉;
4.git 如何删除中间某个commit同时保留后面的commit
这种事情是不常遇到的,这里就是记录个变通方法,比如版本的提交如下,我要删掉commit-m这次的提交而保留后面的提交。
- 首先使用 git format-patch -(n-m) ,生成n-m个补丁文件 000(n-m)-commit-msg.patch,
000(n-m).patch是最后一次commit的补丁,
0001-commit-msg.patch是commit-m到commit-(m+1)的补丁。 - 使用git reset –hard commit-(m+1)退回到commit-(m+1)的版本,因为要删除commit-m,所以要在commit-(m-1)和commit-(m+1)之间做一次新的提交。
- 在 commit-(m+1)版本处使用git reset commit-(m-1),退回到 commit-(m-1)版本同时保留M+1版本的更改
- 由于回退时保留了修改,这里直接提交修改, git add -u
- git commit -m “从m-1到m+1的更改备注”,
- 提交后就回到了m+1的版本了
然后就是打补丁,提交修改
patch -p1 < 0001-commit-msg.patch
git add -u - git commit -m “commit-msg”
- 一级级的往后打补丁提交就好了,这是比较笨的办法,没办法啊,这种犯傻的事情也不多吧。
5.git .gitignore
配置语法
- 以斜杠“/”开头表示目录;
- 以星号“*”通配多个字符;
- 以问号“?”通配单个字符
- 以方括号“[]”包含单个字符的匹配列表;
- 以叹号“!”表示不忽略(跟踪)匹配到的文件或目录。
注意: git 对于 .gitignore配置文件是按行从上到下进行规则匹配的
规则 作用
- /mtk 过滤整个文件夹下的 mtk
- ./mtk 过滤当前文件夹下的 mtk文件夹
- *.zip 过滤所有.zip文件
- /mtk/do.c 过滤某个具体文件
- !/mtk/one.txt 追踪(不过滤)某个具体文件
注意:如果你创建.gitignore文件之前就push了某一文件,那么即使你在.gitignore文件中写入过滤该文件的规则,该规则也不会起作用,git仍然会对该文件进行版本管理。
****.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的
- git rm -r --cached .
- git add .
- git commit -m 'update .gitignore'
6.git 比较两个分支的差异
- git diff branch1 branch2 --stat //显示出所有有差异的文件列表
- git diff branch1 branch2 具体文件路径 //显示指定文件的详细差异
- git diff branch1 branch2 //显示出所有有差异的文件的详细差异