2018-11-08 Git(⊙﹏⊙)教程

版本控制系统Git

Git的配置GitHub账户

可以为每个存储库设置Git用户名和邮箱,也可以使用全局用户名和邮箱
全局配置:
    打开终端(Windows下为Git Bash)
    git config --global user.name "你的名字"
    git config --global user.email "你的邮箱"
    查看用户名git config --global user.name
    查看邮箱git config --global user.email
为每个存储库设置Git用户名:
    打开终端(Windows下为Git Bash)
    将当前工作目录更改为您想要配置与您的Git提交相关联的名称的本地存储库
    git config user.name "某个存储库的Git用户名"
    git config user.email "某个存储库的Git邮箱"
    查看用户名git config user.name
    查看邮箱git config user.email

2.使用git生成密钥对,(生成过程会让你指定密钥对的存放路径以及提示输入安全密码,按回车默认存放到~/.ssh/,安全密码可为空,直接回车)例如:
ssh-keygen -t rsa -b 4096 -C "nextleaf@outlook.com"


建议使用标准的UTF-8编码(UTF-8 without BOM),避免使用记事本修改项目文件

Git安装

下载地址 https://git-scm.com/downloads

初始化配置,在命令行或Git Bash中配置你的用户名和密码:

git config --global user.name "Your Name"
git config --global user.email "email@example.com"

在 Windows 系统上,如果要在提交时自动地把回车(CR)和换行(LF)转换成换行(LF),而在检出代码时把换行(LF)转换成回车(CR)和换行(LF),用

git config --global core.autocrlf true

来打开此项功能

Git使用

1.创建版本库(.Git)

在项目根目录下【请确保目录名(包括父目录)不包含中文】使用命令

git init

来初始化版本库

2.把文件添加到版本库

2.1把文件(单个或多个,单次或多次)添加到仓库,在工作区(项目目录)下执行命令

git add 命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件

git add file2.txt file3.jsp file3.xml file4.java mysql.properties
/*可以使用参数-f强制添加*/

示例-添加documentation目录及其子目录下所有*.txt文件的内容:

