[Git 使用] Git学习手册

文档标识:[C-180108-M-20200106]
知识来源:廖雪峰 Git教程
内容链接均来源于互联网,如有侵权,请联系删除。

创建git 用户

  • 设置用户名称
git config --global user.name "Name"
  • 设置用户邮箱
git config --global user.email "[email protected]"

创建git 仓库

  • 创建文件夹
mkdir folder
  • 初始化仓库
git init

添加文件至仓库

  • 添加文件至暂存区(stage)
git add files
  • 提交修改至版本库
git commit -m "it's a example"
  • 已跟踪文件跳过暂存直接提交修改
git commit -a -m "ignore submit stage"

版本回退与文件比对

  • 查看仓库状态
git status
  • 查看工作区与暂存区之间的修改内容
git diff
  • 查看暂存区与版本库之间的修改内容
git diff -cached
  • 查看工作区与版本库之间的修改内容
git diff HEAD
  • 查看提交详细日志
git log
  • 回退至以前的版本
git reset --hard HEAD^

-- HEAD 表示最新版本
-- ^ 表示上一个版本,可多次叠加
-- HEAD~10 表示最新版本往上10个版本

git reset --hard commit id

-- 可以回到指定的commit id 的版本

  • 查看版本提交或回退的日志
git reflog
  • 撤销对文件做的修改
git checkout --file
  • 撤销已经提交到暂存区的文件
git reset HEAD file
  • 提交一个删除文件到暂存区
git rm file
  • 已暂存的文件使用强制删除
git rm -f file
  • 将文件添加到忽略文件中
git rm --cached file

远程仓库

  • 创建SSH密钥
ssh-keygen -t rsa -C "[email protected]"
  • 登录GitHub后把生成的公钥添加到账户设置
  • 在本地添加与远程仓库的关联
git remote add origin [email protected]:****/LearnGit.git

origin 表示远程仓库的名称
git@... 表示远程仓库的地址

  • 添加关联后,将本地仓库推送至远程仓库
git push -u origin master

首次连接提示警告信息,确认指纹信息是否来自GitHub.com

The authenticity of host 'github.com (192.*.*.*)' can't be established.
RSA key fingerprint is SHA256:nThbg6*****WGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)?

  • 本地仓库修改后,直接推送
git push origin master
  • 从远程仓库复制(下载)一份完整项目
mkdir clonedemo
cd clonedemo
git clone [email protected]:****/LearnGit.git

这样在clonedemo文件夹下生成了 LearnGit 的完整项目文件

仓库分支

  • 创建和合并分支
git branch dev
  • 创建dev的分支
git checkout dev
  • 切换到dev分支
git checkout -b dev
  • 创建并切换到dev分支
git branch

可查看当前所有分支,当前分支为带*的

  • 合并分支
git merge dev

把dev 分支合并到当前分支

  • 删除分支
git brach -d dev

删除dev 分支

当分支没有被合并时,需要强制删除

git branch -D dev
  • 冲突解决
    在执行git merge时会出现CONFLICT的警告,当master 分支需要合并其他分支时,需要解决冲突后才可以合并,无切换至冲突的分支。

  • 分支管理策略
    通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
    如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

git merge --no-ff -m "merge with no-ff" dev

Bug分支

当分支工作未提交,需要暂时保存已暂存的文件,不影响其他分支的操作。

  • 隐藏当前工作
git stash

可以将已经暂存的文件隐藏起来。
当文件已修改,未暂存则无法使用stash不能隐藏。如果不使用stash,那么已修改的文件会影响其他分支的操作。

  • 恢复已隐藏的工作

查看已保存的stash列表

git stash list

选择需要恢复的工作

git stash apply stash@{0}

多人协作

  • 查看远程库信息
git remote

或者

git remote -v

显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。

  • 推送分支
git push origin master

并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要?

  1. master分支是主分支,因此要时刻与远程同步;
  2. dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
  3. bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
  • 抓取分支

当多人协作时,对同一分支的推送产生冲突,需要先解决冲突。使用以下命令获取远程仓库的数据:

git pull

多人协作的工作模式通常是这样:
首先,可以试图用git push origin branch-name推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name

分支管理

Git的标签本质是版本库的快照,与分支一样,但是分支可以进行移动,标签创建后无法移动,为了代替版本的commit号码,方便记忆。

  • 创建标签

快速创建标签

git tag name

显示所有标签,标签按字母顺序进行排序。

git tag

一般标签的创建默认是在最新的版本,当需要补创建标签则需要把版本commit号码加上,可使用git log --oneline查看,例如:

git tag v1.0 332a1d3
  • 查看标签的详细信息
git show v1.0
  • 创建带说明的标签
git tag -a v1.1 -m "version 1.0" 24d123f
  • 创建带有私钥签名的标签,签名采用PGP签名
git tag -s v1.1 -m "version 1.0" 24d123f
  • 删除标签
git tag -d v1.0
  • 远程推送某个标签到远程仓库
git push origin v1.0
  • 远程推送所有标签到远程仓库
git push origin --tags
  • 远程删除标签,需要先删除本地标签后,在执行以下命令:
git push origin:refs/tags/v1.0

删除后显示如下:

To github.com:****/LearnGit.git
 - [deleted]         v1.0

注意:这里的标签一般指的就是版本,在github上的可以看到标签被放在releases一般。

自定义git

  • 忽略不需要提交的文件

在git工作区下面创建.gitignore文件,把需要忽略的文件名填入。
忽略文件的原则是:
忽略操作系统自动生成的文件,比如缩略图等;
忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

在github上有适合各类语言环境的gitignore文件,可以下载使用:

https://github.com/github/gitignore

例如python工作环境下的配置:

# Byte-compiled / optimized / DLL files 
__pycache__/ 
*.py[cod] 
*$py.class 

# C extensions 
*.so 

# Distribution / packaging 
.Python 
build/ 
develop-eggs/ 
dist/ 
...

#符号开头的为注释,可以在文件内填入文件夹或指定后缀的文件名。

如果在忽略文件内的文件,使用git add命令添加,那么会提示文件被忽略不被提交。如果确实需要添加,则需要使用以下命令:

git add -f file

检查某类文件是否在忽略文件内,则可以使用以下命令检查:

git check-ignore -v file
  • 配置别名
git config --global alias.st status

这样使用git st就可以代替git status 使用。
当使用git config时,加了--global指的是对当前所有仓库生效,如果不加则对当前仓库生效。

  • 查看仓库配置
cat .git/config

当前用户的Git配置放在用户主目录的隐藏文件.gitconfig文件内,windows系统下放在用户目录(“文档” 文件夹的上一级)里。

搭建git服务器

第一步,安装git:

sudo apt-get install git

第二步,创建一个git用户,用来运行git服务:

sudo adduser git

第三步,创建证书登录:
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。

第四步,初始化Git仓库:
先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:

sudo git init --bare sample.git

Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:

sudo chown -R git:git sample.git

第五步,禁用shell登录:
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

git:x:1001:1001:,,,:/home/git:/bin/bash

改为:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

第六步,克隆远程仓库:
现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:

git clone git@server:/srv/sample.git

Cloning into 'sample'...
warning: You appear to have cloned an empty repository.

你可能感兴趣的:([Git 使用] Git学习手册)