git入门教程(超全!超详细!)

如有任何地方须要修该,请及时联系,菜鸟一枚,多多指教。html

一、git安装

git几乎全部的平台均可以安装,安装教程。
在Linux下安装git
输入git,查看系统是否存在git,若没有安装,它会提示你如何作。git

$ git
The program 'git' is currently not installed. You can install it by typing: sudo apt-get install git

若是是其余Linux版本,能够直接经过源码安装。先从Git官网下载源码,而后解压,依次输入:./config,make,sudo make install这几个命令安装就行了。编程

在windows下安装git
直接官网下载安装vim

二、配置

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

注意git config命令的--global参数,用了这个参数,表示你这台机器上全部的Git仓库都会使用这个配置,固然也能够对某个仓库指定不一样的用户名和Email地址。windows

题外话:我第一次安装的时候忘记user.name和user.email了,它也是命令的一部分。
插一个须要注意的地方:
在提交代码git add以前,须要先git status一下,看哪些须要提交,对于一个无用的文件好比说untracked文件,能够用git clean删除。
一样切换分支的时候也须要先git status一下,而后根据它的提示来作就ok了。安全

三、建立版本库

版本库:
官方说法:这个目录里面的全部文件均可以被Git管理起来,每一个文件的修改、删除,Git都能跟踪,以便任什么时候刻均可以追踪历史,或者在未来某个时刻能够“还原”。服务器

其实简单说就是管理代码的仓库,你全部的操做都在里面。app

步骤:
(windows)首先选择好你要将代码放在哪里。
切换分支ssh

通常公司中的许多人在开发同一个项目,须要在master分支下切一个dev子分支,每一个人也能够切换本身的一个子分支,在开发完成后,在merge到主分支。ide

经常使用命令:

git branch #查看当前分支
git checkout -b dev #建立并切换子分支,dev可换成本身的分支名字
git checkout dev #切换分支
git branch dev #建立分支
git branch -d dev #删除分支
git merge 分支名 #合并某分支到当前分支
git checkout -b dev origin/dev #建立远程origin的dev分支到本地
注意:Linux服务器下,在本地建好分支后,将要本地分支推送到远程服务上,使得远程也存在该分支:git pull origin 本地分支:远程分支
git remote add origin git@server-name:path/repo-name.git #将本地分支和远程相关联

mkdir+目录名 #新建版本库
touch+文件名 #新建文件(新建文件有两种方式:
一、 touch+文件名,直接新建一个文件
二、 vi+文件名,新建一个文件并进入编辑状态(若是文件已存在,则直接进入编辑状态))
cd+目录名 #进入目录
pwd #显示当前所在目录的路径
git init #初始化仓库(把这个目录变成Git能够管理的仓库)

提示:
(1)若是你没有看到.git目录,那是由于这个目录默认是隐藏的,用ls -ah命令就能够看见。
(2)git init后目录里面会多一个.git 文件,没事千万不要手动修改里面的东西!!!!
(3)千万不要使用Windows自带的记事本编辑任何文本文件。

四、编写代码

编写代码的方式有两种,一是你能够本身新建文件,二是克隆公司其余前辈的代码,在此基础上进行修改。

编写代码以前还须要生成并配置SSH-KEY(这个东东是将本地的工做区中的分支和远程的分支进行关联的)

#生成密钥,一路回车、用默认选项
ssh-keygen -t rsa
#在本地(个人电脑或者计算机)中找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件(id_rsa是私钥,id_rsa.pub是公钥),将id_rsa.pub文件中的内容 复制到粘贴板
cat ~/.ssh/id_rsa.pub | clip # Windows
cat ~/.ssh/id_rsa.pub | pbcopy # MacOS

注意:粘贴的必定是.pub文件,里面的是公钥,另外一个文件不能随便透露,里面是私钥。

克隆代码
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,而且,远程仓库的默认名称是origin。

git clone 代码库地址

经常使用命令:
git remote #查看远程库信息
git remote -v #显示更详细信息
编写代码

若是使用的是Linux服务器的话,用vim打开该文件。

vim 文件名或者vi 文件名 #打开文件
:wq #保存退出

注意:强制退出能够在后面加一个“!”,若对文件无任何修改能够直接用“:q”进行突出

编写完成提交代码:
按如下步骤来就OK:

git status #查看版本库中修改的文件,须要提交的文件,肯定要添加到暂存区的文件。
git add 修改的文件名 #将要提交的文件首先提交到暂存区
git status #查看版本库的状态
git commit -m "提交的说明" #编写提交的说明便于之后查找
git log #查看提交记录
git push origin 本地分支:远程分支 #Linux服务器下将本地分支推送到远程。(咱们须要code review,因此是 git push origin 本地分支:refs/for/远程分支)

注意:推送的时候,可能会出错冲突,那也咩关系,解决就是了!

解决办法:
  git status查看冲突的文件(注意:Git用<<<<<<<(服务中的代码),=======,>>>>>>>(本地中的代码)标记出不一样分支的内容,这种表示冲突。)
  在本地合并,解决冲突,再推送:git pull --->本地解决冲突--->git commit--->git push origin 分支名
  注意:若是git pull提示no tracking information,则说明本地分支和远程分支的

连接关系没有建立,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。

若是咱们想让服务器代码彻底替换和覆盖咱们本地的代码改动,那么只须要执行
        git fetch origin
        git reset --hard origin/master

推送文件的步骤

先用git status 查看要提交的文件,
    用git add将全部的要提交的文件进行暂存,
    而后一次git commit就能够。

注意顺序:修改1->git add->修改2->git add->git commit

若是本地项目和远程服务器的同一文件都有改动,那么就会产生冲突,致使git pull 失败
解决办法:
先执行git stash指令,暂存当前的改动状态,
再执行git pull指令,就能够成功拉取服务器代码,
再执行git stash pop,就能够看到合并后的代码改变。
本地解决冲突,再commit

经常使用命令:
git merge dev #当前在master分支,git merge是将某指定分支合并到当前分支
git diff #查看这个作过的修改
git branch -d 分支名** #删除分支
git log #查看历史记录,显示从最近到最远的提交日志

能够添加 --pretty=oneline 参数

友情提示的是,你看到的一大串相似1094adb...的是commit id(版本号)

注意:HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,往上100个版本写100个^比较容易数不过来,因此写成HEAD~100

回退到上一个版本:git reset --hard HEAD^(撤销到原先的最新版本,若没有关界面的话,能够往界面的上查找版本号,将HEAD^换成版本号,若已经关闭,能够用 git reflog命令)
撤销暂存区:git reset head <filename>
撤销工做区的修改:git checkout -- filename
查看内容:cat 文件名
查看工做区和版本库里面最新版本的区别:git diff HEAD -- 文件名
撤销工做区的全部修改:git checkout --文件名(分为两种,一种是回到和版本库中的同样,一种是回到上次暂存到暂存区的版本。命令中的“--”很重要)
撤销已经提交到暂存区的版本,并从新放回工做区:git reset HEAD 文件名
建立文件:touch 文件名
删除文件:rm 文件名(只是单纯删除文件)
删除文件:#删除 untracked files git clean -f
连 untracked 的目录也一块儿删掉 git clean -fd
连 gitignore 的untrack 文件/目录也一块儿删掉 (慎用,通常这个是用来删掉编译出来的 .o之类的文件用的)
git clean -xfd
在用上述 git clean 前,墙裂建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删
git clean -nxfd
git clean -nf
git clean -nfd
删除指定名词目录:rmdir name
上传文件:rz #回车键,选择要上传的文件(Linux命令,不是git命令)
下载文件:sz 文件名(Linux命令,不是git命令)
移动文件:mv 文件名 path
复制文件:cp 文件名 新的文件名
重命名文件:mv 文件名 新的文件名
假设当前写的东西进行到一半,有紧急任务,但当前的又不想提交:
git stash #将当前的工做储藏起来,之后恢复继续工做
git stash list #查看原先的工做
git stash apply #恢复储存的工做
git stash drop #删除原先储存的工做或者git stash pop #恢复的同时也将stash内容删除
git stash list #查看并无了
将工做区的文件已经删除了:用git status查看哪些被删除了,而后有两种选择:
(1)删除版本库的文件: git rm 文件名,而后git add ,git commit
(2)删除工做区的文件:git checkout --文件名(用版本库中的文件代替工做区的文件,一键还原)

查看分支合并图:git log --graph

将已经add和commit的东西删除:
因还未合并:git branch -D 分支名 #强行删除

名词解释:
工做区:在电脑里能看到的目录
版本库:工做区有一个隐藏目录.git,Git的版本库里存了不少东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为咱们自动建立的第一个分支master,以及指向master的一个指针叫HEAD。

不过重要的:
标签
步骤:
git branch #查看须要打标签的分支
git tag <name> #打标签,name是你想起的名字
git tag #查看全部打标签的分支
忘记打标签:git log --pretty=oneline --abbrev-commit,找到版本号,git tag <name> 版本号,查看全部的tag分支
注意:标签是按字母排序的,git show <tagname>查看标签信息
git tag -a v0.1 -m "version 0.1 released" 1094adb #建立带说明的标签,用-a指定标签名,-m指定说明文字
git show <tagname> #查看说明文字

注意:
标签老是和某个commit挂钩。若是这个commit既出如今master分支,又出如今dev分支,那么在这两个分支上均可以看到这个标签。
由于建立的标签都只存储在本地,不会自动推送到远程。因此,打错的标签能够在本地安全删除。
若是要推送某个标签到远程,使用命令git push origin <tagname>
一次性推送所有还没有推送到远程的本地标签 git push origin --tags
删除远程标签:先本地删除:git tag -d v0.9,再远程删除:git push origin :refs/tags/v0.9

小知识:
(1)git status显示一些Untracked files ...文件,在根目录下建立.gitignore文件,而后把要忽略的文件名填进去,Git就会自动忽略这些文件。

