Git的官方网站:http://git-scm.com
Git和GitHub使用总结
一、GIT初始化设置:
创建密钥
1
| ssh‐keygen ‐t rsa ‐C "lingcoder@gmail.com"
|
远程仓库
1
2
3
4
5
6
7
8
| 添加远程origin库关联
git remote add origin git@github.com:lingcoder/xxx.git
查看远程仓库
git remote -v
删除远程origin库的关联
git remote rm origin
|
用户名邮箱配置
全局配置
1
2
3
| git config --global user.name "lingcoder"
git config --global user.email "lingcoder@gmail.com"
git config --list
|
项目单独配置(在项目根目录下)
1
2
3
| git config user.name "lingcoder"
git config user.email "lingcoder@gmail.com"
git config --list
|
设置Git默认分支名为 main
1
| git config --global init.defaultBranch main
|
创建本地仓库
Clone远程仓库
格式化与空白
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
1. 问题来源:
Windows使用回车和换行两个字符来结束一行,而Mac和Linux只使用换行一个字符
2. 换行定义:
CR Carriage-Return的缩写: 回车(CR, ASCII 13, \r)
LF Line-Feed的缩写,换行(LF, ASCII 10, \n)
window 采用CRLF
Linux,Mac采用LF
3. 解决办法:
(0) Git配置
Git可以在你提交代码时自动地把行结束符CRLF转换成LF,而在检出代码时把LF转换成CRLF
⑴ 在Windows系统上与其他系统协作开发
用core.autocrlf来打开此项功能,如果是在Windows系统上,把它设置成true,这样当检出 代码时,LF会被转换成CRLF:
$ git config --global core.autocrlf true
⑵ 在Linux或Mac系统上与其他系统协作开发
Linux或Mac系统使用LF作为行结束符,如果你不想Git在检出代码时进行自动的转换,把core.autocrlf设置成input来告诉Git在提交代码时把CRLF转换成LF,检出时不转换:
$ git config –-global core.autocrlf input
这样在Windows系统上检出的代码会保留CRLF;而在Mac和Linux系统上,以及仓库中保留LF。
⑶ 团队都是在Windows系统上开发
如果在Windows系统上开发程序,且正在开发仅运行在Windows上的项目,可以设置false取消此功能,把回车符记录在库中:
$ git config –-global core.autocrlf false
|
代理设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| 查看全局代理设置
git config --global http.proxy
设置http,https,socket代理 以`127.0.0.1:1080`为例
git config --global http.proxy 'http://127.0.0.1:1080'
git config --global https.proxy 'http://127.0.0.1:1080'
git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'
需要代理用户名密码的情况,以http为例
git config http.proxy http://username:password@127.0.0.1:1080
忽略SSL证书错误
git config --global http.sslVerify false
删除 proxy
git config --global --unset http.proxy
git config --global --unset https.proxy
|
自定义操作
1
2
3
4
5
6
7
8
9
10
| #让Git显示颜色,会让命令输出看起来更醒目
git config ‐‐global color.ui true
#自定义git命令,以简化"git status"成"git st"为例
git config ‐‐global alias.st status
#自定义日志颜色
git config ‐‐global alias.lg "log ‐‐color ‐‐graph ‐‐pretty=format:'%Cred%h%Creset ‐%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' ‐‐abbrev‐commit"
git lg
|
更新单个文件
1
2
3
4
5
6
| 更新本地
git checkout -- "[文件路径]/[文件名]"
更新远程
git fetch
git checkout origin/master -- ""[文件路径]/[文件名]""
|
二、GIT基本操作
添加到暂存区区
1
2
3
4
5
6
7
8
9
10
11
| 表示添加所有内容
git add -A
表示添加新文件和编辑过的文件不包括删除的文件
git add .
表示添加编辑或者删除的文件,不包括新添加的文件
git add -u
强制添加一个被.gitignore文件忽略的文件的版本库
git add ‐f [文件名]
|
提交
1
2
3
4
5
6
| 普通提交
git commit`
将本次提交的内容合并到上次提交
git commit --amend
|
删除
1
2
| 从版本库删除某个文件
git rm [文件名]
|
版本回退
1
2
3
4
5
6
7
8
| 撤回到某个版本
git reset --hard [提交ID]
查看过去的提交历史
git log
查看所有的提交历史
git reflog
|
撤销修改
1
2
3
4
5
| 让file回到最近一次 "git commit" 或 "git add" 时的状态
git checkout -- [文件名]
可以把暂存区的file修改撤销掉(unstage),重新放回工作区
git reset HEAD [文件名]
|
三、GIT分支操作
创建分支
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| 创建一个dev分支并且切换到dev分支
git checkout ‐b dev
创建dev分支
git branch dev
切换到dev分支
git checkout dev
创建远程origin的dev分支到本地
git checkout ‐b dev origin/dev
查看分支
git branch
|
分支命名规范: issue-100 bug修复分支 feature-sms sms功能分支
分支合并
1
2
3
4
5
| 合并dev到当前的分支
git merge dev
合并分支,并且禁用 Fast forward
git merge ‐‐no‐ff ‐m "merge with no‐ff" dev
|
Fast forward模式: Git在merge时生成一个新的commit,以便于从分支历史上就可以看出合并分支信息
分支推送
1
2
3
4
5
6
7
8
9
10
| 将当前master分支推送到远程,并设置关联
git push ‐u origin master
强制推送dev分支到远程
git push origin dev -f
取出远程dev分支
git fetch origin dev
将当前分支内容重置为取出的dev分支
git reset --hard origin dev
|
分支绑定
1
2
3
4
5
| 将本地的dev分支和远程的origin的dev分支绑定
git branch ‐‐set‐upstream-to=origin/dev dev
以后就可以直接pull了
git pull
|
分支删除
1
2
3
4
5
6
7
8
| 删除dev分支
git branch ‐d dev
强行删除
git branch ‐D dev
修剪远程分支
git fetch -p
|
stash功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| 把当前的工作状态保存下来,以便于后面恢复,包括index区。
git stash
把当前的工作状态保存下来,以便于后面恢复,包括index区。
git stash list
恢复statsh内容,但是不删除statsh
git stash apply
恢复指定的stash
git stash apply stash@{0}
删除stash内容
git stash drop
恢复同时删除stash内容
git stash pop
|
四、GIT标签操作
本地操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| 查看分支
git tag
给当前分支打标签
git tag
给某个提交打标签
git tag [标签名] [提交ID]
创建带有说明的标签,用 -a 指定标签名, -m 指定说明文字
git tag ‐a [标签名] ‐m "第一个正式版本" [提交ID]
查看标签说明
git show [标签名]
删除标签
git tag -d [标签名]
|
远程操作
1
2
3
4
5
6
7
8
9
10
11
| 标签推送
git push origin [标签名]
推送全部尚未推送到远程的本地标签:
git push origin ‐‐tags
删除远程标签
1. 先删除本地标签
git tag -d [标签名]
2. 再推送远程
git push origin :refs/tags/[标签名]
|
五、Github同步原作者代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
1. 查看远程状态
git remote -v
2. 添加原作者的远程仓库到remote
git remote add upstream 原作者远程仓库地址
3. 同步fork
git fetch upstream
4. 切换到本地主分支
git checkout master
5. 把 upstream/master 分支合并到本地 master
git merge upstream/master
6. push到远程仓库
git push origin master
7. 解决冲突
直接编辑冲突文件,然后提交更改重新push即可
|
六、GIT多人协作的工作模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| 1. 首先,试图推送自己的修改
git push origin branch-name
2. 如果推送失败,则因为远程分支比你的本地更新,需先试图合并
git pull
3. 如果合并有冲突,则解决冲突,并在本地提交
4. 没有冲突或者解决掉冲突后,再推送就能成功!
git push origin branch-name
如果"git pull"提示“no tracking information”,则先命令绑定关系
git branch --set-upstream branch-name origin/branch-name
# 日常使用顺序
# 去自己的工作分支
$ git checkout work
工作
....
提交工作分支的修改
$ git commit -a
回到主分支
$ git checkout master
获取远程最新的修改,此时不会产生冲突
$ git pull
回到工作分支
$ git checkout work
用rebase合并主干的修改,如果有冲突在此时解决
$ git rebase master
回到主分支
$ git checkout master
合并工作分支的修改,此时不会产生冲突。
$ git merge work
提交到远程主干
$ git push
|
七、GIT关联Gitee和GitHub
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| 1. 删除已有的默认远程库:
git remote rm origin
2. 关联码云的远程库
git remote add [远程库别名] git@gitee.com:xxx/xxx.git
3. 关联GitHub远程库
git remote add [远程库别名] git@github.com:xxx/xxx.git
4. 查看远程库信息
git remote ‐v
5. 分别推送到github和gitee
以别名github为例,推送到GitHub,使用命令:
git push github master
以别名gitee为例,推送到码云,使用命令:
git push gitee master
至此,我们的本地库就可以同时与多个远程库互相同步
|
八、Github 解决敏感配置文件上传问题
- 将真正的config文件加入.gitignore,然后推送一个基本的config_example文件
- push 结束后,再把 config_example 添加到 .gitignore 中。
- 经典情景: 别人先clone 你的项目,把 config_example 文件 pull 下来后,复制一份再重命名为config,根据自己的环境稍加修改config文件。然后把两文件都添加到.gitignore 中。以后push
则不会再对远程仓库造成影响。
九、.gitignore文件忽略原则
忽略文件的原则
1
2
3
| 1. 忽略操作系统自动生成的文件,比如缩略图等;
2. 忽略编译生成的中间文件、可执行文件等;
3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
|
检查文件忽略情况
1
| git check‐ignore ‐v [文件名]
|
十、搭建git私服,以ubuntu为例
基本使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| 1. 安装git:
sudo apt-get install git
2. 创建一个git用户,用来运行git服务:
sudo adduser git
3. 创建证书登录:
收集员工公钥`id_rsa.pub`文件,导入到`/home/git/.ssh/authorized_keys`文件里,一行一个。
4. 初始化Git仓库:
选定目录作为Git仓库,假定是`/srv/sample.git`,在`/srv`目录下输入命令:
sudo git init --bare sample.git
5. 把owner改为`git`
sudo chown -R git:git sample.git
6. 禁用shell登录: 编辑`/etc/passwd`文件
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
7. 克隆远程仓库:
git clone git@server:/srv/sample.git
|
十一、利用git管理svn
简单介绍
GIT自带的git svn命令可以用来管理svn项目,对于习惯使用git的人来说,是一个不错的选择。基本上除了检出,提交,更新代码命令有所区别,大部分都是纯git操作
常用命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # 检出svn仓库代码
git svn clone
## 例子1 将dapp-parent项目检出到当前目录,文件夹名称dapp-parent
git svn clone http://xxx/dapp-parent
## 例子2 将dapp-parent项目检出到当前目录,文件夹名称huizhong
git svn clone http://xxx/dapp-parent huizhong
# 更新svn仓库的代码到本地当前分支
git svn rebase
# 提交本地分支的代码到svn仓库
git svn dcommit
# 查看git管理的svn仓库信息
git svn info
# 提交git分支到svn分支仓库(需要额外配置,并不常用)
git svn tag
|
十二、日志提交规范(参考 Angularjs 提交规范)
build: 影响构建系统或外部依赖关系的更改(示例范围:gulp,broccoli,npm)
ci: 更改我们的持续集成文件和脚本(e.g.: Travis,GitLab 等)
docs: 仅文档更改
feat: 一个新功能
fix: 修复错误
perf: 改进性能的代码更改
refactor: 代码更改,既不修复错误也不添加功能
style: 不影响代码含义的变化(空白,格式化,缺少分号等)
test: 添加缺失测试或更正现有测试
chore: 构建过程或辅助工具的变动
release: 版本发布
revert: 特殊情况,当前 commit 用于撤销以前的 commit
示例
1
2
3
4
5
| docs(core): Update inject error documentation(#123)
build: update eslint dependencies to v5.32.0 (#47016)
fix(router): do not call preload method when not necessary (#47007)
feat(language-service): support fix the component missing member (#46764)
refactor(common): Align PathLocationStrategy constructor(#123)
|
十三、将误传至Github的敏感资料删除
1
2
3
4
5
6
7
8
9
10
11
| git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch [敏感文件路径]' --prune-empty --tag-name-filter cat -- --all
git push origin [分支名称] --force
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now
|
扩展使用
- 管理公钥
Gitosis
- 管理权限
Gitolite