Learn「.git」

You shall eat the fruit of the labor of your hands; you shall be blessed, and it shall be well with you.

在确定好了要学习使用git以及GitHub之后,我制定了如下的学习步骤:

  1. 学习< learn python the hard way > command line 教程
  2. 阅读git官方文档,观看官方视频介绍
  3. 学习廖雪峰的git教程,将教程里面的代码逐行逐字在git bash中敲出来

以下笔记来源于廖雪峰的教程

Introduction

git - 版本控制工具 - version control

注意:版本控制,只针对文本文件(.txt)格式,图片,视频等二进制的不可以,word也是二进制,也不行

注意:windows下的记事本不能用,要用Notepad++

安装git bash后,输入如下两行配置用户名以及邮箱

git config --global user.name "your name"
git config --global user.email "your email"

注意:git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址

创建版本库

版本库:Repository

选择一个directory,创建一个空目录作为git仓库

eg:

mkdir learngit
cd learngit
git init:将这个文件夹变为git仓库

添加文件到git 仓库

分两步:

git add readme.txt
git commit -m"description"

  1. git add可以多次添加不同的文件到暂存区(stage)
  2. git commit可以把所有暂存区内的多个文件一次性全部提交

不同版本间的切换

cat readme.txt用来将文件内容显示出来

git status用来得知当前工作区(working directory)的状态

git diff readme.txt查看修改的内容

注意: git diff要用在git add readme.txt之前

git log:显示从最近到最远的(commit)命令历史

如果嫌显示的太多了

可以用git log --pretty=oneline就只会显示一行commit id

版本回退

  • 退回上一版本
    • git reset --hard HEAD^
  • 退回上上本版
    • git reset --hard HEAD^^
  • 退回100个版本之前
    • git reset --hard HEAD~100

HEAD相当于一个指针,指向当前版本

git reset --hard commit_id 在历史版本之间穿梭

commit id使用前几位即可

git log用来查看提交历史
git reflog查看历史版本信息

reflog命令

工作区与暂存区

工作区与暂存区

所以

git add相当于:把文件修改添加到暂存区stage
git commit相当于:把暂存区内所有的内容提交到当前分支(master)

简言之:需要提交的文件放在stage,然后用commit一次性全部提交stage的所有修改

管理修改

git是用来管理修改,不是管理文件的

所以

如果不add到stage,就不会被commit到master分支

git diff HEAD -- readme.txt:查看commit后,working dict和版本库里面最新的版本之间的区别

git diff HEAD --

git diff是将working directory 与stage比较
git diff --cache是将stage与master分支比较


补充:vi命令(直接在bash里创建一个txt并写入内容)的使用

  1. vi进入界面
  2. i 进入插入模式
  3. 写入内容
  4. esc 退出插入模式,进入命令模式
  5. :w a.txt 创建 a.txt并将写入的内容存放在a.txt内
  6. :wq保存并离开vi
  7. q!强行退出vi

撤销修改

1). git checkout -- readme.txt ( -- 很重要)

可以应对如下两种情景

  • 如果在working directory 修改了readme.txt,但是还没有add到暂存区,那么就撤销至和版本库一样的状态
  • 如果在add到暂存区后修改了readme.txt,但是还没有commit,那么就撤销至刚刚add到暂存区的状态

2).如果修改了readme.txt并且add到了暂存区,那么用git reset HEAD readme.txt把暂存区里的重新放回到工作区,然后再使用git checkout -- readme.txt

3).如果commit了,但是同时commit的还有很多其他文件,那么使用git reset HEAD^把readme.txt放回暂存区,然后再提交或到工作区修改

删除文件

commit了文件test.txt之后,如果在工作区删除了test.txt

可以用git rm test.txt将版本库里的也删了

或者

git checkout test.txt撤销删除

远程仓库

github是一个为git提供远程托管服务的服务器

通过SSH来加密

ssh-keygen -t rsa -C"your email"

然后一直回车

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能公开,id_rsa.pub是公钥,可以公开

然后在github里 找setting - SSH Keys 把id_rsa.pub的内容黏贴进去。

GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。

添加远程仓库

可以将本地的git仓库和远程github里的仓库同步,将本地的文件推送到远程

先在github里创建一个new repo 比如叫做learngit

注意:创建repository的时候不勾选Initialize this with a README ...

然后 在本地learngit 路径下,运行如下命令 建立 本地 < ---- >远程仓库之间的联系

输入:git remote add origin git@server-name:path/repo-name.git
例如:git remote add origin git@github.com:fitzwong666/learngit.git
origin是git默认的远程仓库的叫法

将本地库的内容推送到远程用

git push -u origin master命令,实际上是把当前分支master推送到远程

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送时就可以直接用

git push origin master推送最新修改

从远程仓库克隆

要从远程仓库克隆,要先知道地址,然后用git clone进行克隆

eg:

git clone git@github.com/fitzwong666/gitskills.git

git支持https,但是通过ssh支持的原生git 协议最快

创建与合并分支

master是主分支,大家都不要在上面直接动工,最好分支到自己的branch工作

