Featured image of post Git和GitHub使用总结

Git和GitHub使用总结

包含开发中常用的GIT命令和疑难杂症解决方案

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

# 创建本地仓库

1
git init

# Clone远程仓库

1
git 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 解决敏感配置文件上传问题

  1. 将真正的config文件加入.gitignore,然后推送一个基本的config_example文件
  2. push 结束后,再把 config_example 添加到 .gitignore 中。
  3. 经典情景: 别人先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

# 扩展使用

  1. 管理公钥 Gitosis
  2. 管理权限 Gitolite
使用 Hugo 构建
主题 StackJimmy 设计