git
推荐阅读Pro Git电子书。
注意: 设置ssh key的时候不用设置密码,否则每次同步都要输入密码
初始配置
设置用户名和邮箱。必须要设置用户名及邮箱后才能使用Git,在每次提交代码时这些信息将会附加在提交信息当中。
git config --global user.name "YourName"
git config --global user.email "email@example.com"
生成公私钥。把生成的id_rsa.pub
的内容设置到Git托管平台的Setting > SSH Public Key,标题用于标识生成公钥的设备-用户。
ssh-keygen -t rsa -C youremail@example.com
可使用git config --list
命令查看当前设置。
常用命令
克隆到本地
git clone <git@xxx | https://xxx> [NEW_NAME]
添加远程仓库
git remote add REMOTE_REPOSITORY_URL
修改代码之后提交
git add -A
git commit -m 'modify message'
查看提交
git log [-NUM_OF_COMMITS]
# 每个提交单行显示
git log --oneline
# 或者
git log --pretty=oneline
# 显示简要的增改行数统计
git log --stat
查看提交树
git log --graph --all --oneline [--decorate]
推送本地分支到托管仓库,如果分支不存在则新建
git push [ORIGIN BRANCH] # 名称相同
git push [ORIGIN BRANCH:NEW_NAME] # 名称不同
修改本地分支对应的远程分支,-u
或 --set-upstream
git branch -u ORGIN/BRANCH
git push --set-upstream <origin branch>
从托管仓库拉取最新代码
git pull
查看分支
git branch # 查看本地分支
git branch -a # 查看本地分支及远程分支(可能过时)
在本地新建分支
git checkout -b <branchName>
# 等价于
git branch <branchName>
git checkout <branchName>
删除分支
# 安全,如果分支未合并到主干,删除失败
git branch -d BRANCH
# 不安全,强制删除分支
git branch -D BRANCH
# 删除远程分支
git push origin --delete BRANCH
# 或推送空分支到远程分支
git push origin :BRANCH
隐藏修改, 应用修改
# 隐藏
git stash
# 列出
git stash list
# 应用并删除
git stash pop
# 应用
git stash apply
撤销本地提交
# 查看提交记录,找到COMMIT_ID
git log -3
# COMMIT_ID之后提交的代码不会被删除,会变为未提交代码
git reset COMMIT_ID
撤销本地修改
# COMMIT_ID之后的代码会被删除
git reset --hard COMMIT_ID
撤销某个文件/目录的修改
# 撤销某个文件的提交
git reset COMMIT_ID PATH/TO/FILE
# 再撤销该文件的修改
git checkout PATH/TO/FILE
变基1,从远程分支拉取代码到本地开发,提交代码时,远程分支上有新的commit,则需要在本地拉取更新并变基。
git pull [REMOTE BRANCH] --rebase
# 如有冲突,按提示修改冲突并继续
git add <修改的文件/目录>
git rebase --continue
变基2,从远程master分支新建远程feature1分支用于特性开发,从远程feature1分支拉取代码到本地开发,完成后推送到远程feature1分支。将远程feature1分支merge到远程master分支时,发现master分支有新的commit(可能和feature1有冲突),则需要更新本地master分支,将本地feature1分支变基到master上,然后强制推送到远程feature1分支。
git rebase MASTER
git push --force-with-lease [ORIGIN FEATURE1]
在最新的commit上追加更新,参考Git修改已提交的邮箱和用户信息
git commit --amend
# 编辑提交信息并保存即可
# 追加更新用户信息,注意`<>`不能删除
git commit --amend --author="USER <xxx@xxx.com>" --no-edit
变基后推送时上游分支已被其他用户修改,或者想追加更新到远程分支,会遇到推送失败,需要强制推送:
-
--force
,不安全,强制覆盖远程分支。
--force-with-lease
,相对安全,若远程分支有他人新增的提交,则强制推送失败。注意若使用git fetch
,会让Git误以为远程分支上他人新增的提交已同步到本地分支上,实际没有。
git push --force-with-lease [ORIGIN BRANCH]
列出所有标签
git tag / git tag -l v0.*
创建带注释标签
git tag -a v0.1 -m 'message'
查看标签信息
git show v0.1
创建轻量级标签
git tag v0.1
后期贴标签
git log –pretty=oneline
git tag -a v0.1 -m '' 9fceb02
默认情况下,git push
并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库
- push单个tag,命令格式为:
git push origin <tagname>
- push所有tag,命令格式为:
git push [origin] --tags
删除tag
git push origin --delete tag
合并分支的特殊情况
# 合并release-3.5.1冲突时用release-3.5.1的代码替换master的代码
git merge -s recursive -X theirs release-3.5.1
# 合并release-3.5.1冲突时用master的代码替换release-3.5.1的代码
git merge -s recursive -X ours release-3.5.1
添加远程托管平台,新增的远程托管平台也要配置公钥
# 查看远程托管平台
git remote -v
# 添加远程托管平台
git remote add REMOTE <git@xxx | https://xxx.git>
清理本地无效的远程分支信息
git remote prune origin
# 或
git remote update origin --prune
更新远程分支信息,git fetch origin
和git remote update origin
功能相同。
统计代码量
git log --author="YourName" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -
# 或者
find . -name "*.py" |xargs wc -l
清除新创建的并且未git add
的文件(工作区)
git clean -d -f
高级配置
查看配置
# 查看全部配置
git config --list
# 查看全局配置
git config --global --list
# 查看本地配置,只在仓库内有效
git config --local --list
新增或修改某个配置git config --global <OPTION.KEY> <VALUE>
在编辑器中增删改查配置git config --global --edit
,或者直接vim ~/.gitconfig
。
删除某个配置git config --global --unset <OPTION.KEY>
配置默认编辑器为Vim
git config --global core.editor vim
配置代理
# 配置,注意对特殊字符做URL Encode,账户密码可选:
git config --global http.proxy http://[USER:PASSWORD@]PROXY.DOMAIN:PORT
git config --global https.proxy https://[USER:PASSWORD@]PROXY.DOMAIN:PORT
# 删除:
git config --global --unset http.proxy
git config --global --unset https.proxy
# 查看:
git config --list
设置git用户名密码,避免每次输入的方法
仅针对通过HTTPS / HTTP与远程仓库连接的情况
-
创建文件存储GIT用户名和密码
在%HOME%目录中,一般为C:\users\Administrator
,也可以是你自己创建的系统用户名目录,反正都在C:\users\
中。文件名为.git-credentials
, 由于在Window中不允许直接创建以.
开头的文件,所以需要借助git bash进行,打开git bash客户端,进如%HOME%
目录,然后用touch
创建文件.git-credentials
, 用vim编辑此文件,如下:touch .git-credentials vim .git-credentials # 输入以下内容, https://{username}:{password}@github.com #(说明:此处应为https://username:password@github.com)
-
添加Git Config内容
进入git bash终端, 输入如下命令:git config --global credential.helper store
执行完后查看
%HOME%
目录下的.gitconfig
文件,会多了一项:[credential] helper = store
重新开启git bash会发现
git push
时不用再输入用户名和密码
换行符
- CR:表示回车\r
- LF:表示换行\n
- CRLF:表示回车换行\r\n
敲下回车键,不同的操作系统保存到文件中的值:
- Windows:使用的是CRLF ==> 即\r\n,文件中保存的是\r\n
- Linux/Unix: 使用的是LF ==> 即\n,文件中保存的是\n
- Mac OS X系统:使用的是LF ==> 即\n,文件中保存的是\n(旧版Mac OS使用的是CR ==> 即\r)
Git为了解决上面提出的问题,会自动对换行符进行转换:
- 在提交时将CRLF转换为LF,在拉取(检出checkout)时将UNIX换行符(LF)替换成CRLF。(Windows系统默认)
- 在提交时将CRLF转换为LF,在拉取(检出checkout)时不进行转换。(Linux/Unix和Mac OS X默认)
换行符转换会导致代码文件在IDE中呈现修改状态,如果需要取消自动转换,可以通过Git命令或者.gitconfig
文件修改autocrlf配置:
// 提交时转换为LF,检出时转换为CRLF
git config --global core.autocrlf true
// 提交时转换为LF,检出时不转换
git config --global core.autocrlf input
// 提交检出均不转换
git config --global core.autocrlf false
可选配置safecrlf检查:
// 拒绝提交包含混合换行符的文件 (一般设置为true)
git config --global core.safecrlf true
// 允许提交包含混合换行符的文件
git config --global core.safecrlf false
// 提交包含混合换行符的文件时给出警告
git config --global core.safecrlf warn
Git Windows中文乱码问题
文本文件,代码文件统一使用UTF-8无BOM编码
解决Git bash下ls
中文乱码,在Git bash安装目录C:\Program Files (x86)\Git\etc\git-completion.bash
中添加:
alias ls='ls --show-control-chars --color=auto'
git status中文目录显示为八进制数字的问题,在git bash中输入:
git config --global core.quotepath false
Git协作
https://www.ibm.com/developerworks/cn/java/j-lo-git-mange/index.html
http://www.ruanyifeng.com/blog/2015/12/git-workflow.html
Git协作一般有3种方式:
- master及以上角色:直接push到远程主干或特性分支
- developer角色: 本地新建自己的开发分支,如dev-dyh,推送到“临时”远程分支dev-dyh,提交merge request,待合入后自动/手动删除临时分支
- developer及以下角色、非团队成员: 在远程仓库上Fork自己的仓库,在自己仓库上开发完成,提交merge request到原仓库,等待管理员合入
以2为例:
# 新建本地分支,仅第一次需要
git checkout -b dev-worker
# 或切换到已有分支
git checkout dev-worker
git status # 看一下待提交状态,可略
git add * # 记得不要把不相关的文件add进来
git status # 看一下add结果,可略
git commit -m 'some message'
# 推送/新建远程分支
git push origin dev-worker
# 其他人,等分支新建完成后
git pull
git checkout dev-worker
异常
git error: RPC failed; result=22, HTTP code = 411
,或error: RPC failed; curl 56 GnuTLS recv error (-110): The TLS connection was non-properly terminated.
?
答:通常在下载大的代码仓库时出现,可以修改git的传输字节限制,值要大于仓库大小,如1G,git config --global https.postBuffer 1048576000 #或524288000(500M)
。
fatal: unable to access 'https://xxx.git/': error:1408F10B:SSL routines:ssl3_get_record:wrong version number
?
答:需配置http和https代理。
fatal: unable to access 'https://xxx.git/': SSL certificate problem: unable to get local issuer certificate
?
答:需关闭SSL检查git config --global http.sslverify false
MobaXterm自带了Git,通常会和单独安装的Git冲突或者混用,引发错误?