Git 学习笔记汇总

Git 学习笔记 --- 安装和基本配置


基本资料

GitHub地址

https://github.com/

感谢 廖雪峰同学写的博客,帮助我更好的学习GitHub。
廖雪峰博客地址

http://www.liaoxuefeng.com

廖雪峰GitHub教程地址

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

注: 该笔记是给我自己用的,以便自己能够快速浏览,帮助自己更快的学会GitHub。
如果要学习的话,推荐移步廖雪峰的博客来学习!


安装Git

检测 GitHub 是否被安装(查询版本)

git --version

CentOS 下安装

yum install git

Ubuntu 安装

sudo apt-get install git

配置用户名和邮件(全局)

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

SSH Key的配置

切换到用户根目录 看看有没有.ssh 目录

cd
ls -a
cd .ssh
ls

这个目录下应该包含两个文件
id_rsa和id_rsa.pub两个文件, 这两个就是SSH Key的秘钥对。
id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

如果没有则 生成
生成命令
ssh-keygen -t rsa -C "你的邮箱地址"

生成过程

# 输入命令 
[root@www ~]# ssh-keygen -t rsa -C "812069449@qq.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 

# 输入密码 可留空 
Enter passphrase (empty for no passphrase): 

# 再次输入密码
Enter same passphrase again: 

# 文件生成后的路径 
# 私钥路径
Your identification has been saved in /root/.ssh/id_rsa.
# 公钥路径
Your public key has been saved in /root/.ssh/id_rsa.pub.

将生成的密钥 配置到远端服务器

**读公钥内容 **

cat ~/.ssh/id_rsa.pub

在浏览器打开 GitHub 并配置值

网址:https://github.com/settings/keys

这里写图片描述

测试ssh key是否成功

ssh -T git@github.com

*** 安装和基本配置 笔记内容结束 ***


Git 学习笔记 --- 工作区 和 暂存区


创建一个仓库


首先登录GitHub并进入主页

网址:https://github.com/

首页

创建仓库

这里写图片描述

这里写图片描述

关联仓库到本地

首先本地需要创建一个文件夹用来存储

mkdir test

初始化Git 环境

cd test
git init

克隆远程环境

git clone https://github.com/xiaomochen/test.git

关联远程环境

git remote add origin git@github.com:xiaomochen/test.git

查看远程仓库信息

查看基本信息
git remote

查看详细信息
git remote -v

新文件提交

添加一个文件到暂存区

git add readme.txt

将暂存区的操作 提交到当前分支

git commit -m '这里是描述'

查看当前 仓库的状态信息

git status

新文件提交实例

新增一个文件
touch new.html

向文件填写内容
echo "this is new file" > new.html

将文件提交到暂存区(实际上就是做个记录)
git add new.html

提交这个版本
git commit -m '我提交了一个文件'

第一次 提交的时候 带上 -u 参数 以关联分支
git push -u origin master

版本撤回

查看版本历史信息

git log

格式化显示 (一行一行的显示)
git log --pretty=oneline

查看所有的版本历史信息 包括未来的
如果你退回了某个版本后 想要返回到 最新的版本就要用到这个命令

git reflog

重置到某个版本

git reset -- hard 版本编号

重置到上一个版本
HEAD 表示的是 最新的版本
HEAD^ 表示的是 上一个版本
HEAD^^ 表示的是 上面的第二个版本 ^的个数就是 版本的个数
HEAD~100 表示的是 前第100个版本

git reset --hard HEAD^

冲突处理

同步线上的数据到本地

git pull

查看两个版本的 数据差别

git diff

查看工作区和版本库里面最新版本的区别

git diff HEAD -- readme.txt

实例场景:

猴子A 修改了test.html 文件提交后,
正好猴子B 也在修改这个文件,
猴子B 提交的时候GitHub会返回一个错误信息


这里写图片描述

大致的意思是:
  更新被拒绝,因为远程版本库包含您本地尚不存在的提交。这可能是另外一个版本库已经推送了相同的引用。再次推送前,您可能需要先合并远程变更。

PS: git 并不会像 SVN 那样自动合并内容,如果有冲突,只能通过手工自己修改

解决流程解析

  1. 首先需要把远程的数据的拉下来
  2. 然后手动修改文件,选择需要保留的数据
  3. 提交最新的代码

解决冲突实例

先更新文档
git pull

查看冲突
git diff

编辑文件并保存
vim 冲突的文件

提交修改
git add 冲突的文件

合并到当前分支
git commit -m '新增了 xxx 功能'

提交到远程
git push

撤销修改

git checkout -- readme.txt

注意中间是两个 -

命令 git checkout -- readme.txt 意思就是,把readme.txt文件在工作区的修改全部撤销。
这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

删除文件

删除本地文件

rm -rf test

删除库中的文件

git rm test.txt

实例

删除本地文件
rm -rf test

删除库中的文件
git rm test.txt

提交删除操作
git commit -m "remove test.txt"

如果是删错了 版本库里还有的话 可以恢复

git checkout -- test.txt

用reset 也可以达到同样的目的 HEAD 表示库中的最新版本

git reset HEAD test.txt

*** 工作区 和 暂存区 笔记内容结束 ***

Git 学习笔记 --- 分支管理


查看本地分支

git branch


查看所有分支 包括线上的

git branch -a


根据当前分支 创建新分支

git branch [name]
git branch dev


根据当前分支 创建并切换分支

git checkout -b [name]
git checkout -b dev


指定基础分支 创建新分支

git checkout -b 新分支名 基础分支名

本地的
git checkout -b feature-x develop

