GIT学习——天天都在用Git,那么你系统学习过吗?(学习过程)

你系统学习Git了吗?

学习圣思园张龙老师的Git课程。

使用Mac编程的好处,不是因为Mac长得好看


Git内容学习准备

  1. 如果你还没有用Git,就不要写代码了。

  2. GitHub仓库的使用。

  3. 新员工入职的时候,会让他先用一周的时间去学习Git。

  4. Mac(优雅的开发环境,Terminal)

不要使用GUI入门Git。要使用命令行。

安装Git

  1. 使用Xcode自带的Git环境。
  2. 去官网自行下载安装。
  3. Terminal的增强。

bash

每一个Linux和Mac自带的解释器。(但是功能不是很强大)
强大的叫:zsh.
加强版本: oh my zsh (自行安装)

清屏命令:clear or ctrl+L

创建命令:touch xxx.txt :=增删改等。

查看命令:man cp

vi的基本使用。

必须要掌握的:Terminal操作

作为一个JAVA程序员,应该大部分都是在Windows使用JAVA开发,但是希望不要仅仅局限于JAVA。不然对成长很不友好。

内容大纲

  1. Git官网
  2. 常见Linux命令介绍
  3. Git在各种平台下的安装与配置
  4. 分布式与集中式版本控制系统的差别
  5. 缓存区、工作区与Git提交
  6. 版本回退
  7. 修改与撤销修改,文件的添加与删除
  8. Git对象类型与索引
  9. Git分支
  10. 如何创建,切换与删除分支
  11. Git分支在项目中开发的使用
  12. Git分子在工程化项目的最佳实践
  13. 分支常见重要命令详解
  14. Git merge
  15. Git冲突解决策略
  16. HEAD详解
  17. Git Commit修改详解
  18. 远程版本库介绍
  19. 如何使用远程版本库
  20. Git Push、Pull、fetch使用与注意事项
  21. Git合并的基本原则
  22. Git别名、config文件详解
  23. Git tag详解
  24. 如何创建与推送tag
  25. Git feature分支详解
  26. 何时使用submodule
  27. Git subtree详解
  28. Git subtree的使用方式详解
  29. .gitignore的正确使用方式
  30. Git私服GitLab的搭建方法
  31. 在公司内部使用gitlab作为版本控制服务器
  32. GitLab使用详解
  33. GitHub的使用方式
  34. 搭建基于Intellij IDEA的Java开发环境
  35. 搭建基于Gradle的JAVA开发环
  36. Git与Intellij IDEA 的整合方式详解
  37. Gradle初步使用
  38. .gitignore最佳实践

学习方法:知道一,更知道二,更知道三。

了解Git

Git简史

开发Git来管理Git

CVS、SVN与Git

不会Git,就别开发代码了。

Git、GitHub与GitLab

Git设计目标

为什么要使用Git

  • 本地建立版本库
  • 本地版本控制
  • 多主机异地协同工作
  • 重写提交说明
  • 有后悔药可以吃
  • 更好用的提交列表
  • 更好的差异比较
  • 更完善的分支系统
  • 速度极快

Git基础

  • 直接记录快照,而非差异比较
  • 近乎所有操作都在本地执行
  • 时刻保持数据完整性
  • 多数操作仅添加数据
  • 文件的三种状态
    • 已修改
    • 已暂存
    • 已提交

Git文件状态

Git文件:已经被版本库管理的文件

已修改:在工作目录修改Git文件

已暂存:(indea-staged)对已经修改的文件执行Git暂存操作,将文件存入暂存区

已提交:将已经暂存的文件执行Git提交操作将文件存放版本库

pic1

Git的文件状态如下

Pic2

本地版本库与服务器版本库

pic3

Git 安装

Linux

Mac

Windows

需要自行了解 SSH

GUI:source tree & GitHub Desktop

获取本地SSH

服务器上的 Git - 生成 SSH 公钥

ssh-keygen -t rsa  ## 三次回车,跳过密码 

开始使用Git

Git常用命令

获得版本库

git init
git clone

查看信息

git help
git log
git diff

版本管理

git add 
git commit
git rm

远程协作

