[Git 使用] Git学习手册

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

创建git 用户

  • 设置用户名称
git config --global user.name "Name"
  • 设置用户邮箱
git config --global user.email "email@example.com"

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

推荐阅读更多精彩内容

  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,853评论 5 147
  • Git 命令行学习笔记 Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来...
    sunnyghx阅读 3,902评论 0 11
  • Git常用语法 [TOC] Git简介 描述 ​ Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,...
    君惜丶阅读 3,493评论 0 13
  • 时光飞逝,转眼间已经进入2017年。想起4年前刚刚踏入大学校园,觉得毕业还那么遥远,有很多时间可以挥霍,能...
    无远行至阅读 275评论 0 0
  • 抑郁 一条虫子爬了进来 平静 迟缓 默不作声的崩溃 挣扎在死亡边缘 它啃了一嘴 死灰
    却悔阅读 146评论 3 2