git add documentation/*.txt

把工作区的所有变化提交到暂存区(不包括被删除的文件)

git add . 

2.2把添加的文件提交到仓库,在工作区下执行命令

git commit -m "提交说明说明"

项目文件修改后,也是通过这两个命令提交修改
git status命令可以查看仓库当前的状态,如果git status告诉你有文件被修改过,可用git diff [file]查看修改内容

git log命令查看修改记录,加上--pretty=oneline参数可简化输出。(一长串字符代表提交版本号,HEAD指示当前版本)

3.回退版本

git reset --hard HEAD^      回退到上一个版本
git reset --hard [commit id]    恢复到指定版本

git reflog  查看命令历史纪录,以便恢复到指定版本
git checkout -- file    让file这个文件回到最近一次git commit或git add时的状态
git reset HEAD [file]   可以把暂存区file的修改撤销掉(unstage),重新放回工作区

【场景1】:
当你改乱了工作区某个文件的内容(或误删文件),想直接丢弃工作区的修改时,用命令git checkout -- [file]
【场景2】:
当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD [file],就回到了场景1,第二步按场景1操作。
【场景3】:
已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退,不过前提是没有推送到远程库

4.从版本库中删除文件

删除后只能恢复文件到曾提交的最新版本

git rm test.txt
rm 'test.txt'

5.远程仓库

远程仓库是指托管在因特网或其他网络中的你的项目的版本库。 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。 与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。

6.添加远程库

git remote add origin [address]

7.把分支的所有内容推送到远程库上

头一次推送,使用-u参数:git push -u origin master
以后:git push origin master
master是分支名称

克隆远程库:git clone [address]

8.创建分支

git checkout -b dev dev是分支名,加上-b参数表示创建并切换到,相当于以下两条命令
git branch dev
git checkout dev

git branch命令会列出所有分支,当前分支前面会标一个*号

还可以使用已有标签来创建分支git checkout -b [branchname] [tagname]

切换分支:

git checkout [branchname]

9.合并分支

git merge   命令用于合并指定分支到当前分支:
git merge dev   dev分支的工作成果合并当前分支上

删除分支,参数d为大写时,强制删除:git branch -d [branchname]

10.解决冲突

文件又冲突时,合并会失败并提示冲突文件,git status也可以告诉我们冲突的文件
修改后,再把文件添加和提交

git log --graph命令可以看到分支合并图

通常合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息
强制禁用Fast forward模式,Git会在merge时生成一个新的commit,合并后的历史有分支,能看出来曾经做过合并

git merge --no-ff -m "描述描述" dev
--no-ff参数,表示禁用Fast forward

合并后,可用git log查看分支历史

master分支应当是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;干活都在其他分支上,完善后再--no-ff合并到master上】

11.Bug分支

git stash可以把当前工作现场“储藏”起来,等以后恢复现场(git stash pop)后继续工作

【场景】:dev分支开发到一半,master分支有bug要修复
示例步骤:

git stash 保存现场
git checkout master 切换到master
git checkout -b issue-101 创建并切换bug分支issue-101
修复,提交
git checkout master 切换到master
git merge --no-ff -m "修复bug 101" issue-101 合并到master
删除issue-101分支
git checkout dev 切换到dev分支
git stash list 查看工作现场列表
git stash apply stash@{0} 恢复指定现场,恢复后stash内容并不删除,可以用git stash drop来删除
另一种方式是用git stash pop,恢复的同时把stash内容也删了

12.多人协作

要查看远程库的信息,用git remote
或者用git remote -v显示更详细的信息(如果没有推送权限,就看不到push的地址)

12.1抓取分支(git pull)

在本地创建和远程分支对应的分支:

git checkout -b dev origin/dev

建立本地分支和远程分支的关联:

git branch --set-upstream-to=origin/[branchname] [branchname]

把分支推送到远程:

git push origin dev

推送出现冲突时,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送

如果git pull也失败了,需要定本地dev分支与远程origin/dev分支的链接(关联),

git branch --set-upstream-to=origin/dev dev

git pull,此时若出现合并冲突,需要手动解决,解决后,提交,再push

【多人协作的工作模式通常是这样的】:

首先,可以试图用git push origin branch-name推送自己的修改;
如果推送失败,则可能因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin [branch-name]推送就能成功!
如果git pull提示'no tracking information...',则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to [branchname] origin/[branchname]

13.Rebase

Rebase只对尚未推送的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作】

git log --graph --pretty=oneline --abbrev-commit    查看分支合并图
git rebase                      把分叉的提交历史“整理”成一条直线,看上去更直观
git push origin branch-name     把本地分支推送到远程
git log --graph --pretty=oneline --abbrev-commit

14.标签管理

Git 使用两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated)
一个轻量标签很像一个不会改变的分支(分支可以移动,标签不能移动),它只是一个特定提交的引用(指向某个commit的指针);而附注标签是存储在 Git 数据库中的一个完整对象。 它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与验证。

发布一个版本时,通常先在版本库中打一个标签(tag),将来取某个标签的版本,就是把那个打标签的时刻的历史版本取出来

14.1列出标签(以字母顺序列出标签)

git tag

14.2创建标签

首先,切换到需要打标签的分支上(git checkout [branchname])。
创建一个附注标签最简单的方式是当你在运行 tag 命令时指定 -a 选项

git tag -a v1.4 -m 'my version 1.4'

-m 选项指定了一条将会存储在标签中的信息
使用 git show [tag]命令可以看到标签信息与对应的提交信息

轻量标签,只需要提供标签名字:

git tag [tag-name]

对过去的提交打标签

git log --pretty=oneline --abbrev-commit
git tag -a v1.2 [commit-id]

14.3删除标签

git tag -d [tagname]

如果远程仓库也有要删除:先删除本地,再

git push origin :refs/tags/[tagname]

14.4共享标签

默认情况下,git push 命令并不会传送标签到远程仓库服务器上
需要显式地推送(某个)标签:

git push origin [tagname]

把所有不在远程仓库服务器上的标签全部传送到那里:

git push origin --tags      

在特定的标签上创建一个新分支:

git checkout -b [branchname] [tagname]

15.第三方托管

15.1使用GitHub

(先注册并登录一个GitHub账号)
在GitHub上,可以任意Fork开源仓库;
自己拥有Fork后的仓库的读写权限;
可将Fork后的仓库clone到本地;
本地修改后往自己的仓库推送;
在GitHub上,可以推送pull request给官方仓库来贡献代码。

github添加-新建-SSH key
1.使用git或GitHub Desktop生成密钥对,
例如:

ssh-keygen -t rsa -b 4096 -C "nextleaf@outlook.com"

2.访问https://github.com/settings/keys,点击右上角new SSH key按钮
3.取个名字,名字一般是生成密钥对时填写的邮件地址,粘贴公钥内容,比如id_rsa.pub的。
4.点击add SSH key按钮。

15.2使用码云

国内使用GitHub时,经常会访问速度慢,码云则没有这个问题。
码云添加SSH key步骤与github添加的步骤类似

git remote -v 查看远程库信息(查看是否已关联远程库)

删除已有的GitHub远程库:

git remote rm origin

再关联码云的远程库(注意路径中需要填写正确的用户名):

git remote add origin [url]

也可以既关联GitHub,又关联码云:
先删除已关联的名为origin的远程库:

git remote rm origin

关联GitHub的远程库:

git remote add github [url]

再关联码云的远程库:

git remote add gitee [url]

git remote -v查看远程库信息,可以看到两个远程库

如果要推送到GitHub,使用命令:

git push github master

如果要推送到码云,使用命令:

git push gitee master

16.忽略特殊文件

在工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件
如:

# Compiled class file
*.class

# Log file
*.log

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# Windows
Thumbs.db
ehthumbs.db
Desktop.ini

GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表,你可以在 https://github.com/github/gitignore 找到它.

17.配置命令别名

参见这里


以上Git教程摘自廖雪峰的官方网站 https://www.liaoxuefeng.com/
若发现教程有误,可参考Git官方在线文档 https://git-scm.com/book/zh/v2

另一个教程易百教程

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

推荐阅读更多精彩内容

  • Git常用语法 [TOC] Git简介 描述 ​ Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,...
    君惜丶阅读 3,504评论 0 13
  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,649评论 9 163
  • 云过西山寒日牧,秋风凉水冷池鱼。 旧斋荒院无新主,枯草石阶满目居。 作者王永豪(注:新韵)
    王永豪阅读 343评论 0 1
  • 图文/幸福 对明代心学的探究,到李贽这时,我不知道为什么,有学术领域中的空白。哲学不是我主修的课程,文史只要求学生...
    有点个性阅读 565评论 0 0
  • 在说IPFS之前我们先来说一下HTTP是什么便于我们理解IPFS。 HTTP是一个伟大的发明。维基百科解释为:超文...
    请叫我小宋阅读 2,548评论 0 2