git pull
git push

其他常用指令

git status  ##查看状态
git log ##查看commit记录
git checked -- xxx.txt ##丢弃已经修改的
git reset HEAD xxx.txt ##回到修改前的状态
git commit -m 'commit message' ##简要信息显示并commit

echo 'welcome' > xxx.txt  ##重定向welcome 到这个文件的输出
git add . ##当前目录所有文件都add
git log -3 ## 最近三条的log

git help config ## 获取配置
git config --help ## 帮助文档
man git-confgi ##帮助文档

常见功能

配置username && email**

  1. /etc/gitconfig (几乎不会使用,针对于整个操作系统的)

    git config --system
    
  2. ~/.gitconfig (很常用,针对于当前用户的所有配置)

    git config --global
    
  3. .git/config (针对于特性项目)

    git config --local
    

Git的提交ID(commit id)是一个摘要值,这个摘要值实际上是个sha1计算出来的

删除(两种方式)

git rm 和 rm的区别
git rm : 
1.删除文件
2.并且将删除的文件纳入到暂存区当中(stage,index)
若想恢复删除的文件需要执行两个动作
1. git reset HEAD test2.txt ,将待删除的文件从暂存区恢复到工作区
2. git checkout -- test2.txt ,将工作区中的修改丢弃掉

rm: 
将文件删除文件,这时候被删除的文件没有纳入暂存区当中  
注意:
这时候如果直接commit,是提示没有修改记录的。
想要纳入暂存区的话,需要使用 git add xxx.txt 把这个文件的删除再加入暂存区。

重命名文件(两种方式)

git mv name1.txt name2.txt  (纳入暂存区的修改名字操作)
回退:
git reset HEAD name1.txt
git checked -- name1.txt

也可以使用操作系统的mv指令,关系和删除是相同的

日志修改

git commit --amend -m 'new message' ##把上次保存的commit消息替换掉

熟练使用命令行,是提升开发效率的第一步。

.gitignore文件

操作的时候自动过滤制定的文件。放置在项目的根目录下

支持全文件名/正则表达式/后缀名/通配符

setting.properties ##删除指定文件
*.b  ##后缀名
!a.b ## !除了什么
/TODO ##仅仅忽略项目根目录下的TODO文件, stu/TODO 这种是不忽略的
/*/TODO ##仅仅删除二级目录下的TODO文件
/**/TODO ##删除所有目录下的TODO文件
doc/*.txt ##忽略doc目录下的.txt文件,但是 doc/a/a.txt 是不会被忽略的
doc/**/*.txt ##忽略doc目录下的所有*.txt
build/ ## 忽略build目录下的所有文件
#xxxx  ## 代表注释

分支 branch

分支的基本使用

查看分支

git branch  ## 查看分支

创建分支

git branch new_branch ##创建分支

切换分支

git checkout new_branch  ##切换分支

删除分支

git branch -d new_branch ## 删除分支,
	## 但是不能删除当前所处的分支。
	## 删除 未被合并的  - 使用大写的  D
	## 删除 已经被合并的 - 使用小写的 d
	## 是为了保护你的误操作。

创建分支的同时,切换到新分支

git checkout -b new_branch

合并分支(先修改,再合并)

git merge new_branch ##合并指定分支合并到当前分支

显示分支的操作

git branch -v  ##显示当前分支最后一次提交的信息(commitId 和 message)
git log
git log -3

分支的本质是什么?

分支:一个commit对象链:一条工作记路线。

每一个分支,会记录上一次的commitID。(工作记路线,时间线)。

再谈分支

  • HEAD指向的是当前分支

    HEAD信息存放在:.git目录下的HEAD文件中

    git reset HEAD filename ##之前使用过的恢复指令
    
  • master指向提交

