Git

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并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库

  1. push单个tag,命令格式为:git push origin <tagname>
  2. 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 origingit 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

# 针对特定域名/远程托管平台设置proxy
git config --global http.https://github.com.proxy http://[USER:PASSWORD@]PROXY.DOMAIN:PORT
git config --global https.https://github.com.proxy http://[USER:PASSWORD@]PROXY.DOMAIN:PORT
# 删除时同样采用完整字段

设置git用户名密码,避免每次输入的方法

仅针对通过HTTPS / HTTP与远程仓库连接的情况

  1. 创建文件存储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)
    
  2. 添加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种方式:

  1. master及以上角色:直接push到远程主干或特性分支
  2. developer角色: 本地新建自己的开发分支,如dev-dyh,推送到“临时”远程分支dev-dyh,提交merge request,待合入后自动/手动删除临时分支
  3. 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冲突或者混用,引发错误?

答:https://www.jianshu.com/p/2157b59b45e7

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 14,655评论 9 163
  • 本文为 Git教程的学习笔记,教程源自廖雪峰的博客。这是一个由浅入深,学完后能立刻上手的Git教程。另,附上另一本...
    七弦桐语阅读 11,401评论 5 47
  • 钟声响了,我依然凝望着那白纱窗,在灯烛摇晃的窗脚,那里有我渐渐歪曲的影子。 风儿簌簌地扑向树梢,嘲讽重重地踏过心坎...
    MYMYMYMY阅读 1,405评论 0 0
  • 初春的夜 你在身后 窗外的阴云 窗外的执着 你接收到吗? 静下来 静下来 好美的风景 人生有缺陷 爱无所不能
    留子尧阅读 1,382评论 0 1

友情链接更多精彩内容