初次使用配置用户信息
1 | git config --global user.name "malu" |
使用HTTP basic auth clone
使用http方式去clone时,如果用户名密码包含特殊字符,则都需要URL encode
比如用户名含有邮箱的@符号时需要转换成%40
1 | git clone https://malu%40malu.me:password@github.com/pingmalu/test.git |
git赋予文件权限
查看当前权限
1 | [localhost]$ git ls-files --stage run.sh |
增加可执行权限
1 | [localhost]$ git update-index --chmod +x run.sh |
git添加多个远程仓库
添加新的远程仓库:
1 | git remote add malu https://malu.me/project/xxx.git |
将本地的所有分支推送到新的远程仓库:
1 | git push --all malu |
强制推送到新的远程仓库:
1 | git push -f malu |
git基本使用方法
查看远程仓库地址
1 | git remote -v |
查看所有分支
1 | git branch -a |
查看每次提交的所有文件列表
1 | git log --stat |
查看特定的commit id中的文件列表
1 | git show --stat <commit id> |
查看最近一次提交的文件列表
1 | git show --stat |
查看配置
1 | git config -l |
一次完整提交
1 | git add . |
使用代理
1 | git config http.proxy http://user:pwd@server.com:port |
http全局代理
1 | git config --global http.proxy http://127.0.0.1:1080 |
http当前项目代理
1 | git config --local http.proxy http://127.0.0.1:1080 |
socks5全局代理
1 | git config --global http.proxy socks5://127.0.0.1:1080 |
socks5全局代理,只对github.com
1 | git config --global http.https://github.com.proxy socks5://127.0.0.1:1080 |
clone时使用代理
1 | git clone https://github.com/xxx.git -c http.proxy=socks5://127.0.0.1:1080 |
clone时使用代理并取最新的
1 | git clone https://github.com/xxx.git -c http.proxy=socks5://127.0.0.1:1080 --depth=1 |
取消代理
1 | git config --global --unset http.proxy |
取消只对github.com的代理
1 | git config --global --unset http.https://github.com.proxy |
查询
显示文件的每一行是在哪个版本最后修改。
1 | git blame filename.c |
查找commit内容
1 | git log --pretty=onelinegrep 关键字 |
查看用户代码量
1 | git log --stat --author='username'perl -ne 'END { print $c } $c += $1 if /(\d+) insertions/;' |
分支
查看本地分支
1 | git branch |
查看所有分支 (加-v显示最后一次提交信息)
1 | git branch -a -v |
本地创建分支
1 | git branch dev |
将本地分支上传至远程
1 | git push origin dev |
下载在线的一个分支
1 | git branch dev origin/dev |
删除本地分支
1 | git branch -d dev |
删除远程分支
1 | git branch -r -d origin/branch-name |
切换本地分支到dev
1 | git checkout dev |
合并分支
1.开发分支(dev)上的代码达到上线的标准后,要合并到 master 分支
1 | git checkout dev |
2.当master代码改动了,需要更新开发分支(dev)上的代码
1 | git checkout master |
3.假设本地有2个分支dev master,要把dev合并到master 也可以
1 | git merge dev master |
4.把dev合并到master还可以
1 | git rebase dev master |
合并冲突解决
1.如果合并冲突取对方代码
1 | git merge -s recursive -X theirs dev --allow-unrelated-histories |
2.如果合并冲突取当前分支代码
1 | git merge -s recursive -X ours dev --allow-unrelated-histories |
–allow-unrelated-histories 把两段不相干的 分支进行强行合并
3.一个分支完全覆盖另一个分支
1 | git checkout master // 切换到旧的分支 |
标签
本地新建标签
1 | git tag -a only_apache -m "只有apache集成环境" |
查看本地标签
1 | git tag |
切换至指定标签
1 | git checkout only_apache |
把所有本地标签提交到服务器
1 | git push origin --tags |
将标签only_apache提交到服务器
1 | git push origin only_apache |
切换远程分支,Git每次提交需要密码处理
把远程分支从https切换到ssh模式
1 | # 先查看远程分支 |
Git 合并遇到冲突解决办法
1.使用栈保存编辑数据后pull下来再合并
1 | git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。 |
2.从xxxx分支合并到dev
先把xxxx分支上的提交hash找出来,再去dev上执行cherry-pick:
1 | git cherry-pick a2a544fd01c2578046b335636e4 |
Git后悔药(慎用)
放弃本地修改
1 | git reset --hard |
其他:
1 | git rm --cached <FILE>:已 add(tracked) 未 commit 的文件,使其回到未 add 状态(untracked)。 |
放弃本地修改,使用远程最新版本
1 | git fetch --all |
如果只需要移除一个文件
1 | git reset <文件名> |
或者如果你想从暂存区移除所有没有提交的修改
1 | git reset |
放弃远程上一次提交的内容
1 | git reset --hard HEAD^ |
修改错误的提交信息
1 | git commit --amend -m ”YOUR-NEW-COMMIT-MESSAGE” |
恢复某个文件到指定hash
1 | git checkout fc0c4369b362a38 .\index.html |
Stash未提交的更改
stash在本质上会取走所有的变更并存储它们为以备将来使用
1 | git stash |
检查stash列表,你可以运行下面的命令
1 | git stash list |
如果想要解除stash并且恢复未提交的变更
1 | git stash apply |
每个stash都有一个标识符,一个唯一的号码(尽管在这种情况下只有一个stash)。 如果只想留有余地进行apply stash,你应该给apply添加特定的标识符
1 | git stash apply stash@{2} |
如果想取出stash
1 | git stash pop |
取出指定stash
1 | git stash pop stash@{2} |
清除stash
1 | git stash drop stash@{0} |
清除所有stash
1 | git stash clear |
找回删除的stash
1 | git fsck --lost-found |
Ubuntu git升级到最新版
1 | apt-get install software-properties-common |
cmd下git log乱码
windows配置环境变量
1 | LESSCHARSET 为 utf-8 |
统一配置:
1 | git config --global i18n.commitencoding utf-8 |
gitk乱码问题
编辑C:\Users\Administrator\.gitconfig 全局文件(也可编辑项目目录.git/config用于设定单个项目):
1 | [gui] |
[gui]用于设定gitk总的编码格式
[i18n]用于设定commit等编码,这个默认不需要去设置
Git Bash中查看log中文乱码
修改%Git%\etc\profile (Linux下为 ~/.bash_profile 文件),在末尾添加如下一行:
1 | export LESSCHARSET=utf-8 |
要马上生效,直接设置该环境变量,或者重新登录
git diff乱码问题也可以用上面的设置
1 | export LESSCHARSET=utf-8 |
git-bash 乱码临时转换
utf-8转gbk
1 | git status iconv -f utf-8 -t gbk |
gbk 转 utf-8 输出
1 | winpty ipconfig |
解决 idea Terminal 配置 git bash 中文乱码
修改:C:\Program Files\Git\etc\bash.bashrc 文件,在这个文件末尾追加
1 | export LANG="zh_CN.UTF-8" |
ERROR
git pull 报错:
Auto packing the repository for optimum performance. You may also run “git gc” manually. See “git help gc” for more information.
1 | git gc |
由于git本身不保存文件之前的差异文件.只保存每个文件的快照.所以在频繁修改大文件的情况下会造成git目录变得肥大不堪.git早就有了解决方案.git gc后,会在.git目录下生成一个packfile与idx文件.只保存文件差异
Git忽略规则及.gitignore规则不生效的解决办法
原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。
那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:
1 | git rm -r --cached . #将会移除所有的缓存索引 |
!!! 还有一种可能是.gitignore的文件编码问题导致
比如我遇到Unicode的编码,把它改成ANSI即可
git pull的时候遇到
Unlink of file ‘.git/objects/pack/pack-***.pack’ failed. Should I try again? (y/n) y
上面的问题,按n或者y都没有用,先Ctrl+C
再执行:
1 | git gc --auto #自动清理本地的文件 |
openshift git clone Permission denied
openshift执行git clone ssh://xxx@xxx.rhcloud.com/~/git/xxx.git/ 时报错 :
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
解决办法:
将密钥拷贝的.ssh目录下,改名id_rsa/id_rsa.pub(密钥/公钥)再执行克隆命令成功解决。
自动脚本
每次提交md笔记需要敲命令,感觉太麻烦了,于是有了这个windows BAT脚本
拉取:
1 | @echo off |
提交:
1 | @echo off |
部署gitlab服务器
docker安装: