git是一个版本控制工具;都说花有重开时,人物在少年。git就是那朵花,可以重新来过。最直白的话就是你做了错事可以回溯到你做错事之前,让你重新做人。
在学习过程中如果你有任何问题可留言或联系我wx: zjdkingwx
初学者一般都会产生误区,这三个是不是一个东西。答案是肯定不是,git是工具,gitlab 和github他们两个是仓库。你可以通过工具向仓库中存放东西。一般公司企业使用的是gitlab,个人使用github。
说明:已经有账号的可以直接跳过,如果没有请点击这里我之前写的Git Hub账号申请博客
git 工作区,缓存区,本地仓库,远程仓库
你不光需要知道他怎么来的,还要知道他怎么没的。直接通过控制面板卸载就可以了;win+pause break打开控制。直接卸载即可(下载在安装的时候也是一路next);此处了解即可可以不去练习。
进入到一个你想做为仓库的文件夹执行git init,细心的同学会发现在执行命令后多了一个.git 文件;windows小伙伴可以显示隐藏文件就可以看到。这个文件是git仓库的核心,一般不要乱动。
$ mkdir -pv crazyk/git-demo
$ cd crazyk/git-demo
$ git init
$ ls -a
. .. .git
编写一个随意的文件,注意一定要和.git同一级目录下,随意在上边书写一些内容;(windows小伙伴建议不要使用自带的记事本,使用Notepad++或者EditPlus,防止乱码并且还有格式)
# vim 进入到编辑模式(**对于里边的命令都要使用英文输入法**) i 进入到编辑模式 esc退出编辑模式。 :wq保存
$ vim suiyi.txt
$ cat suiyi.txt
我爱中国!
# 将文件添加到暂存区。 如果想将所有的文件都添加到缓存区 git add . 即可
$ git add suiyi.txt
# 将暂存区的文件提交到本地仓库
$ git commit -m "我的第一次"
我们对之前提交的文件就行修改,然后再次提交
# 还是随便修改一些东西 保存
$ vim suiyi.txt
# 查看里边内容从我爱中国!多了xx
$ cat suiyi.txt
我爱中国!xx
# 查看一下状态
$ git status
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified: suiyi.txt
no changes added to commit (use "git add" and/or "git commit -a")
$ git add suiyi.txt
$ git commit -m "第一次修改"
要是能重来,我要做李白。 好给你机会
首先你要知道你要从哪个朝代重来吧。git log查看所有提交的记录
回退命令 git reset / git revert
$ git log
commit 95e5bdb840a382c3bb8b09d905a968be873e1ef5 (HEAD -> master)
Author: wangdakai <[email protected]>
Date: Thu Mar 18 10:51:45 2021 +0800
我的第一次修改
commit 66f23006a667897917e02ba2c383fe07352e64a3
Author: wangdakai <[email protected]>
Date: Thu Mar 18 10:42:15 2021 +0800
我的第一次
以下将使用不同种类的回滚。
对于回滚我们需要对版本进行进一步的介绍。
git reset --soft 要回退到的版本号
$ git reset --soft 66f23006a667897917e02ba2c383fe07352e64a3
# 查看状态,发现modified: suiyi.txt 发现文件被修改了;
$ git status
On branch master
Changes to be committed:
(use "git restore --staged ..." to unstage)
modified: suiyi.txt
# 查看内容,和第二次提交前是一样的。
$ cat suiyi.txt
我爱中国!xx
# 查看日志,发现只有一次提交,第二次提交没有了。
$ git log
commit 66f23006a667897917e02ba2c383fe07352e64a3 (HEAD -> master)
Author: wangdakai <[email protected]>
Date: Thu Mar 18 10:42:15 2021 +0800
我的第一次
(END)
# 这个时候可以重新编辑了。
$ vim suiyi.txt
$ cat suiyi.txt
我爱中国!我要做李白
$ git commit -m "soft 回滚提交";
[master ea36fd1] soft 回滚提交
1 file changed, 1 insertion(+), 1 deletion(-)
$ git log
commit ea36fd1e0c649783a5f01b62b3b0ed18d2726755 (HEAD -> master)
Author: wangdakai <[email protected]>
Date: Thu Mar 18 13:59:46 2021 +0800
soft 回滚提交
commit 66f23006a667897917e02ba2c383fe07352e64a3
Author: wangdakai <[email protected]>
Date: Thu Mar 18 10:42:15 2021 +0800
我的第一次
(END)
综上可以看得出来,git reset --soft xxx 相当于撤销了了上次提交,并将结果退回暂存区。意思就是退回到xx版本,在xx版本之后的内容还在。最简单的理解就是撤销了git commit 那一步的动作。
git reset --hard 要回退到的版本号
$ git reset --hard 66f23006a667897917e02ba2c383fe07352e64a3
HEAD is now at 66f2300 我的第一次
$ cat suiyi.txt
我爱中国!
# 查看状态,发现没有更改过。
$ git status
On branch master
nothing to commit, working tree clean
$ vim suiyi.txt
$ cat suiyi.txt
我爱中国! 我要在做李白
$ git add suiyi.txt
$ git commit -m "hard 回滚提交";
[master df9c531] hard 回滚提交
1 file changed, 1 insertion(+), 1 deletion(-)
$ git log
commit df9c531eb339cc6b5d5760ba7740b861b14f408d (HEAD -> master)
Author: wangdakai <[email protected]>
Date: Thu Mar 18 14:14:26 2021 +0800
hard 回滚提交
commit 66f23006a667897917e02ba2c383fe07352e64a3
Author: wangdakai <[email protected]>
Date: Thu Mar 18 10:42:15 2021 +0800
我的第一次
(END)
综上,git reset --hard 会回到xxx版本。并且xx版本之后的全部删除。
git reset --mixed
git reset --mixed 66f23006a667897917e02ba2c383fe07352e64a3
Unstaged changes after reset:
M suiyi.txt
# 查看状态,发现已经退回到了工作区。
$ git status
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified: suiyi.txt
# git log确实已经回到了从前。
$ git log
commit 66f23006a667897917e02ba2c383fe07352e64a3 (HEAD -> master)
Author: wangdakai <[email protected]>
Date: Thu Mar 18 10:42:15 2021 +0800
我的第一次
(END)
$ git add .
$ git commit -m "mixed 提交"
$ git log
commit ba6b40dbaeef63ec866469983d2d0427370540fc (HEAD -> master)
Author: wangdakai <[email protected]>
Date: Thu Mar 18 14:40:11 2021 +0800
mixed 提交
commit 66f23006a667897917e02ba2c383fe07352e64a3
Author: wangdakai <[email protected]>
Date: Thu Mar 18 10:42:15 2021 +0800
我的第一次
(END)
综上,git reset --mixed xx 回到了 版本,并且回到的是工作区。可以简单理解,他撤销的是git add 和git commit两个步骤
git revert
$ git revert HEAD
[master 7e47130] Revert "mixed 提交"
1 file changed, 1 insertion(+), 1 deletion(-)
$ git log
commit 7e471300d42962d91d44d2bb56a86cdae2baad81 (HEAD -> master)
Author: wangdakai <[email protected]>
Date: Thu Mar 18 14:53:49 2021 +0800
Revert "mixed 提交"
This reverts commit ba6b40dbaeef63ec866469983d2d0427370540fc.
commit 4c1bb18526d73fb7988e4b094802a006ee51163e
Author: wangdakai <[email protected]>
Date: Thu Mar 18 14:52:42 2021 +0800
mixed 提交
commit 66f23006a667897917e02ba2c383fe07352e64a3
Author: wangdakai <[email protected]>
Date: Thu Mar 18 10:42:15 2021 +0800
我的第一次
(END)
git revert 会回退到之前版本;形成一次新的提交。
总结
git reset
- git reset --soft xxx 相当于撤销了git commit 这一步,xx版本后的修改的内容还在,在暂存区。
- git reset --mixed xxx 撤销了git add 和git commit 这两部,xx版本后修改的内容还在,在工作区。
- git reset --hard xxx 将版本回滚到xxx ,xxx版本之后的内容全部删除。
git revert 用一次新的提交来回滚之前的提交
推荐使用git revert,因git reset不会保留回滚之前的记录,但是revert会。
A->B->C->D git revert D 就会变成 A->B->C->D->rD
A->B->C->D git reset --hard C 就会变成A->B->C
远程仓库创建成功
$ git init
Initialized empty Git repository in /Users/mlamp/crazyk/gittest/.git/
$ vim suiyi.txt
$ cat suiyi.txt
我爱中国
$ git commit -m "我的第一次"
[master (root-commit) 9dbef9a] 我的第一次
1 file changed, 1 insertion(+)
create mode 100644 suiyi.txt
# 和远方建立链接
$ git remote add origin https://github.com/crazy-dking/gittest.git
# 只有第一次提交的时候是需要这样,后续提交git push 就行
$ git push -u origin master
Username for 'https://github.com': [email protected]
Password for 'https://[email protected]@github.com':
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 239 bytes | 239.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/crazy-dking/gittest.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
从远程仓库拉去代码
复制链接回到本地随便找一个文件夹就行(虽然说了这么多随便,但是作为开发人员希望你的工程在开的时候目录条里清晰)
执行git clone
$ git clone https://github.com/crazy-dking/myairline.git
Cloning into 'myairline'...
remote: Enumerating objects: 33, done.
remote: Counting objects: 100% (33/33), done.
remote: Compressing objects: 100% (24/24), done.
remote: Total 33 (delta 9), reused 26 (delta 6), pack-reused 0
Unpacking objects: 100% (33/33), done.
因为这个项目是测试demo,只有你一个人,不会有冲突,在多人合作的时候一定先拉去,在提交。这样有冲突可以提前处理。
$ git pull
$ git commit -m ""
$ git push
有些时候我们可能添加错地址了,需要删除
1.先git remote -v 查看一下远程库信息
2.根据名字删除信息 git remote rm origin
$ git remote -v
origin https://github.com/crazy-dking/gittest.git (fetch)
origin https://github.com/crazy-dking/gittest.git (push)
$ git remote rm origin
我们之前的操作都是在master分支进行的。
接下来我们学习创建分支
# 创建dev
$ git branch dev
# 切换到dev 其实创建和切换可以使用一条命令,git checkout -b dev
$ git checkout dev
# 查看分支列表 *表示单签所以在分支
$ git branch
* dev
master
(END)
合并分支
合并分支就是以A分支基础,将另外一个B分支合到他上边。这样A分支就就有B分支的功能。
我们创建一个新的feature分支并在上边创建一个文件,然后将feature合并到dev 分支。
切换分支也可以使用git switch 分支; 看个人习惯。
想要合并到那个分支上,你就先到那个分支上
$ git checkout -b feature
Switched to a new branch 'feature'
#创建一个新文件
$ touch feature.txt
$ ls
feature.txt suiyi.txt
$ git add .
$ git commit -m "feature.txt"
[feature 5c9bfdd] feature.txt
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 feature.txt
# 切换到dev 分支,ls查看,并看不到feature.txt
$ git checkout dev
Switched to branch 'dev'
$ ls
suiyi.txt
## 开始合并
$ git merge feature
Updating 9dbef9a..5c9bfdd
Fast-forward
feature.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 feature.txt
$ ls
feature.txt suiyi.txt
git branch -d 分支名称
$ git branch -d feature
Deleted branch feature (was 5c9bfdd).
他的作用主要是解决分之多,看起来杂乱的
rebase操作可以把本地未push的分叉提交历史整理成直线;
小王我是没怎使用过,但是之前面试被问到过。
冲突的产生,同一个文件的被多个人动了。
讲真,一般不会有人在你的控制台进行解决冲突,真心看着太恶心了。
为了模拟,我们我们自己制造一个冲突。然后去解决。
$ vim suiyi.txt
$ cat suiyi.txt
我爱中!国
$ git add .
$ git commit -m "dev 改动"
$ git switch master
Switched to branch 'master'
$ vim suiyi.txt
$ cat suiyi.txt
我爱中
国
# 此时合并分支
$ git merge dev
Updating 9dbef9a..47d3512
error: Your local changes to the following files would be overwritten by merge:
suiyi.txt
Please commit your changes or stash them before you merge.
Aborting
# fack 我忘记提交了,错误意思是你要不先提交,要不将改变stash起来;这个stash 后边在说
$ git add .
$ git commit -m "master 改动"
[master b578303] master 改动
1 file changed, 2 insertions(+), 1 deletion(-)
# 再次合并
$ git merge dev
Auto-merging suiyi.txt
CONFLICT (content): Merge conflict in suiyi.txt
Automatic merge failed; fix conflicts and then commit the result.
# 上边说suiyi.txt出现了冲突,那么我们查看这个文件,
# <<<<
$ vim suiyi.txt
<<<<<<< HEAD
我爱中
国
=======
我爱中!国
>>>>>>> dev
# 我们只要master上边的,那么我们删除无用内容。保存再次提交就可以了
$ git add .
$ git commit -m "conflict fixed"
[master 9f60bbf] conflict fixed
到此修复成功。
git 打tag非常简单,但是为什么要打tag?
Git 可以给仓库历史中的某一个提交打上标签,以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点( v1.0 、 v2.0 等等)
## 大标签
$ git tag v1.0
## 查看标签
$ git tag
v1.0
(END)
$ git show v1.0
commit 9f60bbfa2202bbc80521132f988f539c51f1a83c (HEAD -> master, tag: v1.0)
Merge: b578303 47d3512
Author: wangdakai <[email protected]>
Date: Thu Mar 18 18:47:41 2021 +0800
conflict fixed
## 删除标签
$ git tag -d v1.0
Deleted tag 'v1.0' (was 9f60bbf)
project内部的setting–>一直向下滑 delete this repository
小王和小李合作开发项目,小李创建了一个git hub上边的私人仓库,这个时候给了链接让小王下载,小王是么办法去clone代码的。
需要小李向小王发起邀请,然后小王接收邀请,这个时候小王和小李才可以在一起 开发
具体如下:
1.首先小李创建了私人仓库
git 首页–>new --> create repository
$ git clone https://github.com/crazy-dking/pirvategit.git
Cloning into 'pirvategit'...
Username for 'https://github.com': [email protected]
Password for 'https://[email protected]@github.com':
remote: Repository not found.
fatal: repository 'https://github.com/crazy-dking/pirvategit.git/' not found
3.小王发现下载不下来,然后查资料,发现需要小李邀请,他才可以进行协同开发。接下来小李邀请
4.小王进入到自己的邮箱,统一邀请,从此两个人在一起了
内容 language:java stars:>200
搜索 java 语言的 收藏大于200 的项目;这样可以更加有助于我们筛选项目。
1、修改本地hosts文件
windows系统的hosts文件的位置如下:C:\Windows\System32\drivers\etc\hosts
mac/linux系统的hosts文件的位置如下:vim /etc/hosts
2、获取Github相关网站的ip
访问https://www.ipaddress.com,直接搜索”
分别输入github.global.ssl.fastly.net和github.com,查询ip地址
下面是我的配置
140.82.114.3 github.com
199.232.5.194 github.global.ssl.fastly.net
最根本的方法:科学上网。
小王从此在自己的分支快乐的开发,突然有一天部门老大说你去另外的一个分支修复一下bug
小王心想我这现在还没开发完成,还不能提交,现在切过去就炸了。说不行部门老大的印象肯定大大折扣。该怎么办,怎么办。急的原地转圈圈。这个时候引入强大的 stash 和pop 命令
# 小王在dev 工作 假定他要去bug 分支去修改bug;
$ git checkout dev
# 开始开发
$ vim feature.txt
$ git status
On branch dev
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified: feature.txt
# 这个时候要去bug 分支进行修改bug;先说一下问题,如果我们直接切过去会带着我们的更改过去。
$ git checkout -b bug
M feature.txt
Switched to a new branch 'bug'
# 看吧,我们的修改也被带过来
$ git status
On branch bug
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified: feature.txt
# 所以我们此时需要先将我们的代码藏起来,等改完bug,在回来。释放存储
$ git checkout dev
$ git stash save
Saved working directory and index state WIP on dev: 47d3512 dev 改动
# 这个时候我们就发现已经将代码储藏起来了
$ git status
On branch dev
nothing to commit, working tree clean
# 当我们改完bug 回来只需要 既可以将最上边的释放。
$ git stash pop
On branch dev
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified: feature.txt
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (c66d332dde539c2716260eba7ce38f3952295b12)
平静的日志总是短暂的,小王电脑坏了,公司临时给他配了一个临时的电脑,但是这个电脑上边已经有别人的git账号,小王想使用但是那个账号还没有小王要的权限;怎么办呢?重新卸载重装?不科学肯定有办法。
#可以直接使用一下命令进行切换账号,切换完成就可以检出了
#全局切换,针对于小王的情况很实用
$ git config --global user.name "小王"
$ git config --global user.email "[email protected]"
# 局部切换
$ git config user.name "小王"
$ git config user.email "[email protected]"
有时候我们在clone远程代码的时候,发现远程有这个仓库但是还是一直报错找不到仓库,那么多半是该电脑上git 凭证不对。
$ git clone https://github.com/zjdking/notes.git
Cloning into 'notes'...
remote: Repository not found.
fatal: repository 'https://github.com/zjdking/notes.git/' not found
解决方案:进入到控制面板–>用户账户–>凭据管理器–>windows凭据 删除git凭据,重新检出。
一般的开发团队都会从开发分支检出来多条分支进行开发,我们以小王和小李各有一个分支为例,小王想用小李分支上的功能,但是小李功能没有开发完成,他的分支不能合并到开发分支上,那怎么办呢?小王自己在写一个份?得不偿失。
# 小王在feature上开发,小李在feature1上开发,只要小李将代码提交。小王就可拿到版本号。
$ git cherry-pick 版本号
$ git config --system --unset credential.helper
1.在当前目录新建一个Git代码库
git init
2.新创建一个目录将它初始化为一个git代码库
git init [project-name]
project-name:你的项目名称
3.从远程仓库中下载代码
git clone [url]
url :指的是你要下载的代码库的url地址
1.查看配置列表
git config --list
2.查看当前用户
git config user.name
3.设置局部提交代码的用户信息
git config user.name “wangdakai”
git config user.email “[email protected]”
4.设置全局提交代码的用户信息
git config --global user.name "wangdakai“
git config --global user.email “[email protected]”
他和局部的关键就是这个 --global
1.所有文件添加到暂存区
git add .
2.将指定文件或者目录存放暂存区
git add 文件/目录
1.提交暂存区的代码到本地仓库
git commit -m “提交的描述信息”
1.查看分支列表
git branch 显示所有本地分支
git branch -r 显示所有远程分支
git branch -a 显示所有分支
2.新创建分支
git branch 分支名称(新建一个分支但是仍停留到当前分支)
git checkout -b 分支名称(新建分支,并且切换到新分支)
3.切换到指定分支
git checkout 分支名称
4.合并指定分支到当前分支 向合并到哪个分支上需要先切分到那个分支
git merge 分支
5.选择一个提交合并到当前分支
git cherry-pick 提交的版本号
5.删除指定分支
git branch -d 分支名称
1.列出所有tag
git tag
2.新建一个tag在当前提交
git tag [tag]
3.删除本地tag
git tag -d [tag]
4.删除远程tag
git push origin :refs/tags/[tagName]
5.查看tag信息
git show [tag]
6.提交指定tag
git push [remote] [tag]
7.提交所有tag
git push [remote] --tags
1.显示所有变更的文件
git status
2.显示当前分支的历史版本
git logs
3.显示指定文每次的diff
git log -p [指定文件]
4.显示暂存区和工作区的不同
git diff
5.显示工作区和当前最新一次提交之间的差异
git diff HEAD
1.获取远程仓库的变化,冰河本地合并
git pull [remote] [branch]
2.上传本地仓库的内容到远程仓库
git push [remote] [branch]
3.强行推送到远程仓库,即使有冲突
git push [remote] --force
1.恢复暂存区的指定文件到工作区
git checkout [file]
git checkout . 恢复全部
2.重置
git reset [file] 重置暂存区指定文件和上次提交保持一致,工作区不变
git reset --hard 重置工作区于暂存区,和上次提交保持一致
3.暂是将未提交的变化移除,然后在移入
git stash 将未提交的信息存放起来
git stash pop 将存放起来的信息拿出来
4.新建一个提交,用来撤销指定提交;
git revert [commit]
分支类型,他们的作用。
- master 主干分支
- develop 开发分支
- feature 功能分支
- release 版本分支
- hotfix 修改bug 分支
本来还想写一下git 和idea的结合使用。但是idea版本变化了,界面就变化了。所以只要把上上述思想掌握,可以不变应万变。不行根据思想就去查呗。其实不会去查询不可怕,可怕的是你不会还不知道怎么查,这才是最可怕的。