合并分支

  • Fast-Forward 快进 (没有冲突文件的合并)

    • 如果可能,合并分支时Git会使用fast-forward模式

    • 在这种模式下,删除分支时会丢掉分支信息

    • 合并时加上 --no-ff参数会禁用fast-forward,这样会多出来一个commit id

      • git merge --no-ff dev
        
    • 查看日志

      • git log - -graph
        
  • 出现冲突:conflict. 两个分支修改同一个文件的同一行

    • merge出现冲突
    • 手动解决冲突
    • 使用git add file. 告诉git,你已经解决冲突
    • 使用git commit再次保存. (master上面会出现一个merge的commit记录)
    • ::这时候使用反向合并,还会冲突吗?并不会。因为master分支上面相对于Dev分支多了一个commit记录,Git认为你这个是一个快进操作。
    • 上述理解:用你自己的话就是:再次合并的时候,他们两个的基础是不一样的。意味着:不是同时对同一个文件进行修改的。

创建分支,无非是创建了一个指针。

问题:为什么修改文件之后需要add一下,然后才能commit。(已明白,添加修改到暂存区。)

git commit -am 'commit message' ##添加所有修改文件到暂存区。然后commit。 合二为一

版本回退

git reset --hard HEAD^ ##返回到上次提交
git reset --hard HEAD^^ ##返回到上两次提交

git reset --hard HEAD~1 ##回到第一个提交
git reset --hard HEAD~n ##回到第第n个提交

git reset --hard commitID ##回退到指定commit

git reflg ##查看操作日志

进阶操作

git checkout && git reset 进阶

git checkout -- <file> ## 丢弃指定文件在该空间下的改变
## 丢弃的是未被放在缓存区的改变
## 修改的是工作区,修改的是最后一次的修改

git reset HEAD <file> ## 将之前添加到暂存区(stage、index)的内容,从暂存区移除到工作区

git checkout 最常见的是用在分支的切换上

git checkout -b test ## 创建并切换到新分支
git checkout master ## 切换到master分支
git checkout commitid ## 检出到指定commitID

分支的改名

git branch -m master master2 ##修改分支master为master2

问题:有修改完的代码:如何切换分支。

如何完成临时保存?

##保存现场
git stash ## 保存当前工作区的所有修改。
git stash save 'message' ##保存到临时保存去。并且加注释
git stash list ## 查看保存区的临时修改
##恢复现场
git stash pop ##将上次的临时保存的工作区取出来,并且将临时保存的分支给删除掉
git stash apply ##将临时工作区的内容取出来,但是不删除临时保存的分支
git stash drop stash@{0} ## 删除指定的保存区的存储内容

标签与diff

标签的基本使用

标签不依赖于分支

轻量级标签

git tag v1.0.1  ## 创建轻量级标签

创建一个带有标注性的标签

git tag -a v1.0.2 -m 'desc message' ##创建带有注释的标签

查看版本库中的所有标签

git tag 
git tag -l 'v1,0'
git tag -l '*2'
git tag -1 'v*'

删除标签

git tag -d v1.0.1

git blame 标签的使用

显示上一次对文件修改的作者信息和时间等

git blame <file>

diff标签的使用 (差异性查询)

1.先介绍 Mac自带的diff 比对命令

diff ## 系统自带的命令
diff a b ## 比较文件a 和 b的区别
diff -u a b ## 详细的介绍a和b的区别

diff 属性介绍

--- 原始文件

+++ 目标文件

@@-1,3  +1,3 @@

` ` Hello world ## 没有符号表示两个文件都有的

`-` 表示第一个文件需要删除这一行 就可以生成a

`+`表示第一个文件需要添加的这一行 就可以生成b

所以:- 代表第一行,+ 代表第二行

git diff 命令详解

git diff  ## 默认比较:暂存区和工作区的差别
git diff commit_id ## 工作区和特定的commit_id的差别
git diff HEAD ## 工作区与当前分支的最新提交的代码的比较
git diff --cached ## 暂存区和版本库中的比较
git diff --cached commit_id ## 暂存区和版本库中指定版本的比较

也许你现在用觉得学这些没有用,但是是不是了解了这些多的东西,是不是更能扩大你的思维呢?

你觉得没用,可能是因为你没有见过实际的服务器环境

远程与GitHub

  • push 推送

  • pull 拉取,同时会执行合并merge

    • pull ==fetch + merge :先拉取,再合并

远程版本库:GitHub

内网远程版本库:GitLab

GitHub

官网:https://github.com/

