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

设置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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

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