Git 和 Svn 的区别
git是分布式版本控制系统,他的 “ 中央服务器” 只是用来控制来人之间电脑上推送数据的修改,每个人的电脑里都有完整的版本库
svn是集中式版本控制系统,他的版本库在中央服务器里
Git 闯关练习 https://learngitbranching.js.org/
$ git
The program 'git' is currently not installed. You can install it by typing:
//提示git没有安装执行下列命令
sudo apt-get install git
如果你碰巧用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这几个命令安装就好了。
从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。
官网下载Git url = "https://git-scm.com/downloads"
//安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.co
//创建空目录
$ mkdir learngit
$ cd learngit
$ pwd
/User/michael/learngit
//pwd 命令用于显示当前目录
#设置仓库
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
#如果没有看到 .git 目录 输入 ls -ah 就可以看见
$ 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 status
//没有任何改变
On branch master
nothing to commit, working tree clean
// 文件受到改变
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." 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 ..." to unstage)
modified: redme.txt
$ git diff 查看具体修改的内容
*#在add 之前使用可查看你修改了那些内容
git diff 文件名 #查看文件具体修改的内容
*#在add之前操作查看与缓冲区(add之后的文件)两者之间的区别
$ git diff HEAD 文件名
*#在add之后操作查看当前缓存区与(库,分支)之间的文件的区别
$ 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 log --pretty=oneline
74b1c5ec1e84b66906cb2dda8160bcc1fdef3a71 (HEAD -> master) 提交一次
411f6e86e8fd547cefc6bbdf5d88042f0a87bcf1 wrote a redme.txt file
#*hade 表示当前版本
$ 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
//回复到版本库总最先的版本
$ ssh-keygen -t rsa -C "自己的邮箱"
//然后一路回车,他中间会有一个地址,便是.ssh文件的存放地址
//最后看一下自己的 .ssh 文件有没有创建成功
//里面有 id_rsa 和 id_rsa.pub id_rsa是私钥另一个是公钥
/**
在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并且提交到主分支上的时候,会发现当前改的东西没写完不能提交
这是我们需要创建一个临时的分支,隐藏当前修改的东西
**/
$ 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 [email protected]:michaelliao/learngit.git (fetch) #抓取
origin [email protected]: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下来本地修改完成后再提交上去
#这方面研究不是很好
#和 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 [email protected]:liaoxueFeng/learngit.gt
#关联之后就可以使用git pull 和 git push
$ git remote -v
# git remote -v
#origin [email protected]:michaelliao/learngit.git (fetch)
#origin [email protected]:michaelliao/learngit.git (push)
$ git remote rm origin
# 同时使用git remote add 添加添加两次就好
#git remote add github [email protected]:michaelliao/learngit.git
#git remote add gitee [email protected]:liaoxuefeng/learngit.git
#现在关联了两个库提交和更新的时候要增加 库名
$ git push github master
$ git pull gitee master
在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:
$ 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.