介绍:开源的社交平台。免费无偿使用,代码需要开源。

推荐:学习好使用GitHub之后,就会发现新的世界

git remote add origin ip.... ## 添加远程地址
git push -u orgin master ## 将本地的master提到远端, 并且 -u 是master与仓库里的关联

远程分支:origin

git branch -a ## 查看分支(包括远端分支)
git branch -av ## 查看分支并显示最后一次commitID

分支,指针,指向commit地址

git status 可以查看当前分支和远端分支的版本对比

本地不能直接对远端分支进行操作,如果切换到远端分支,就是对远端分支所指向的commit点来显示给你。

拉取远程仓库地址:

git clone ...地址
git clone ...地址  新项目名

fast forward : 快进

​ 快进是没有冲突的时候的一种状态

git add的三个功能:

  1. 将未追踪的文件纳入缓存区
  2. 将已经被追踪的,修改后的文件,纳入缓存区当中
  3. 冲突修改完毕之后,使用add 来标记你的冲突已经被解决掉了

冲突解决步骤:

  1. 拉取代码的时候出现冲突
  2. 去修改冲突文件
  3. 使用add指令,标记已经修改冲突完毕
  4. 使用commit指令,推送你之前的提交和此次commit时候的合并冲突(所以commit完毕之后比master分支要ahead 2个分支)

vi命令:

dd  ## 删除一行

:2,4d  ## 删除2-4行

vi操作
1.跳到文本的最后一行:按“G”,即“shift+g”
2.跳到最后一行的最后一个字符 : 先重复1的操作即按“G”,之后按“$”键,即“shift+4”。
3.跳到第一行的第一个字符:先按两次“g”,
4.跳转到当前行的第一个字符:在当前行按“0”。

GUI(在熟悉Git命令和参数之前,尽量不要使用GUI)

GUI(图形工具)

Gitk(图形工具)

GItHub Desktop (图形工具)

Git合并原则:Git遵循着一个三方合并的原则

CommitID的生成策略是:SHA1

Git别名:

本质:字符串的替代

git config --global alias.br branch ## 使用br代替 branch
存在 ~/.gitconfig 文件里面

常用的:
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.unstage 'reset HEAD'
git config --global alias.ui '!gitk' ## 调用外部命令

git refspec

refspec 本质:本地的分支和远程分支上的对应关系

创建远端分支
新版本
git push --set-upstream origin develop ## 将本地的分支推送到远程,并且建立对应关系

旧版本:
git push -u origin test ## 将本地的推送到远程,并且建立对应关系

创建本地分支和远端分支名字不同的分支
git push --set-upstream origin develop:develop2 ## 源分支:远端分支
上述分支创完远端分支之后,本地分支不能直接push到远端分支那个上面
(建议同名)。
git push origin HEAD:develop2
关联远端分支
新版本
git checkout -b develop origin/develop ## 创建一个develop分支追踪远端的develop分支

旧版本:
git checkout --track origin/develop ## 创建一个develop分支追踪远端的develop分支
删除远端分支
旧版本:
git push origin :develop ## 推送一个空的分支到远端分支。
 
新版本:
git push origin --delete develop ## 删除远端分支

几个重要的点:

git push 的完整写法:git push origin srcBranch:destBranch

pull 操作的完整命令:git pull origin srcBranch:destBranch

HEAD标记:HEAD文件是一个指向你当前所在分支的引用标识符,该文件内部并不包含SHA1值,而是一个指向另外一个引用的指针

当执行git commit 命令时,Git会创建一个commit对象,并且将这个commit对象的parent指针设置为HEAD所指向的引用的SHA-1值

我们对于HEAD修改的任何操作,都会被reflog给记录下来

查看远程HEAD

vi .git/ORIG_HEAD ##查看远程HEAD
vi .git/FETCH_HEAD ##查看拉取的HEAD 

远端分支重命名:只能先删除远端分支,然后重新推送远端分支

本地分支:本地远程分支:远程仓库的分支

Git的高级命令(我们常用的所有命令都是高级命令)和底层命令(Git的基础)

底层命令

