版本控制
文件配置
有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如 /etc/gitconfig 和 ~/.gitconfig),不过最终 Git 实际采用的是最后一个。
git config --list
# core.autocrlf=true
git会自动转换换行符,导致提交时有多余的文件被更改.进行一下设置修复
# 提交检出均不转换
git config --global core.autocrlf false
# 拒绝提交包含混合换行符的文件
git config --global core.safecrlf true
# 提交包含混合换行符的文件时给出警告
git config --global core.safecrlf warn
- 中文设置
中文乱码: git status
# git config --global core.quotepath false # 对 0×80 以上的字符进不进行进行转义编码
- 中文乱码: git log
# 注:全局配置还是当前项目配置看具体情况
# git config --global gui.encoding utf-8 # 根据本地编码选择图形界面的编码
# git config --global i18n.commit.encoding utf-8 # 根据本地编码选择提交信息的编码
# git config --global i18n.logoutputencoding utf-8 # 根据本地编码环境选择日志的编码
# i18n 是 internationalization 的简称, 数字基于首尾英文单字长度
*.log #忽略所有日志文件
!except.log #不忽略该文件
vendor/ #忽略文件夹
/config #忽略文件
工具配置
- IDE 配置
当更改 IDE 的 Terminal 为 Git Bash 时有可能会出现 git log 仍然乱码,这种情况下需要更改 IDE 设置
# 以 PhpStorm 为例
# 编辑: phpstorm64.exe.vmoptions 添加
-Dfile.encoding=UTF-8
# 编辑: phpstorm.exe.vmoptions 添加
-Dfile.encoding=UTF-8
编辑 Git 文件
# 编辑: bash.bashrc 添加
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
- Cmder 更改 λ 为 $
打开文件,搜索 λ 将 λ 改为 $ 即可
# git
Cmder\vendor\git-for-windows\etc\profile.d\git-prompt.sh
# Cmder
Cmder\vendor\clink.lua
- Bash配置
右键点击进入 Bash 的设置界面, Text选项 改为 Local:zh_CN, Character:UTF-8
# 设置 HTTP 代理
git config --global http.proxy http://127.0.0.1:8118
git config --global https.proxy http://127.0.0.1:8118
# 设置 SOCKS5 代理
git config --global http.proxy socks5://127.0.0.1:1080
git config --global https.proxy socks5://127.0.0.1:1080
# 取消代理设置
git config --global --unset http.proxy
git config --global --unset https.proxy
分支相关
- 头指针游离
# 切换到某一历史版本
git checkout bda7532839a90de23e7a71017ed2c56816d6f8b2
# 比较两个分支间的修改
git diff master origin/dev
# 比较两个分支间的提交记录
git cherry local/dev upstream/master
# 查看分支的提交记录
git log branchName
# 默认推送到与当前分支同名的远程分支
git config core.push current
# 默认拉取到与当前分支同名的远程分支
git config core.pull current
# 查看本地分支的详细信息
git branch -vv
bug 506ac405 [upstream/master] Merge branch 'bug_send_appmsg' into 'master'
dev 506ac405 [upstream/dev] Merge branch 'bug_send_appmsg' into 'master'
* master a5ee1b00 [upstream/master: behind 2] Merge branch 'req_net_mail_en' into 'master'
# 设置关联的远程分支
git branch --set-upstream-to=remote_repository/target_remote_branch current_branch
# 设置关联的远程分支
git branch -u remote_repository/target_remote_branch current_branch
# 设置关联的远程分支(名字相同)
git branch -u origin/$(git rev-parse --abbrev-ref HEAD)
# 推送并关联远程分支
git push -u origin/branch
# 推送并关联远程分支
git push --set-upstream origin/branch
# 查看所有分支
git branch -a
# 查看远程分支
git branch -r
# 查看远程仓库信息
git remote show origin
# 删除本地跟踪(已被删除的远程分支,本地还追踪着)
git remote prune origin
# 批量删除本地分支
git branch | grep -v -E 'master|dev' | xargs git branch -D
# 删除远程分支
git push origin :branch_name
# 复制一个远程分支到本地
git checkout -b dev origin/dev
# 更改分支名称
git branch -m old_name new_name
头指针游离 : HEAD detached at bda7532
需要注意的是游离状态下的提交是无法可见保存的,一旦切到别的分支,游离状态以后的提交就不可追溯了.解决办法是新建一个分支保存游离状态后的提交
版本历史
- 重写最近提交历史(未推送)
# 重写最近提交历史(未推送)
git commit --amend
# 强制提交
git push origin branch -f
# 回退更改
git checkout .
# 查看某个提交的具体内容
git show commit_id
- 合并提交分支
# 合并提交分支
git rebase upstream/master
# 合并其他分支的提交到当前分支
git cherry-pick acddaa967
# 获取区间段的提交( [首尾都是闭区间] ) (注意提交的时间顺序)
git cherry-pick acddaa967^..asd1123
# 获取区间段的提交( (尾是开区间首是闭区间] ) (注意提交的时间顺序)
- 冲突解决
# 配置冲突解决工具
git config --global merge.tool vimdiff
#暂存代码
git stash save [message]
# 查看暂存列表
git stash list
#恢复暂存
git stash apply
#恢复指定的暂存
git stash apply stash@{1}
#移除暂存代码
git stash drop stash@{1}
#恢复并移除第一个暂存
git stash pop
#恢复并移除指定暂存
git stash pop stash@{1}
使用内建指令需要版本 > 1.9
# 更新版本( 2.14.2 - 2.16.1)
git update
# 更新版本( > 2.16.1)
git update-git-for-windows
# 使用内建指令(rebase)
git config --global rebase.useBuiltin true
# 使用内建指令(stash)
git config --global stash.useBuiltin true
撤销更改
git revert 是用一次新的 commit 来回滚之前的 commit 而 git reset 是直接删除指定的 commit
# 撤销已经更改但是还没保存的文件
git checkout .
# 撤销更改的文件
git reset --hard
# 回滚到指定提交
git reset commit_id
# 回滚到前两个提交
git reset HEAD^^
# 取消指定提交的内容
git revert commit_id
# 取消第二个的提交
git reset HEAD^^
--
用以标识后面跟随的是文件而不是分支,git checkout 是针对分支的命令,当找不到分支时会去查找文件,所以某些情况下 checkout . 与 checkout — . 是等效的
缓存管理
# 清除缓存
git rm -r --cached .
# 追踪本地文件
git add .
# 保存更改
git commit -am 'updateCache'
# 查看将要删除的未追踪的文件
git clean -nf
# 删除未追踪的文件
git clean -f
# 删除未追踪的文件和目录
git clean -fd
# 删除未追踪的文件和目录和编译文件
git clean -fdx
代码托管
- 项目相关
创建/查看目标用户的公钥,并添加 Git 公钥,使之能拉取/提交代码
- 项目语言
# 问题原因
github 是根据项目里文件数目最多的文件类型,识别项目类型
# 解决办法
项目根目录添加 .gitattributes 文件, 将指定文件类型设置为目标语言,内容如下 :
*.swift linguist-language=object-c
从远程检出特定的合并请求。例如,要检查ID为5的合并请求:
git mr upstream 5
# 编辑配置
git config --edit
# 添加拉去合并请求的命令
[alias]
mr = !sh -c 'git fetch $1 merge-requests/$2/head:mr-$1-$2 && git checkout mr-$1-$2' -
# 从远程仓库获取最新的代码
git fetch upstream
# 获取最新代码并设置远程分支与本地引用的映射关系
git fetch upstream <src>:<dst>
注意
: 强制提交最好用在个人仓库,协作开发还是合并为好
# gitlab允许强制提交
unprotect branch
# 强制提交
git push -f
# 指定仓库强制提交
git push -u origin master -f
相关文章
PHP 规范开发(一):断点调试
PHP 规范开发(二):单元测试
PHP 规范开发(三):版本控制与协作开发
PHP 规范开发(四):重构、代码规范及设计模式