线上的
git checkout -b feature-x origin/develop


关联线上的分支

git branch --set-upstream 本地分支名 线上分支名

git branch --set-upstream dev origin/dev


切换分支

git checkout [name]

git checkout dev


将新分支推送到远程

git push origin test


删除分支
注意删除的分支不能是 当前正在使用的分支

git branch -d [要删除的分支名]

git branch -d dev


删除远程分支
将一个空分支 push 到线上的 xxx 分支 相当于删除

git push origin :branch-name


强制删除分支
如果这个分支中还有 未提交的数据 那么 删除该分支的时候是拒绝的
提示用以下命令 强制删除

git branch -D feature-vulcan


合并分支

git merge [要合并的分支名]

快进模式
git merge dev

普通模式
git merge --no-ff dev -m '合并了一个分支'


分支模式

no-ff指的是强行关闭fast-forward方式。

fast-forward方式就是当条件允许的时候,git直接把HEAD指针指向合并分支的头,完成合并。属于“快进方式”,不过这种情况如果删除分支,则会丢失分支信息。因为在这个过程中没有创建commit

git merge --squash 是用来把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,于是使用--squash进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。需要进行一次额外的commit来“总结”一下,然后完成最终的合并。

图示:

图示

图示

分支模式小结:
--no-ff:不使用fast-forward方式合并,保留分支的commit历史
--squash:使用squash方式合并,把多次分支commit历史压缩为一次


Git分支管理策略

移步 http://www.ruanyifeng.com/blog/2012/07/git.html 有详细介绍

分支管理策略小结:

分支名 作用 临时分支?
master 对外发布的正式分支 否 线上的主要分支
develop 开发分支 否 线上本地都可以有
feature 功能分支 是临时分支 用完即删
release 预发布分支 是临时分支 用完即删
fixbug 修补bug分支 是临时分支 用完即删

stash 功能

保存当前工作区

git stash


显示 已经保存过的 工作区列表

git stash list


恢复 已经保存的工作区

git stash apply


删除 已经保存的工作区

git stash drop


恢复并删除 已经保存的工作区

git stash pop


使用场景

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

*** 分支管理 笔记内容结束 ***


Git 学习笔记 --- 标签管理


查看标签列表

git tag


给当前分支 打上一个 标签
默认标签是打在最新提交的commit上的。

git tag [标签名称]


给指定的commit id 打上一个标签

git tag [标签名] [commit id]

git tag v0.9 6224937


还可以创建带有说明的标签

git tag -a [名称] -m [描述] [commit id]

git tag -a v0.1 -m "version 0.1 released" 3628164


查看指定标签的信息

git show [标签名]

git show v0.9


删除标签

git tag -d [标签名]

git tag -d v0.9


推送标签到远程仓库

git push origin [标签名]、

git push origin v.1.0


一次性推送 全部尚未推送到远程的本地标签

git push origin --tags


删除远程 标签

git push origin [标签路径]

git push origin :refs/tags/v0.9

*** 标签管理 笔记内容结束 ***


Git 学习笔记 --- 自定义Git


GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。
所有配置文件可以直接在线浏览:https://github.com/github/gitignore


忽略特殊文件

主要编辑 工作区根目录下的 .gitignore 文件

忽略文件的原则是:

  • 忽略操作系统自动生成的文件,比如缩略图等;

  • 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;

  • 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。


创建 .gitignore 文件

touch .gitignore


编辑完成后 要提交到 远程

git add .gitignore
git commit -m '提交配置文件'
git push


.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!


**如果添加不上 很有可能是因为.gitignore 的配置 而被忽略 **
如果你确实想添加该文件 则需要在 add 后面 加个 -f 参数

git add -f .gitignore

或者你发现,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查:

git check-ignore -v App.class

忽略特殊文件 小结

  • 忽略某些文件时,需要编写.gitignore;

  • .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!


配置别名

新增别名

例: 配置一个st 的命令 来代替 status

git config --global alias.[名称] [对应的命令]

git config --global alias.st status

当然还有别的命令可以简写,很多人都用co表示checkout,ci表示commit,br表示branch:

git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch

以后提交就可以这么写

git ci -m "bala bala bala..."

除了 直接指定命令 后面可以跟个 命令组成的 字符串

例如 撤销修改

之前的

git reset HEAD file

配置命令

git config --global alias.unstage 'reset HEAD'

配置命令之后的

git unstage test.html

实际执行的是
git reset HEAD test.html

配置一个git last,让其显示最后一次提交信息:

git config --global alias.last 'log -1'

配置一个lg, 让其显示分支日志

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 的效果

这里写图片描述

配置文件

配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。

配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中:

    $ cat .git/config 
    [core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = true
    [remote "origin"]
        url = git@github.com:michaelliao/learngit.git
        fetch = +refs/heads/*:refs/remotes/origin/*
    [branch "master"]
        remote = origin
        merge = refs/heads/master
    [alias]
        last = log -1

别名的配置就是放在 alias 下, 可以直接编辑。

而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig

$ cat .gitconfig
[alias]
    co = checkout
    ci = commit
    br = branch
    st = status
[user]
    name = Your Name
    email = your@email.com

配置小结

仓库的配置文件路径

.git/config


个人的配置文件路径

用户主目录/.gitconfig


忽略文件的 配置文件的路径
    项目根目录下的 .gitignore
    该配置修改后 也可以做版本管理


配置别名

git config --global alias.[别名] [命令 或者 命令字符串]

*** 自定义Git 笔记内容结束 ***


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

推荐阅读更多精彩内容