git symbolic-ref HEAD  ## 读取文件的底层命令
git symbolic-ref HEAD refs/heads/develop  ## 

标签和远程标签

在远端仓库中: released就是代表的标签

git tag ## 查看所有的标签
git tag v1.0 ##创建轻量级标签
git tag -a v2.0 -m 'v2.0 released' ## 创建嗲注释的标签
git show v1.0 ##查看指定标签的信息
git tag -l '?2*' ##模糊查询标签 

将标签推到远程仓库

git push ## 默认不会推送标签,只会推送分支
git push origin v1.0 ##推送指定标签到远程
git push origin v1.0 v2.0 v3.0 ##批量推送指定标签
git push origin --tags ## 一次性推送所有的标签 

推送标签的完整语法
git push origin refs/tags/v7.0:refs/tags/v7.0	

获取远程标签

git pull ##拉取的时候会获取所有的标签

拉取指定标签
git fetch origin tag v7.0 ## 拉取指定的标签

删除远端标签

1. 在远端仓库直接点击删除按钮。
2. 推送一个空的源标签推送到远程,就删除了。(方法和分支类似)

git push origin :refs/tags/v6.0  ##通过本地命令删除远端标签
git push origin --delete tag v5.0 ## 方法2:通过本地命令删除远端标签

git tag -d v5.0 ##删除本地tag标签
  1. 在缺省情况下,refspec会被git remote add 命令所自动生成。Git会获取远端上refs/heads下的所有引用,并且将他们写到本地的refs/remotes/origin目录下,所以如果远端上有一个master分支。可以通过以下方式去查询远端分支的历史记录。

    - git log 
    - git log origin/master
    - git log remotes/origin/master
    - git log refs/remotes/origin/master (最全面的写法)
    

.config文件里面的信息

git fetch = +refs/  ## 这个加号,如果加上是 就算不能快进也可以拉取代码

refs文件 (refspec的缩写),存放的是所有远端分支

关于已经被删除的分支

A 在本地删除远端分支,B 在本地的远端分支还在

B这个时候拉取是不行的,会提示 无法拉取原单分支。

git remote prune  ## (裁剪:删除本地多余的 远端分支)

Git gc

git gc会用的很少,大部分会在底层自动执行

作用:打包,压缩 ,对对象进行压缩

手动执行之后的效果:目录下的refs文件就会都不见了(被压缩到 packed refs文件里面了)

Objects/ 目录:就是每次压缩的时候所存放的目录

关于Git的所有操作和文件,都存放在.git的目录里面


复盘已经学习的

关于删除

使用 git rm 删除文件,包括本地和Git跟踪

使用git rm --cached 删除缓存区的文件,不删除本地文件

删除远端仓库

git remote rm origin ##

git remote show origin ##展示远端仓库信息

关于重命名

关于重命名文件

使用 git mv hello.txt hello2.txt

相当于:

1. mv hello.txt hello.txt
2. git rm hello.txt
3. git add hello2.txt

关于重命名远程仓库

git remote rename origin origin2

Git裸库与submodule

Git裸库

Git 裸库: 没有工作区的仓库(一般在服务器端使用Git裸库)

创建裸库:git init --bare

Submodule 子模块

出现的缘由:开发项目的时候,这个项目依赖于其他项目。需要把子项目的源码也依赖到当前开发的项目当中

添加子模块

git submodule add 子模块的地址 mymodule ## 拉取子模块的代码到 mymodule文件中							

添加完之后会自动生成两个文件: .gitmodules 和 mymodule文件夹

此时两个文件就已经相互包含了。在GitHub仓库里面也能够识别。

父项目获取子模块的最新代码

  1. 进入子模块的目录,执行git pull
  2. 直接在父目录,执行git submodule foreach git pull

子模块修改之后,需要在父模块进行提交子模块的修改

其他人如何克隆

方法一:

  1. 在使用git clone直接克隆父模块的时候,子模块是空的
  2. 使用git submodule init进行初始化
  3. 递归更新 git submodule update --recursive
  4. 就OK了。子模块的内容就拉取下来了。

方法二:

使用 git clone 仓库地址 存放地址 --recursive 一步完成

