Git
记录git相关操作
个人配置
git config --global --replace-all user.name "malu"
git config --global --replace-all user.email "malu@malu.me"
git config --global alias.l 'log --pretty=format:"%h %ad [%an] %s%d" --date=format:"%Y-%m-%d %H:%M" --no-merges -30'
git config --global alias.ll 'log --pretty=format:"%h %ad [%an] %s%d" --date=format:"%Y-%m-%d %H:%M" --stat -6'
git config --global alias.lll 'log --pretty=format:"%h %ad [%an] %s%d" --date=format:"%Y-%m-%d %H:%M" --stat --graph -10'
git config --global alias.px 'config --global --replace-all http.proxy http://127.0.0.1:50001'
git config --global alias.px1 'config --global --replace-all http.proxy http://127.0.0.1:10809'
git config --global alias.nopx 'config --global --unset http.proxy'
git config --global alias.s 'status --short'
git config --global core.editor "vim"
# 防止gitk中文乱码
git config --global gui.encoding utf-8
git自动将sh文件转换成LF换行
使用.gitattributes
文件
你可以在Git仓库的根目录下创建一个.gitattributes
文件,并添加以下内容来指定.sh
文件总是使用LF作为换行符:
*.sh text eol=lf
这行配置会告诉Git在检出(checkout)时,自动将.sh
文件的换行符转换为LF。
禁用自动CRLF转换的全局设置
如果你不希望在任何仓库中自动转换CRLF,你可以禁用Git的全局自动转换功能,通过运行以下命令:
git config --global core.autocrlf false
这将阻止Git在提交时自动将LF转换为CRLF(对Windows用户),或在检出代码时将CRLF转换为LF(对Unix-like系统用户)。
初始化创建项目
如果在远程先创建好了仓库地址,想把本地新项目加入到远程可以这样做:
git init
git add .
git commit -am "test"
# 关联远程仓库地址
git remote add origin 远程仓库地址
git push
# 或者
git push -f
gitlab允许强制推送:
登录到您的 GitLab 帐户。
找到您要启用强制 push 的仓库,并进入该仓库的页面。
点击仓库页面右上方的 "Settings"(设置)按钮。
在左侧导航栏中,选择 "Repository"(代码仓库)选项。
滚动页面直到找到 "Protected Branches"(受保护分支)部分。
找到您想要启用强制 push 的目标分支,然后点击其旁边的 "Unprotect"(取消保护)按钮。如果该分支已经受保护,则您需要先解除保护。
在弹出窗口中确认解除保护,并提供必要的管理员权限验证(如果需要)。
解除保护后,再次找到目标分支,并点击其旁边的 "Protect"(保护)按钮。
在弹出窗口中,您可以配置对该分支的保护设置。
在 "Allowed to push"(允许推送)部分,选择 "Developers + Maintainers"(开发者 + 维护者)或其他适当的角色,以指定谁有权进行推送操作。
使用HTTP basic auth clone
使用http方式去clone时,如果用户名密码包含特殊字符,则都需要URL encode
比如用户名含有邮箱的@符号时需要转换成%40
git clone https://malu%40malu.me:password@github.com/pingmalu/test.git
git赋予文件权限
查看当前权限
[localhost]$ git ls-files --stage run.sh
100644 c1bda43ae2d82769f5e66404fdbe7d752ddb383b 0 run.sh
增加可执行权限
[localhost]$ git update-index --chmod +x run.sh
git添加多个远程仓库
添加新的远程仓库:
git remote add malu https://malu.me/project/xxx.git
将本地的所有分支推送到新的远程仓库:
git push --all malu
强制推送到新的远程仓库:
git push -f malu
git基本使用方法
查看远程仓库地址
git remote -v
查看所有分支
git branch -a
查看每次提交的所有文件列表
git log --stat
查看特定的commit id中的文件列表
git show --stat <commit id>
查看最近一次提交的文件列表
git show --stat
或
git log --stat -1
查看配置
git config -l
一次完整提交
git add .
git commit -m'修改BUG'
git push
使用代理
git ssh使用代理
编辑文件:~/.ssh/config
host github.com
user git
hostname github.com
port 22
proxycommand ncat --proxy-type socks5 --proxy 127.0.0.1:50001 %h %p
git http使用代理
git config http.proxy http://user:pwd@server.com:port
http全局代理
git config --global http.proxy http://127.0.0.1:1080
http当前项目代理
git config --local http.proxy http://127.0.0.1:1080
socks5全局代理
git config --global http.proxy socks5://127.0.0.1:1080
socks5全局代理,只对github.com
git config --global http.https://github.com.proxy socks5://127.0.0.1:1080
clone时使用代理
git clone https://github.com/xxx.git -c http.proxy=socks5://127.0.0.1:1080
clone时使用代理并取最新的
git clone https://github.com/xxx.git -c http.proxy=socks5://127.0.0.1:1080 --depth=1
取消代理
git config --global --unset http.proxy
取消只对github.com的代理
git config --global --unset http.https://github.com.proxy
查询
显示文件的每一行是在哪个版本最后修改。
git blame filename.c
查找commit内容
git log --pretty=oneline|grep 关键字
查看用户代码量
git log --stat --author='username'|perl -ne 'END { print $c } $c += $1 if /(\d+) insertions/;'
分支
查看本地分支
git branch
查看所有分支 (加-v显示最后一次提交信息)
git branch -a -v
本地创建分支
git branch dev
将本地分支上传至远程
git push origin dev
下载在线的一个分支
git branch dev origin/dev
删除本地分支
git branch -d dev
删除远程分支
git branch -r -d origin/branch-name
git push origin :branch-name
切换本地分支到dev
git checkout dev
合并分支
1.开发分支(dev)上的代码达到上线的标准后,要合并到 master 分支
git checkout dev
git pull
git checkout master
git merge dev
git push -u origin master
2.当master代码改动了,需要更新开发分支(dev)上的代码
git checkout master
git pull
git checkout dev
git merge master
git push -u origin dev
3.假设本地有2个分支dev master,要把dev合并到master 也可以
git merge dev master
4.把dev合并到master还可以
git rebase dev master
合并冲突解决
1.如果合并冲突取对方代码
git merge -s recursive -X theirs dev --allow-unrelated-histories
2.如果合并冲突取当前分支代码
git merge -s recursive -X ours dev --allow-unrelated-histories
–allow-unrelated-histories 把两段不相干的 分支进行强行合并
3.一个分支完全覆盖另一个分支
git checkout master // 切换到旧的分支
git reset –hard dev // 将本地的旧分支 master 重置成 dev
git push origin master –force // 再推送到远程仓库
标签
本地新建标签
git tag -a only_apache -m "只有apache集成环境"
查看本地标签
git tag
切换至指定标签
git checkout only_apache
把所有本地标签提交到服务器
git push origin --tags
将标签only_apache提交到服务器
git push origin only_apache
GIT子模块
安全重置子模块
git submodule deinit -f .
git submodule update --init
第一条命令是完全 “解除 “所有子模块的绑定,第二条命令是对这些子模块进行重新签出。 它比其他方法花费更多时间,但无论你的子模块处于什么状态,它都能发挥作用。
添加子模块
git submodule add https://github.com/xxx.git xxx
添加子模块后运行git status
, 可以看到目录有增加1个文件.gitmodules
, 这个文件用来保存子模块的信息。
查看子模块
$ git submodule
390bd304bf71391d58d23b53fe15dc6d02318307 Backtesting/BCS (heads/master)
更新子模块
更新项目内子模块到最新版本
git submodule update
更新子模块为远程项目的最新版本
git submodule update --remote
克隆包含子模块的项目
克隆包含子模块的项目有二种方法:另一种是直接递归克隆整个项目;一种是先克隆父项目,再更新子模块。
一.递归克隆整个项目
git clone https://github.com/xxx.git xxx --recursive
递归克隆整个项目,子模块已经同时更新了,一步到位。
二.克隆父项目,再更新子模块
1.克隆父项目
$ git clone https://github.com/xxx.git xxx
2.查看子模块
$ git submodule
-390bd304bf71391d58d23b53fe15dc6d02318307 yyy
子模块前面有一个-
,说明子模块文件还未检入(空文件夹)。
3.初始化子模块
$ git submodule init
Submodule 'yyy' (https://github.com/yyy.git) registered for path 'yyy'
初始化模块只需在克隆父项目后运行一次。
4.更新子模块
$ git submodule update
Cloning into 'C:/xxx/yyy'...
Submodule path 'yyy': checked out '390bd304bf71391d58d23b53fe15dc6d02318307'
修改子模块里内容
在子模块中修改文件后,直接提交到远程项目分支。
$ git add .
$ git ci -m "commit"
$ git push
删除子模块
# 逆初始化模块,其中{MOD_NAME}为模块目录,执行后可发现模块目录被清空
git submodule deinit {MOD_NAME}
# 删除.gitmodules中记录的模块信息(--cached选项清除.git/modules中的缓存)
git rm --cached {MOD_NAME}
# 提交更改到代码库,可观察到'.gitmodules'内容发生变更
git commit -am "Remove a submodule."
# 此外,你可能还需要删除 .git/modules/{MOD_NAME}的缓存,否则无法创建同名的module.
切换远程分支,Git每次提交需要密码处理
把远程分支从https切换到ssh模式
# 先查看远程分支
git remote -v
# 删除远程分支
git remote rm origin
# 添加远程分支
git remote add origin git@github.com:pingmalu/test.git
Git 合并遇到冲突解决办法
1.使用栈保存编辑数据后pull下来再合并
git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
git pull: 暂存了本地修改之后,就可以pull了。
git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash pop stash@{$num}: 如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}
git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。
2.从xxxx分支合并到dev
先把xxxx分支上的提交hash找出来,再去dev上执行cherry-pick:
git cherry-pick a2a544fd01c2578046b335636e4
git push origin dev
Git后悔药(慎用)
放弃本地修改
git reset --hard
git clean -df
其他:
git rm --cached <FILE>:已 add(tracked) 未 commit 的文件,使其回到未 add 状态(untracked)。
git rm -f <FILE>: 从本地删除已 add 的文件。
git checkout -- <FILE> :有修改的文件回到 tracked 状态,对已 tracked 的文件撤销修改。
git reset HEAD <FILE>:撤销 commit,回到 modified 状态。
git reset --soft HEAD^:撤销 commit,回到 tracked 状态。
git clean:删除所有 untracked 文件。
git clean -n:演习
git clean -f:删除当前目录下 untracked 文件,除过 .gitignore 里的文件或文件夹
git clean -f <path>:指定路径下
git clean -df:删除当前目录下 untracked 文件和文件夹
git clean -xf:删除当前目录下所有 untracked 文件,不管 .gitignore
放弃本地修改,使用远程最新版本
git fetch --all
git reset --hard origin/master
git pull
如果只需要移除一个文件
git reset <文件名>
或者如果你想从暂存区移除所有没有提交的修改
git reset
放弃远程上一次提交的内容
git reset --hard HEAD^
或用:
git reset --hard HEAD~1
git push --force
修改错误的提交信息
git commit --amend -m ”YOUR-NEW-COMMIT-MESSAGE”
git push <remote> <branch> --force
恢复某个文件到指定hash
git checkout fc0c4369b362a38 .\index.html
Stash未提交的更改
stash在本质上会取走所有的变更并存储它们为以备将来使用
git stash
检查stash列表,你可以运行下面的命令
git stash list
如果想要解除stash并且恢复未提交的变更
git stash apply
每个stash都有一个标识符,一个唯一的号码(尽管在这种情况下只有一个stash)。 如果只想留有余地进行apply stash,你应该给apply添加特定的标识符
git stash apply stash@{2}
如果想取出stash
git stash pop
取出指定stash
git stash pop stash@{2}
清除stash
git stash drop stash@{0}
清除所有stash
git stash clear
找回删除的stash
git fsck --lost-found
git show 8dd73fa8d14880182f11e24dc10bca570b6127d7
Ubuntu git升级到最新版
apt-get install software-properties-common
add-apt-repository ppa:git-core/ppa
apt-get update
apt-get install git
cmd下git log乱码
windows配置环境变量
LESSCHARSET 为 utf-8
统一配置:
git config --global i18n.commitencoding utf-8
git config --global i18n.logoutputencoding utf-8
export LESSCHARSET=utf-8 ## linux bash配置环境变量
set LESSCHARSET=utf-8 #windows配置环境变量
gitk乱码问题
编辑C:\Users\Administrator\.gitconfig 全局文件(也可编辑项目目录.git/config用于设定单个项目):
[gui]
encoding = utf-8
[i18n]
commitencoding = {utf-8|gbk}
[gui]用于设定gitk总的编码格式
[i18n]用于设定commit等编码,这个默认不需要去设置
Git Bash中查看log中文乱码
修改%Git%\etc\profile (Linux下为 ~/.bash_profile 文件),在末尾添加如下一行:
export LESSCHARSET=utf-8
要马上生效,直接设置该环境变量,或者重新登录
git diff乱码问题也可以用上面的设置
export LESSCHARSET=utf-8
git-bash 乱码临时转换
utf-8转gbk
git status | iconv -f utf-8 -t gbk
gbk 转 utf-8 输出
winpty ipconfig
解决 idea Terminal 配置 git bash 中文乱码
修改:C:\Program Files\Git\etc\bash.bashrc 文件,在这个文件末尾追加
export LANG="zh_CN.UTF-8"
export LC_ALL="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.
git gc
由于git本身不保存文件之前的差异文件.只保存每个文件的快照.所以在频繁修改大文件的情况下会造成git目录变得肥大不堪.git早就有了解决方案.git gc后,会在.git目录下生成一个packfile与idx文件.只保存文件差异
Git忽略规则及.gitignore规则不生效的解决办法
原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。
那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:
git rm -r --cached . #将会移除所有的缓存索引
git add .
git commit -m 'update .gitignore'
!!! 还有一种可能是.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
再执行:
git gc --auto #自动清理本地的文件
git repack -d -l # 将版本库未打包的松散对象打包
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脚本
拉取:
@echo off
@echo ========================================================
@echo git pull
@echo ========================================================
git pull
提交:
@echo off
@echo ========================================================
@echo git push
@echo ========================================================
git add . && git commit -am 'update' && git push
部署gitlab服务器
docker安装: