Git 整理,由浅入深

Git 和 Svn 的区别

git是分布式版本控制系统,他的 “ 中央服务器” 只是用来控制来人之间电脑上推送数据的修改,每个人的电脑里都有完整的版本库

svn是集中式版本控制系统,他的版本库在中央服务器里

Git 闯关练习 https://learngitbranching.js.org/

Git安装

Linux 上安装 Git
查询是否安装git
$ git
The program 'git' is currently not installed. You can install it by typing:

//提示git没有安装执行下列命令
sudo apt-get install git    

其他Linux 版本安装
如果你碰巧用Debian或Ubuntu Linux,通过一条sudo apt-get install git就可以直接完成Git的安装,非常简单。

老一点的Debian或Ubuntu Linux,要把命令改为sudo apt-get install git-core,因为以前有个软件也叫GIT(GNU Interactive Tools),结果Git就只能叫git-core了。由于Git名气实在太大,后来就把GNU Interactive Tools改成gnuit,git-core正式改为git。

如果是其他Linux版本,可以直接通过源码安装。先从Git官网下载源码,然后解压,依次输入:./config,make,sudo make install这几个命令安装就好了。
Mac 安装 Git
从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。
Windows 安装
官网下载Git url = "https://git-scm.com/downloads"
    
//安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.co    

Git操作

创建版本库
//创建空目录
$ mkdir learngit
$ cd learngit
$ pwd
/User/michael/learngit
    
//pwd 命令用于显示当前目录
    
#设置仓库
$ git init 
Initialized empty Git repository in /Users/michael/learngit/.git/

#如果没有看到 .git 目录 输入 ls -ah 就可以看见
   
把文件添加到git目录
把文件添加到仓库
$ git add readme.txt
    
    
//Administrator@PC-201902271635 MINGW64 /e/git/learngit (master)
$ git add readme.txt
fatal: pathspec 'readme.txt' did not match any files
    
#出现这个错误的话是没有这个文件

把添加的文件提交到仓库
//简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容
$ git commit -m "更改的内容"
    
//git commit命令执行成功后会告诉你,1 file changed:1个文件被改动(我们新添加的readme.txt文件);2 insertions:插入了两行内容(readme.txt有两行内容)。
[master (root-commit) eaadf4e] wrote a readme file
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt
查看git历史记录
查看当前仓库的状态
$ git status
    
//没有任何改变
On branch master
nothing to commit, working tree clean

// 文件受到改变
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

       *** modified:   redme.txt

no changes added to commit (use "git add" and/or "git commit -a")
            
//没有提交
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   redme.txt
查看具体修改的内容
$ git diff  查看具体修改的内容
*#在add 之前使用可查看你修改了那些内容

    
git diff 文件名    #查看文件具体修改的内容
*#在add之前操作查看与缓冲区(add之后的文件)两者之间的区别
    

$ git diff HEAD  文件名
*#在add之后操作查看当前缓存区与(库,分支)之间的文件的区别

Git 版本回退
查看历史记录
$ git log
$ git log --graph --pretty=oneline --abbrev-commit  #好像是查看详细历史记录
    
$ git log
    
//git log命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 21:06:15 2018 +0800

    append GPL

commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 21:03:36 2018 +0800

    add distributed

commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 20:59:18 2018 +0800

    wrote a readme file
Git 查看简化历史记录
$ git log --pretty=oneline
    
74b1c5ec1e84b66906cb2dda8160bcc1fdef3a71 (HEAD -> master) 提交一次
411f6e86e8fd547cefc6bbdf5d88042f0a87bcf1 wrote a redme.txt file

#*hade 表示当前版本
Git 版本退回
$ git reset --hard HEAD^  	#回到上一个版本 HEAD^ 表示上一个   HEAD^^表示上上个  HEAD~100往上100个版本
$ git reset --hard <-commitid->  #回退到某一个版本
    
#*当你到了前面的某一个版本的话如果想回退刚刚的版本(最新的版本的时候)
#只要你的窗口没有关闭就往上翻找到版本号,不需要全部输入输入前几个就OK(但是不要重复)
 $ git reset --hard 74b1c5

    
#** 如果你关闭窗口了还想回到最新的版本的话找不到版本号话
#先运行 git reflog   查看操作历史记录
/**
    Administrator@PC-201902271635 MINGW64 /e/git/learngit (master)
    $ git reflog
    070d6ec (HEAD -> master) HEAD@{0}: reset: moving to 070d
    cb3de9c HEAD@{1}: reset: moving to HEAD^
    070d6ec (HEAD -> master) HEAD@{2}: commit: 新增文件
    cb3de9c HEAD@{3}: commit: 新增new文件
    01d2638 HEAD@{4}: commit: 修改内容测试diff
    5513b3a HEAD@{5}: commit: 新增一行数据
    e5ff7f5 HEAD@{6}: commit (initial): 新增文件
**/
#前面的就是版本号 在运行 git reset 070d6ec
    
    
/*******************************/
$ git reset 只是退回本地的版本
!!如果要退会线上的文件的话使用 $ git revert
    
查看操作历史记录
$ git reflog
撤销修改
丢弃工作区的状态
$ git checkout -- file

//当你把文件提交到masters(本地版本库)后 ,结果为没提交之前
//当你把文件没有提交到暂存区后,结果为工作区修改之前
//就是让这个文件回到最近一次git commit或git add时的状态。
$ git checkout -- redme.txt
    
//如果你的文件已经add 提交了请先运行版本回退
$ git reset HEAD -- redme.txt
//他会恢复到你没有add之前
$ git checkout -- redme.txt 	#回到本地版本没改之前
删除文件
$ git rm --file

//当你把文件删除之后 git 会立即做出判断,
//你可以使用 git rm --text.txt 删除然后commit提交
//如果是误删除的话你可以使用
$ git checkout -- file
//回复到版本库总最先的版本

GitHub 创建远程库

创建本地GitHub ssh 秘钥
$ ssh-keygen -t rsa -C "自己的邮箱"

//然后一路回车,他中间会有一个地址,便是.ssh文件的存放地址
//最后看一下自己的 .ssh 文件有没有创建成功
//里面有 id_rsa 和 id_rsa.pub   id_rsa是私钥另一个是公钥
    
创建GitHub 上的ssh 秘钥
/**
在GitHub上面找到 Add SSH Key  
位置在右上角 settings 中 ssh and GPG keys
在title里面标清楚这是谁的公钥 
在 key 里面复制 id_rsa.pub 的内容
点击add key
**/
创建库
/**
直接在GitHub上面创建,当你创建一个空的库的时候他会有三种方法,
第一个是在本地将远程库连接起来
第二个是将目前本地的库push到远程库上
第三的是导入远程的库
**/

/**
用第二个方法的时候如果遇到报错
你的邮箱会被暴露的问题
请在邮箱设置中将  Keep my email address private 取消选中
**/
从远程库克隆
$ git clone git地址

分支管理

创建于合并分支
分支的概念
对于git 来说 每一个分支都是一条线,当你每次提交的时候就在线上打个疙瘩
对于两个人的话,就等于另一个人也在另一条线上,等于是主线分叉,另一个人提交的话只是在另一个线上打疙瘩
    #每一个 口 代表疙瘩,代表每一次提交
/** 				/--------口------
	-----口------<
					\--------口-----
**/

//想在我们要做的就是将他两合并
创建分支
$ git checkout -b <-分支名->    #创建分支并切换到这个分支
    
$ git branch  <-分支名->		 #加上分支名就是创建分支,不加就是查看所有分支,前面带*号的是当前分支

$ git branch -f <-分支名-> <-commit id->
#移动分支到某个commit节点

$ git checkout <-分支名->		 #切换分支名
    
合并分支
$ git merge <-分支名->
删除分支
$ git branch -d <-分支名->
解决分支冲突
当两个人进行开发的时候,如果同时修改了一个文件中的某一行,合并的时候就会有冲突
/**
     <<<<<<< HEAD
    Creating a new branch is quick & simple.
    =======
    Creating a new branch is quick AND simple.
    >>>>>>> feature1
**/
这是需要把这两行改正在提交

查看分支合并图
$ git log --graph
分支管理策略
合并分支加参数
$ git merge -no-ff -m "描述" <-分支名->
分支合并注意项
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
  
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
    
 /** 				/-----master----口----------口---
	-----口------<					|		   |
					\-----dev-------口----口----口-
									|     |		|
					  \-----第一个---口---- |-----口---
					  				|	  |		 |
					    \-----第二个-口----口------口--
**/
Bug 分支
/**
	当需要临时改一个bug并且提交到主分支上的时候,会发现当前改的东西没写完不能提交
	这是我们需要创建一个临时的分支,隐藏当前修改的东西
**/
储存/隐藏当前已修改内容
$ git stash  
查看/恢复隐藏的内容
$ git stash list  	查看隐藏的内容
$ git stash apply 	恢复,但是不删除记录
$ git stash drop	删除隐藏记录
$ git stash pop		恢复并且删除隐藏记录
$ git satsh pop stash@{0}  恢复指定的记录
强行删除分支
$ git branch -D <-分支名->
多人协作
查看远程数据库信息
$ git remote  -v  查看远程数据的详细信息
/**
	$ git remote -v
    origin  git@github.com:michaelliao/learngit.git (fetch)		#抓取
    origin  git@github.com:michaelliao/learngit.git (push)		#提交
**/
推送分支
$ git push origin master
$ git push <-仓库名-> <-分支名->
#一般的话仓库名默认是origin 

##假设线上分支有俩个怎么办 一个master 一个evt
#此时你想把本地的提交到各自的分支上怎么办
$ git push origin <-本地分支-> : <-线上分支->
# git push origin master:evt  这是将本地master提交线上的evt分支上面,线上分支没有的话会创建

#当你想吧自己上次提交的分支提交到线上怎么办
$ git push origin <-本地分支-> ^:<-线上分支-> 
# git push origin evt^:master
    
#删除线上远程的分支
$ git push origin -d <-分支名->

抓取分支
#当另一个人从远程库clone项目的时候,只会克隆下一个分支
#当他要抓取另一个分支的时候,得在本地创建一个分支
$ git checkout -b dev origin/dev
$ git pull    抓取线上分支内容
    
#抓取失败的话我们需要制定本地的分支与远程的分支连接
$ git branch --set-upstream-to=origin/dev dev

#当你本地是基于线上上一次提交的代码写的时候发现没法往线上pull
#线上已经被别人又更新了一遍的时候你可以使用 $ git pull --rebase 更新合并线上代码然后在进行更新

    
#同样线上有两个分支你想抓取到本地怎么办
$ git pull origin <-线上分支->:<-本地分支-> 
#$ git pull origin master:evt 如果本地分支没有的话会自动创建
#$ git pull origin master^:evt 同样支持HADE 将线上的上一个版本跟新到evt    
复制别人分支到自己当前指针后面
#其实就是抓取别人提交的分支记录到自己的后面
$git cherry-pick <-分支名-> 
#例如 git cherry-pick 他人的分支名1  他人的分支名2
线上分支冲突解决
#当另一个人把他修改的分支push到远程库的时候,我们在push同样的分支就会发生冲突
#我们需要把线上的内容pull下来本地修改完成后再提交上去
Rebase (变基)
#这方面研究不是很好
#和 merge 的作用差不多 合并分支的 
#好像是看历史记录好看一点

//rebase操作可以把本地未push的分叉提交历史整理成直线;
//rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

$ git rebase
#说白了就是合并分支,和merge一样

标签管理

创建标签
$ git tag v1.0
#其实就是给一个分支上打上标签,或者说在一次提交上打上标签,方便以后管理
/**
	切换到要打标签的分支上
	$git tag v1.0
	v1.0 其实就是标签的名字,可理解为版本号	
**/
    
#可选参数
#给历史提交打标签
 $ git tag v1.1 历史编码号(commit if)
# git tag v1.1 fa523b

#创建带有说明的标签
$ git tag -a v0.1 -m "标签说明" 1094adb
查看所有标签
$ git tag
查看标签信息
$ git show <-标签名->
删除标签
$ git tag -d v0.1
#如果删除远程的标签的话需要先删除本的标签在push删除线上的
$ git tag -d v0.1;
$ git push origin :evt/tags/v0.1

推送标签到远程
#推送
$ git push origin v1.0
#推送全部尚未推送到远程的本地标签
$ git push origin --tags

关联线上远程仓库

关联线上仓库
$ git remote add 关联线上的远程库
# git remote add origin git@gitee.com:liaoxueFeng/learngit.gt
#关联之后就可以使用git pull 和 git push

查看关联的线上库
$ git remote -v 
# git remote -v
#origin	git@github.com:michaelliao/learngit.git (fetch)
#origin	git@github.com:michaelliao/learngit.git (push)
删除已有的远程库
$ git remote rm origin
关联不同的两个库
# 同时使用git remote add 添加添加两次就好
#git remote add github git@github.com:michaelliao/learngit.git
#git remote add gitee git@gitee.com:liaoxuefeng/learngit.git
#现在关联了两个库提交和更新的时候要增加 库名
$ git push github master
$ git pull gitee master

自定义Git

忽略特殊文件名
在git工作区根目录下面创建文件 .gitignore 文件
配置文件内容直接在线浏览:https://github.com/github/gitignore
里面都配置好了
配置别名
#感觉命令太长的话可以时候别名
$ git config --global alias.st status
# 现在 git st  就是 git status
# --global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。

    
#详细历史记录配置
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配置都放在 .git/config
搭建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.
  • 11
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值