删除子模块

  1. 没有提供直接的命令去删除。自己使用基本命令去完成。
  2. 删除暂存区的内容 git rm --cached mymodule
  3. 删除存在的文件rm -rf mymodule
  4. 执行commit~
  5. 删除没用的 .gitmodule 文件 (步骤同上)
  6. 删除没用的配置文件(步骤同上)

Git subtree

使用git subtree查询subtree的使用帮助文档

功能和之前介绍的git submodule一样,但是submodule存在着很致命的弊端。在主工程中修改子工程的代码。可能会造成很多很多的问题。submodule也没有提供删除操作。所以在后续版本中添加了git subtree

git subtree的使用也比较简单,也很容易的实现父模块和子模块的双向修改。官方推荐使用subtree替换submodule.

如何使用

  1. 准备两个仓库,父模块和子模块

  2. 添加一个新的远程库。(subtree-origin)

  3. 添加子模块到父模块:

    git subtree add --prefix=subtree subtree-origin master --squash
    #功能描述:添加远端仓库`subtree-origin` 的`master分支`到本项目的 `subtree`目录下
    #PS:`--squash `合并压缩之前的所有commit为一个。
    

subtree和submodule的区别
submodule是使用指针指向子模块的目录

subtree是将代码真真正正的放在父模块中

修改子模块之后如何更新

git subtree pull --prefix=subtree subtree-origin master --squash

在父模块修改完子模块之后,如何同时提交两个仓库

  1. 如果使用git push默认只是推送父模块一个项目
  2. 使用git subtree psh --prefix=subtree subtree-origin master 推送子模块

遇到问题:最好深入底层的去了解为什么会发生这样的问题,然后解决。

备注:git push --set-upstream origin master 推送当前分支到远端分支

或者:git push -u origin master 推送当前分支到远端分支

vi操作
1.跳到文本的最后一行:按“G”,即“shift+g”
2.跳到最后一行的最后一个字符 : 先重复1的操作即按“G”,之后按“$”键,即“shift+4”。
3.跳到第一行的第一个字符:先按两次“g”,
4.跳转到当前行的第一个字符:在当前行按“0”。

深入Git subtree的底层

添加subtree

git subtree add -P subtree subtree-origin master --squash
git subtree add --prefix subtree subtree-origin master --squash
git subttee add --prefix=subtree subtree-origin master --squash

#上述三种方式等价 	 使用 git subtree查看帮助能够看的到

在子模块修改subtree之后,在父模块获取

(注意:squash 要使用的全局都使用)

git subtree pull -P subtree subtree-origin master --squash

在父模块修改subtree之后,在父模块提交substree

git subtree push -P subtree subtree-origin master 

直接push所有的内容到父模块

git push

父模块提交过之后,在子模块修改,再在父模块拉取代码,就会出现冲突

从理解上,应该不会冲突。但是产生冲突了

使用 git status查看冲突位置

解决冲突,上传。但是会提示什么都没有修改

这时候再去修改subtree项目的文件,push

然后再去父模块拉取代码,这次就会成功了。

问题:为什么有时候会出现冲突?有时候不会出现冲突?

根本原因还在:squash这个参数。

因为使用了squash,导致三方合并的commit记录寻找不到。所以就会出现冲突

但是:squash 不论用不用,在子模块修改完第二次之后,在父模块修改的第一pull就会出现问题。

所以:要么全程都使用squash,要么全程都不使用squash

**substree spilt **

拆分子模块 git substree spilt 之前里面携带的commit记录,也会携带出来

用的不多,也有很多不方便的地方。比如:同时修改了子模块和父模块,是没办法区分子模块的

squash 参数详解

--squash合并压缩之前的所有commit为一个。

合并压缩之前的所有commit为一个提交。(之前的每个commit记录都会消失)

主仓库中是看不到squash之前的commit的,所以容易导致出现修改子模块的时候出现问题。

作用:防止subtree的commit记录污染了父模块的记录

引起的问题: 合并commit记录之后,导致三方合并不能够正常进行