HEAD指向当前分支

创建new分支,并切换到new分支

git checkout -b new

这个命令相当于两个命令合在一起,第一步git branch new,然后git checkout new

使用git branch可查看当前分支,在当前所在的分支前会显示*

在new分支上做完修改后,add ->commit

然后用git checkout master切回master主分支

在当前分支上用git merge new将new分支合并到当前分支

然后git branch -d new删除new分支

总结

  • 查看分支:git branch
  • 创建分支:git branch <branch name>
  • 切换分支:git checkout<branch name>
  • 创建 + 切换分支:git checkout -b <branch name>
  • 合并某分支到当前分支:git merge <branch name>
  • 删除分支:git branch d<branch name>
  • 删除远程分支:git push origin : <branch name>注意:branch name前的空格不能少

解决冲突

在branch上改了并add commit
在master上改了并add commit
由于在这两个节点上都改了文件
所以
这时
merge会产生conflict,需要手动解决冲突(通常是删一个)后再add ——> commit
git log --graph 可以看到分支合并图
(git log --graph --pretty=oneline --abbrev-commit)显示缩略图

补1:
git log的各种变体:

补2:
有个文件夹A,在A中添加a.txt
git add A/*可以把文件夹和里面的文件批量提交,不用一个一个上传

补3:

  • git add -A (stages All)
  • git add . (stages new and modified, without deleted)
  • git add -u (stages modified and deleted, without new)

分支管理策略

Master分支是用来发布新版本,平时不在上面干活,主要在A上,每个人都有自己的分支,然后在A上合并

Bug分支

git stash弹到一个地方去处理bug

要在哪个分支(A)上修复bug,那么就在该分支上创建一个新分支来临时修复Bug

git checkout -b issue-01

修复后add -> commit

然后切回A分支,

并合并git merge --no-ff m"description" issue-01

修复完成

然后用git stash list看看自己在哪里,

  • git stash pop删除
    • 这一步也可以分为两步
      • git stash apply先恢复
      • 然后 git stash drop删除

多人协作

查看远程信息用 git remote -v

本地新建的分支如果不push到远程,对他人不可见的

从本地推送分支的方法:git push origin branch-name

若推送失败,是因为远程分支比本地分支更新一点,先解决冲突(通常是删一下)

要用git pull抓取远程的提交,在本地合并

如果被git bash提示说「no tracking information」

  • 若Pull失败,是因为没有设置本地分支a与远程origin/a的链接;需要先建立本地分支和远程分支的关联
    git branch --set-upstream branch-name origin/branch-name

在本地创建和远程分支对应的分支,用git checkout -b branch-name origin/branch-name

标签管理

tag打在版本库中,和commit是联系在一起的
先切换到需要打标签的分支上,然后git tag<name>便可以新打一个标签
git tag可以查看所有的标签
一般打标签都是打在最新的commit上,如果忘了打的话,可以用git log --pretty=oneline --abbrev-commit查到commit-id之后用git tag vo.9 123456,然后用git tag查看标签
git show<tag_name>查看标签信息

git tag -a<tag_name> -m "abcdef..."可以创建带有说明的tag

删除标签 git tag -d vo.1

因为创建的标签在本地,不会上传到远程

推送tag到远程 git push origin <tag_name>
一次性全部推送标签git push origin --tags

删除远程标签

  • 第一步:git tag -d<tag_name>
  • 第二步:git push origin : refs/tags/<tag_name>

常见问题整理:

  1. 遇到符号说明没有输完 ctrl + d
  2. 几种git add
  • git add a.txt 匹配到a.txt
  • git add *.txt 匹配到当前目录下所有txt
  • git add A/*.txt 匹配到当前目录和子目录下所有txt
  • git add . 匹配到当前目录下所有文件
  1. 添加folder到repository
  • git add <folder_name>
  • git add folder_name/*
  • git commit
  • git push
  1. 删除repo中文件而不删除本地的
  • remove folder/directory only from git repo and not from local
    • step 1: git rm -r --cached <file or folder name>
    • step 2: git commit -m"removed folder from repo"
    • step 3: git push origin <your git branch>
  • remove folder/directory from repo & local
    • step 1: git rm -r <one of the directories>
    • step 2: git commit -m"removed folder from repo"
    • step 3: git push origin <your git branch>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • 1.git的安装 1.1 在Windows上安装Git msysgit是Windows版的Git,从https:/...
    落魂灬阅读 12,654评论 4 54
  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,645评论 9 163
  • 入学安排宿舍时,我们核物理专业有两个班,落单的就安排到厕所对面的336室,正好心理系也有一人落单,也并到这间宿舍。...
    春水流阅读 4,248评论 2 6
  • 操作简便,有效。 根据自己的系统下载对应版本) 选择 custom (自定义安装),一路下一步,直到完成,为了方便...
    梁相辉阅读 1,233评论 0 2
  • 练习了这么久,还是不知道如何在一个群里聊天,觉得不好,但也不知如何改变,还是不要想,不要变,做那个无欲无求得自己就...
    随心YI阅读 135评论 0 0