忽略文件的原则是:

忽略操做系统自动生成的文件,好比缩略图等;
忽略编译生成的中间文件、可执行文件等,也就是若是一个文件是经过另外一个文件自动生成的,那自动生成的文件就不必放进版本库,好比Java编译产生的.class文件;
忽略你本身的带有敏感信息的配置文件,好比存放口令的配置文件。

多是.gitignore写得有问题,能够用git check-ignore命令检查。

(2)简写,配置别名

git config --global alias.st status #st表明status
其他:
co表示checkout,ci表示commit,br表示branch

五、vim的使用

键盘图
图片描述

模式切换

clipboard.png

移动光标
shift 6() 至本行第一个非空字符
shift 4($) 至本行末尾
w 至下一个单词、标点开头
W 至下一个单词开头
b 至上一个单词、标点开头
B 至上一个单词开头
ctrl + b 上翻一页
ctrl + f 下翻一页
ctrl + d 向下翻半页 此比较有用
ctrl + u 向上翻半页 此比较有用
gg 文件开头
shift + g 文件末尾
num + shift + g 跳到第num行
“ 两个单引号 此命令至关有用, 它移动光标到上一个标记处, 好比用 gd, * 等查找到某个单词后, 再输入此命令则回到上次停留的位置.
‘. 一单一点 此命令至关好使, 它移动光标到上一次的修改行.
`. 一倒引一点 此命令至关强大, 它移动光标到上一次的修改点.
进入插入模式
i, I 进入输入模式(Insert mode): i 为『从目前光标所在处输入』, I 为『在目前所在行的第一个非空格符处开始输入』。 (经常使用)
a, A 进入输入模式(Insert mode): a 为『从目前光标所在的下一个字符处开始输入』, A 为『从光标所在行的最后一个字符处开始输入』。(经常使用)
o, O 进入输入模式(Insert mode): 这是英文字母 o 的大小写。o 为『在目前光标所在的下一行处输入新的一行』; O 为在目前光标所在处的上一行输入新的一行!(经常使用)
r, R 进入取代模式(Replace mode): r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 ESC 为止;(经常使用)
[Esc] 退出编辑模式,回到通常模式中(经常使用)
文本编辑(删除、复制、剪切、粘贴、撤销)
x 删除当前字符
3x 删除当前字符和以后的两个字符
dd 删除(剪切)当前那行
5dd 删除(剪切)当前那行和后面的4行
dw 当前字符到下一个字符开始
d$ 删除(剪切)当前字符到行尾
d0 删除(剪切)当前字符到行首
d^ 删除(剪切)当前字符到下一个非空字符
dG 删除(剪切)当前行到文件末尾
d20G 删除(剪切)当前行到20行
yy 复制当前那行,用法同dd
p 粘贴到光标以后
P 粘贴到光标以前
u 取消上一次操做
ctrl +r 恢复上一次操做
j 合并当前行和后面的一行,用法同dd
查找替换
/key(?key) 向下(上)查找key
:%s/oldkey/newkey/gc 在全局范围内用newkey替换oldkey
: 进入底行模式
% 范围%表明全局,1,3表明1到3行
s 替换操做
/oldkey/newkey/ 用新词替换老词
g 表明行内全局

编辑多个文件
vim file1 file2 … 编辑多个文件
:n 切换到下一个文件
:N 切换到上一个文件
:buffer 1 切换到第一个文件
:e file 新编辑一个文件
:r file 在当前文件中插入一个文件
:w file 将文件保存为一个文件
**技巧**r 替换模式,替换当前光标所在位置的一个字符。虽然你一样能够i进入插入模式,而后删掉那个字符,再输入须要的字符,但这种操做是鼠标流思惟方式。替换是一个可重复操做,多用没坏处。cw change word能够删除从当前位置到一个单词的结尾,并进入插入模式。这种操做经常使用于修改一个变量。好比对于:int count=0;但愿把count改为cnt,那么当光标位于c字符处的时候,按cw可直接删除count,并进入插入模式。而后直接继续输入cnt便可。caw change a word能够删除当前光标所在位置的单词。对于int count=0;的例子,若是此时光标在count中间某处,好比u处,直接键入caw能够达到一样的效果。因此caw更强大一些。c$、c^ 触类旁通,能够猜到c$是从当前位置删除到行尾,并进入插入模式。ci” change inside 能够用于修改当前位置附近,在相同配对的中的内容。好比对于const char *str=hello world;。当在双引号中间的任意位置键入ci"能够直接清空字符串,并继续输入新的但愿的字符串。ci(、ci[ 触类旁通change inside ( change inside [。cit 这个比较特殊,能够直接编辑匹配的xml标签中的内容!常常编写html的童鞋能够熟悉一下。yi" yank inside 猜猜是啥意思?相似ci只是把编辑操做编程复制操做,由于y是复制!是否是很强大。ya" yank around “ 复制整个字符串,包括双引号。yw、yaw、daw、d$… 好了,这些能够发明出来了。