为什么使用和不用squash都可能会冲突?(使用图形化界面可以合理的看出来原因)

  1. 找到冲突的根本原因(合并的时候没有共同的祖先)

    image-20200119065416851

    三方合并的时候,虽然A B 有一个共同祖先,但是A的上面还有一个祖先。

    往上追溯的时候,会发现他们的根本根源是没有交集的。所以在合并的时候不满足三方合并,所以就可能出现冲突。

总结:如果一开始就是用了squash的话,请一直使用,如果不使用的话,就都不要使用。

学习重要且常见的命令和参数

对于技术的理解越深入,你对其他技术的了解学习的也就越快

张龙老师应该是全网目前将的最系统,最深入,最完整的课程

Git会伴随你的开发生涯。

Git cherry-pick

功能描述:将这个分支上的commit记录,应用到另外一个分支上。很简单但是很有用。

如:develop改了c1,c2, 但是c1 c2 应该上master的。最笨的办法就是手动拷贝出来,然后删除本地的提交,提交在其他地方。

cherry-pick就是为了解决这种问题而存在的。

主要应用在本地分支上。

语法:

git cherry-pick commitid  ## 将指定的commitID的记录,放入到当前分支上。

如果有两个commitid,是否能够直接只截取最后一条,而不是按照之前commit的顺序去提交?

可以,但是会冲突。正常解决冲突就好了。

如果按照顺序,就不会用冲突。

在源分支上的 commit,还是存在的。 使用 checkout去恢复。

充分利用Git提供的解决方案去解决我们的问题

Git rebase原理深度剖析

rebase:变基 (衍合):改变分支的根基

要完成的功能类似于merge的功能,从某种程度上结果相同,但是执行原理完全不同。

image-20200119161128340

在A分支上,执行git rebase B 效果图如上

注意:

  1. rebase过程中也会出现冲突
  2. 解决冲突之后,使用git add添加,然后执行 git rebase --continue
  3. 接下来Git会继续应用余下的补丁。
  4. 任何时候都可以通过git rebase -- abort命令终止rebase,分支会恢复到rebase到开始前的状态

rebase的最佳实践

  1. 不要对master分支执行rebase,否则会引起很多问题

  2. 一般来说,执行rebase的分支都是自己的本地分支,没有推送到远程版本库

    因为如果你已经上传,绝对不要使用git rebase,别人可能已经拉取了你的分支。历史应该是快照,不应该被修改。

    rebase是会修改历史记录的。

    如果已经合并到远程,请老老实实的使用git merge合并就行。

rebase是先将要变基的内容,以补丁的形式打包。然后添加到指定基础的分支的后面。

在执行git gc的时候,会清理掉补丁。 补丁存放在rebase-apply 目录下

在出现冲突的时候

  1. 使用 git rebase --skip : 丢弃到当前的补丁:是以 目标分支为准。跳过冲突的部分
  2. 使用 git rebase --abort: 是取消掉所有的rebase操作。恢复最开始的分支

Git merge:历史发生,就不能修改

Git rebase:历史可以被修改,只显示最好的

所以:视情况而定,因人而异

Intellij IDEA使用详解

  1. 收费,不要去推广盗版和破解版
  2. 官网 还有很多其他好用的工具
  3. 自己使用,熟能生巧

构建基于Gradle的工程

基于groove的脚本语言来编写和配置的

优势:兼容Maven

官网

1.下载 2.配置

文档:很好,涉及了方方面面 点击跳转

DSL:领域特定语言。需要对groove语言有所了解

应用:

  1. 新建项目
  2. 配置文件的语法
  3. 如何使用私服仓库
  4. 如何添加依赖jar包
  5. jar包存放位置: ~/gradle
  6. gradle命令
  7. groove语法
  8. Gretty插件(自带Tomcat插件,jetty,热部署等)

Gradle Web工程与Gretty详解

  1. 自行研究一下 gretty (github )
  2. 基本使用
  3. gretty的配置
  4. 远程调试的概念和使用 (Java调试架构,Tomcat的底层也是Java调试架构)idea-remote
  5. Java的调试架构 (也可以支持远程调试) 代码和运行环境不在同一台机器上的情况下使用

不要将自己的目光放在你当前的项目组,放眼去望。不要闭门造车

