Git
...
什么是Git
Git is a fast, scalable, distributed revision control system with an unusually rich command set that provides both high-level operations and full access to internals.
- From README.md
In many ways you can just see git as a filesystem
it’s content addressable, and it has a notion of versioning,
but I really really designed it coming at the problem from the viewpoint of a filesystem person (hey, kernels is what I do),
and I actually have absolutely zero interest in creating a traditional SCM system.
- By Linus
Git Download
几个实用的 git 下载地址:
- https://git-scm.com/
- http://gitforwindows.org/
- https://tortoisegit.org/
- https://npm.taobao.org/mirrors/git-for-windows/ - 网络不好,可以使用淘宝提供的镜像,会快很多...
托管服务
Gogs
参考
git add
# 添加所有文件跟踪
git add .
# 假设某个文件不再变更(add时会忽略未改动的文件)
git update-index --assume-unchanged FILENAME 路径+文件名
# 若以后需要该文件的修改, 则输入命令非不再变更(负负得正)
git update-index --no-assume-unchanged FILENAME
git commit
git 取消上一次 commit 操作, 但保留 add 操作
场景重现
删除了代码中的一些空白行,习惯性添加&提交
git add .
git commit -m "溢出一些空白行"
然后马上发现提交信息中的移除
打成溢出
了,
现在需要取消这次提交commit
,但保留添加add
解决办法
找到上面这次提交hash信息,然后
git reset --soft hash
当然也可以这样操作
# 撤销本次commit操作,保留add操作.
git reset --soft HEAD^
回去后重新 commit & message
当然更建议使用 --amend
参数
git commit --amend -m "移除了一些空白行"
Git Branch
# 查看分支
git branch
# 创建分支
git branch <name>
# 修改分支名称
# a改成b
git branch -m <name_a> <name_b>
# 切换分支
git checkout <name>
# 创建+切换分支
git checkout -b <name>
# 创建分支+切换分支+拉取远程分支
git checkout -b feature/xxx origin/feature/xxx
# 切换上一个分支
git checkout -
# 合并某分支到当前分支
git merge <name>
# 删除分支
git branch -d <name>
# 推送本地分支到远程,并和远程分支关联起来
git push --set-upstream origin <branch_name>
# 查看远程分支
# -a:--all:显示所有分支(含本地和远程)
git branch -a
# 删除远程分支
git push origin -d <remote-branch>
Git Tag
# 查看标签
git tag
# 新建标签
git tag tagName
# 推送远程标签
git push --tags
# 删除标签
git tag --delete tagName
# 删除远程标签
git push origin --delete tag <tagName>
Git Stash
暂存操作
# 查看暂存列表
git stash list
# 如果有修改的内容, 添加跟踪
git add .
# 暂存本次操作内容
git stash save "本次暂存标识"
# 使用某次暂存的内容, 执行pop会移除暂存记录
git stash pop stash@{n}
# 清除指定暂存内容,不指定时候默认最上面那条
git stash drop stash@{n}
# 查看指定暂时条目的变更内容
git stash show stash@{n}
# 清除所有暂存内容
git stash clear
git diff
# 查看所有不同
git diff
# 查看指定文件不同
git diff path/file
# 查看指定目录下所有文件不同
git diff path/*
# 查看所有文件不同(排除指定内容)
# 比如:查看不同时,排除 proto 生成的内容
git diff -- ':!pkg/*'
# 查看已添加跟踪缓存的不同
# 适用于新增的文件用git diff看不出来
git diff --cached
参考
Git Log
# 查看某个文件的 commit 历史日志
git log filename
# 查看每次提交的diff
git log -p filename
# 查看某次提交中的某个文件的改动
git show abe69804bbd9725b5dece57f8cbece4a96b9f827 filename
# 美化日志输出,以单行格式输出
git log --pretty=oneline
# 以ASCII图形表示分支的合并历史
git log --graph
# 显示n个日志
git log -{n}
git log -1
git clean
所有未跟踪 (untracked) 的目录及文件, 可以通过 git clean
命令来移除.
# 移除所有untracked的目录及文件
git clean
# 参数 n 表示:显示将要移除的目录及文件
git clean -n
# 参数 d 表示:移除所有untracked的目录(directory)
git clean -d
# 参数 f 表示:移除所有untracked的文件(file)
git clean -f
git clean 使用场景
一般这么用...
# 首先查看将要移除的目录及文件
git clean -n
# 移除所有未跟踪 (untracked) 的目录及文件
git clean -df
.gitignore 无效及解决办法
对应已经归档到git控制中的文件及目录,在.gitignore忽略会出现无效的情况,留爪.
.gitignore介绍
如果想忽略掉某文件或目录,不让这个文件或目录提交到git版本库中,可以通过修改根目录中.gitignore
文件(没有这个文件的话,需要手搓创建)来实现.
.gitignore
实例:每行一条实例
#井号开头的这行都是注释
*.md #忽略根目录下所有.md后缀的文件
!README.md #但README.md除外
dir #忽略根目录dir目录
dir/ #忽略根目录下的dir/目录下的所有文件
*/dir #忽略根目录下的dir目录及dir目录下的所有文件
**/dir 忽略所有目录下的dir目录及dir目录下的所有文件,**表示多级目录,git1.8.2及更高版本才支持
实例的规则比较简单,同时支持正则表达(个人用的不多,就不介绍了).
.gitignore无效场景
在项目开发中,已经添加到git版本中的某些文件(如:xxx.pro.user
),需要把这些用户文件移除(忽略掉),按照上面介绍的方式提交后,版本库中并没有生效,
.gitignore无效解决办法
- 首先删除本地库缓存(不要忘了修改
.gitignore
) - 然后再
commit
和push
# 移除git跟踪缓存,<dir/file/.>可以是指定的目录/文件/库目录下所有
git rm -r --cached .
git add .
git commit -m '更新.gitignore'
git push origin master
git bash命令行也可以修改,最终也是修改.gitconfig配置文件:
分别执行:
git config --global core.autocrlf false
git config --global core.filemode false
git config --global core.safecrlf true
https://blog.csdn.net/huangning1995/article/details/93487021
git diff ^m windows/linux 换行符问题
问题描述: 使用win10中的ubuntu1804的git查看windows上的文件, 发现都是’modified’状态
原因: windows 使用 CR LF 作为换行符, Linux 使用 LF 作为换行符, 文件多了个 CR, 就变成modified状态了
解决方法: git 忽略换行符的差别 git config --global core.autocrlf true
查看设置git config -l