Git、Intellij IDEA与Gradle的整合

  1. 现成的工程(gradle工程)
  2. 明确哪些需要放入git,哪些不需要放入git
  3. build.gradle / setting.gradle / src目录 ,只有这三个需要放进去
  4. 建议 .gitignore

阿里云ECS详解

ESC(弹性计算服务)

github 服务器在国外,相对慢

gitlab 安装在Linux上面。 阿里云ECS(弹性计算服务)云服务

很多很多的创业型公司,都在使用云服务器,都不会去购买自己的服务器。因为便宜。

官网:www.aliyun.com

购买云服务器

SSH - 连接购买的 Linux系统,(centOS 7 )

Linux服务器的使用

命令操作

Linux学,不要怕,去积累,慢慢学。没别的办法。

GitLab安装与部署以及疑难问题解析

Gitlab官网

国内大部分公司都在使用GitLab来托管代码

GitLabCE 社区版 (大部分使用这个)

GitLabEE 企业版

  1. 下载安装 ()
  • 安装和配置必要的依赖

    • 反向代理
    • Redis
    • 邮件系统(Postfix, Sendmail)
    • curl
    • openssh
  • 开启防火墙 HTTP/SSH (在ESC上可能会出现防火墙的问题)

  • 执行脚本的时候,下载GitLab源的时候就会出问题。(需要手动下载rpm文件-对应centos7)

  • 然后通过 scp 的方式,将本地下载的GItLab包上传到阿里云的ECS上

    • 通过命令,再进行安装
    • 配置重启 GitLab
    • 修改必要的配置:默认的HTTP的地址,不是IP地址也不是域名地址。

    因为中国GMW禁用。

    GitLab是Ruby语言写的

  • 访问IP登录。 设置登录限制,是否允许注册等等。

  • 一般内网是不允许自己注册的。

  • GitLab的功能是非常非常强大的。(项目,用户,组的管理)

GitLab使用详解

  1. 项目放在Group当中,方便管理
  2. 其他操作和GitHub相同
  3. 需要自己搭建一个仓库
  4. 然后去操作。
  5. wiki
  6. 持续集成 Jenkins组件搭配
  7. Graphs等

Git 回顾总结

30多讲和周边内容的介绍和学习,成为了一个能使用Git进行日常开发和托管-合格的使用人员

本地操作 - 命令行

add mv rm 基本操作

.gitignore 忽略文件

git branch :检出,合并,切换,推拉

git stash:暂存

git remote操作

github

远程协作模型、分支最佳实践

别名,alias设定

GUI工具,git gui, gitk

git refspec : push pull 分支映射的一些操作

.git目录下的文件和作用

git gc

git裸库,submodule ,subtree

git cherry-pick

git rebase

idea

greadle/getty

git/idea/gradle

ECS

gitlab

markdown

gitbook.com (电子书出版领域的标准) Word是最low的方式

自我Git命令汇总

记录自己能够用到的功能的命令

git init  ## 初始化仓库
git remote add origin address ##创建远端地址
git remote remove name ## 删除远端地址
git commit -m 'message' ## 提交一次commit
git rm test.txt  #删除一个已经存到缓存区的文件
git add .  ## 提交一次修改
git reset HEAD test.txt  ## 将已经保存到暂存区的内容撤回到工作空间
git branch develop ##创建分支
git checkout develop ##切换分支
git checkout -b new_dev ##创建并切换到Dev
git checkout - ##切换到上一次所在的分支	
git config alias.co 'checkout' ## 定义别名
git merge branchname ## 合并指定分支到当前分支
git stash ##将暂时修改未提交的内容,暂存到一个分支
git stash pop ##返回上次暂存的一些内容
git checkout -- test.txt ##将指定文件返回到最初始未修改的状态
git tag ##查看标签
git tag v1.0 ##创建标签
git tag -d v1.0 ##删除指定标签
git checkout v1.0 ##切换到指定标签
git blame <file> ##查看指定文件的修改人员信息详情

.gitignore 文件的配置规则

gitbook的使用

原文地址:https://www.cnblogs.com/bigbaby/p/12173785.html