当前位置:   article > 正文

22-07-14 西安 Git 分布式版本控制系统 、代码管理_分布式代码管理

分布式代码管理

GIt的准备工作

1、Git对比SVN

Git是目前世界上最先进的分布式版本控制系统,Git可以做源代码管理

所有的版本控制系统,其实只能跟踪文本文件的改动,图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化

集中式版本控制工具 :SVN

  1. 版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器下载最新的版本,然后开发代码,写完代码后需要把自己的代码推送到中央服务器。
  2. 缺点是,就一台服务器,服务器单点故障,容错性差。怎么解决:集群(去中心化)

分布式版本控制系统Git 根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库

分布式版本控制工具 :Git

分为本地仓库和远程仓库,每个人都要维护好自己的本地库

  1. 本地仓库:是在开发人员自己电脑上的Git仓库
  2. 远程仓库:是在远程服务器上的Git仓库
  3. 优点是,容灾能力强,本地版本管理,异地协作,灵活分支

分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已


2、Git安装

下载Git  https://git-for-windows.github.io/ 

安装完成后,在任意的文件目录下,右键都可以开打Git的命令行窗口——Git Bash Here


3、TortoiseGit

下载地址: TortoiseGit – Windows Shell Interface to Git

中文语言包

在空白处点击鼠标右键,选择 --> TortoiseGit --> Settings,然后就可以看到配置界面:

选中General,在右边的 Language中选择简体中文(当然,你也可以继续使用英文)。

取消勾选升级检查的复选框,可能还需要指定 git.exe 文件的路径,如 “D:\Program Files\Git\bin”。完成后,点击应用,确定关闭对话框


4、设置全局用户签名

Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识,即:用户签名

签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。

配置语法如下:

  1. $ git config 配置文件作用域 user.name '用户名'
  2. $ git config 配置文件作用域 user.email '邮箱地址'

注意:这里设置用户签名和将来登录GitHub(或其他代码托管中心)的账号没有任何关系。

设置全局用户签名

  1. git config --global user.name "用户名"
  2. git config --global user.email "用户邮箱"

全局,就是只要用我电脑提交代码,都会是这个签名

怎么看成功没?查看配置信息

git config --list

比如我这么设置,查看配置信息后效果如下

实际上,全局用户签名保存在了 .gitconfig文件,可视化,可以方便修改

在当前登录的系统用户路径下,通过环境变量%USERPROFILE%就可以获取了

生成~/.gitconfig隐含文件,

里面可以看到刚刚设置的信息。

提示:如果不用git config 命令设置,也可以直接打开文件进行设置

配置本地库用户签名

如下,我配置俩个(为了测试合并分支冲突)

  1. # 注意如果是配置local配置文件签名,可以省略--local参数
  2. git config --local user.name 'xym'
  3. git config --local user.email 'xym@126.com'
  4. git config --local user.name 'baoe'
  5. git config --local user.email 'baoe@126.com'

本地用户注册信息,会写到当前版本库目录下的.git目录中的config文件中

查看仓库级别的配置信息

git config --list --local

5、工作区、版本库、暂存区

工作区:项目的当前目录(放代码的地方)

版本库:工作区有个隐藏目录.git,它就是Git的版本库,不具备共享的能力,代码放到版本库,才能和远程仓库关联。

暂存区(stage):存放在".git目录"下的index文件中,暂存区有时也叫作索引库(index),临时存储我们的代码,想把工作区的代码放到版本库,必须要过暂存区

暂存区和版本库是有快照的。发现有问题,可以版本切换,进行版本穿梭


6、ssh模式和https模式

ssh模式比https模式的一个重要好处就是,每次push,pull,fetch等操作时不用重复填写用户名密码。前提是你必须是这个项目的拥有者或合作者,且配好了ssh key

为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。

步骤1、检查电脑家目录下%userprofile%是否已经生成了SSH key,如果有.ssh目录删除即可

步骤2、创建SSH Key : ssh-keygen -t rsa -C lisiatguigu123

然后一路回车(3次),给账户生成公钥和私钥

步骤3、成功的话(执行命令不需要输入任何内容),会在用户主目录下生成.ssh文件夹,查看生成两个文件

这两个就是SSH Key的秘钥对,

  • id_rsa是私钥,不能泄露出去,
  • id_rsa.pub是公钥,可以放心地告诉任何人。

打开id_rsa.pub,复制里面的内容,到gitee上

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC+v9YMeJEDdiWno/htJLyWQ/lCr1cxfucEN0eXcMK0EwgRg3QxhYVZ7rGgdJe09GUgVGZvqY/yb/VuRdHkaJmnU/PphhXsCg+ShtctRryvn/1/jvLxKm6m471asBwrqjCRZSnzEP4haPoesDvkbFz2nIuAmJARkjTW3yw5XLvV4WaAN7GxhkTPZTSMw1xWX9z+zOaRBFmA0NdLHK6c76ux2lofMNrFCA5n2UxzGuI+ykzrIIaCnAfsabYSNYi4SkfFok1EVxxgTye9kX2OUUUnDKLoyxCEwCyx9ZPfAFzcMGQ4vHci4bfRKvv1dEnaPCP9+hDnF0cobhcyTDXQ1qu4H7G7mTp+L1m+jX3U16sWHx0pXf8ZLNkmYAY6oN2n8iF83UPOYHzWyI0OV1MVGJGHNwSRAAhvEdncEpH29NlKUmR3KPtQqtWBc/5DmenMqESClZiW8gcG3zJrIpLdzHMe4HS9n8hT460QfvQqvztisByQ7gGQ49lXmsLJZ+DKuAs= shiyulong520

在远程库-用户-设置 -ssh公钥

不需要输入密码

起别名,

新建一个b.txt,add,commit,push到远程仓库

git push originssh hotfix

结果报错了??


7、.gitignore文件

.gitignore 文件是 Git 版本控制系统中的一个特殊文件,用于指定哪些文件或目录在提交到版本库时应该被忽略。通常情况下,开发项目中会有一些不希望被版本控制的文件,比如临时文件、编译生成的文件、日志文件等,这些文件不需要被追踪和管理,因此可以将它们列在 .gitignore 文件中,告诉 Git 忽略这些文件。

.gitignore 文件的位置

.gitignore文件一般放在git仓库的根目录下面,但如果其它子目录下面有需要个性化的定制,在子目录下面也可以放.gitignore文件。

高层目录中.gitignore文件的模式会被子目录中.gitignore文件的模式覆盖。

为什么要忽略他们

  • .idea 文件夹下的文件(无效的文件)
  • maven工程的targert目录

与项目的实际功能无关,不参与服务器上部署运行。把它们忽略掉能够屏蔽IDE工具之间的差异。


8、引入忽略规则文件

创建忽略规则文件(git.ignore)
这个文件的存放位置原则上在哪里都可以

为了便于让~/.gitconfig文件引用,建议也放在用户家目录下

注意不要在一行里写,要换行顶格。git.ignore文件内容如下:#是注释

  1. # 忽略所有 .class 文件
  2. *.class
  3.  
  4. # 忽略所有 .log 文件
  5. *.log
  6.  
  7. # 忽略所有的 target 目录
  8. target
  9. # 忽略所有的 .idea 目录
  10. .idea
  11. *.iml
  12. # BlueJ files
  13. *.ctxt
  14.  
  15. # Mobile Tools for Java (J2ME)
  16. .mtj.tmp/
  17.  
  18. # Package Files #
  19. *.jar
  20. *.war
  21. *.nar
  22. *.ear
  23. *.zip
  24. *.tar.gz
  25. *.rar
  26.  
  27. # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
  28. hs_err_pid*
  29.  
  30. .classpath
  31. .project
  32. .settings

.gitconfig文件中引用忽略规则文件

这里要使用“正斜线(/)”,不要使用“反斜线(\)”

  1. [core]
  2.         excludesfile = C:/Users/Lenovo/git.ignore


Git基本使用

1、初始化版本库

要使用Git对我们的代码进行版本控制,首先需要获得Git仓库,获取Git仓库通常有两种方式

方式1:在本地初始化一个Git仓库

​​​​​​​git init

方式2:从远程仓库克隆,如

git clone https://gitee.com/javacoo/CowSwing.git

本地初始化操作步骤

git init  通过该命令创建本地库,会在当前目录产生.git隐藏文件夹。

它会在当前目录下生成一个.git子目录,在其中写入git的配置和项目的快照。


2、查看文件的状态

untracked files  未跟踪(红色),意思是git就没管理它,它和git没有半毛钱关系
文件名是 绿色,表示已经管理到暂存区,还未提交到本地库
--------
Modified 已修改状态(红色和绿色) ,代码改了没放到本地库。红色在工作区,绿色在暂存区。

Git工作目录下的文件状态信息:

git status

Untracked 未跟踪(未被纳入版本控制)

Tracked 已跟踪(被纳入版本控制)

Unmodified 未修改状态

Modified 已修改状态

Staged 已暂存状态

这些文件的状态会随着我们执行Git的命令发生变化

红色表示新建文件或者新修改的文件,都在工作区.

绿色表示文件在暂存区

新建的文件在工作区,需要添加到暂存区并提交到仓库区

新建并编辑文件a.txt

touch a.txt

vim a.txt

此时使用git status 查看

如果使用 git status -s 命令或 git status --short 命令,将得到一种格式更为紧凑的输出。


3、添加Git暂存区

用“git add”把文件纳入Git管理,实际是把本地文件修改添加到暂存区或者跟踪一个新建的文件

git add 文件名   //添加到暂存区

git add 命令使用 文件 或目 作为 参数是目录 ,该命令 递归 该目 下的所有 文件

git add .     //添加项目中所有的文件

git add a.txt 添加到暂存区

git status

初始化不会有暂存区index文件,add a.txt后才有

git  reset  <文件名称>  重置一定注意写清楚文件名

git reset a.txt    撤销暂存区的文件(退路)


Git版本库

1、提交Git版本库

用“git commit”提交更改,实际上就是把暂存区所有内容提交到当前分支

git commit -m "日志信息" 文件名     || 提交到本地库,日志内容可以双引号也可以单引号

commit 会生成一条版本记录,add只是添加暂存区,不会生成版本记录

git commit -m "新建a.txt文件-master" a.txt  

如果你觉得 git add 提交缓存的流程太过繁琐,Git 也允许你用 -a 选项跳过这一步。命令格式如下

  1. //添加和提交合并命令
  2. git commit -am "注释内容" 

commit 命令的 -am 参数等价于执行了下面两个命令

  1. # 将已被跟踪的文件提交到暂存区
  2. git add -u
  3. # 将暂存区中的文件提交到本地库
  4. git commit -m <message>

commit -am注意,后面不能写文件名,会都add/commit
commit -am是前提已经添加过的,新创建的文件c.txt不行


2、重新提交(补救)

有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选 项的提交命令来重新提交:

--amend参数用于撤销上一次 commit,然后生成一个新的 commit。

git commit --amend - m "new commit message"

完全用一个 新的提交 替换旧的 提交, 理解这一点非常重要。从效果上来说,就像是旧有的提交从未存在过一样,它并不会 出现在仓库的历史中。


3、查看提交内容

如果日志很多,可以在一行显示

git log --pretty=oneline

查看指定commit hashID的所有修改

git show commitId


4、查看提交差异

git diff [commit1] [commit2] — [path]:该命令可以显示两个提交之间指定文件的差异。


5、查看已提交未推送

git cherry -v


版本回退与穿梭

1、版本的回退

不方便,只能退,不能回去
一次回退一个版本,一个^代表一个版本数量

git reset --hard HEAD^  

回退n次操作

git  reset  --hard HEAD~n

2、版本穿梭(用的多)

查看历史操作,然后进行版本穿梭

  1. git reflog a.txt
  2. git reset --hard 版本号


3、撤销checkout / reset

前提:未add,未commit(不常用)
git checkout -- a.txt(等价于idea的ctrl+Z)

前提:已add,未commit
git reset <文件名称>


4、删除(处处留痕)

创建a.txt,在里面添加内容,并把它提交到本地库。

1、此时再在工作区里看看a.txt,他还是存在的。 

2.一不做二不休,把工作区的a.txt删除。此时再次查看a.txt,就找不到这个文件了

3.git status,查看

现在有俩种选择

选择一:删错了,可以从版本库里恢复最新的文件

git checkout 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

选择二:确定要从版本库中删除该文件

  1. rm a.txt
  2. git add a.txt
  3. git commit -m "remove a.txt"


Git分支

1、分支基础命令

分支(Branch):分支是保存代码的区域。

几乎所有的版本控制系统都以某种形式支持分支,使用分支意味着你可以把你的工作从开发主线上分离开来(代码分类),以免影响开发主线。

Git 的master分支并不是一个特殊分支。 它跟其它分支没有区别。 之所以几乎每一个仓库都有 master 分支,是因为git init 命令默认创建它,并且大多数人都懒得去改动它。

仓库中有很多个分支(分支就是子目录

命令名称

作用

git branch 分支名

创建分支

git branch -v

查看分支

git checkout 分支名

切换分支

git merge 分支名

把指定的分支合并到当前分支上

git checkout -b <name>创建+切换分支
git branch -d <name>删除分支

git branch -a 查看所有分支


2、切换分支

在切换分支前:

要留意你的工作目录和暂存那些还没有提交改, 它可能会和你出的分支生冲突从而Git 切换到该分支。

最好的方是,在你切换分支之前,保持好一个干净的状态

暂存 stashing)法 可以绕过这个问题
  1. # 查看栈中保存的更改
  2. git stash list
  3. # 将当前工作区和暂存区的更改保存到一个栈结构
  4. git stash
  5. # 将当前工作区和暂存区的更改保存到一个栈结构,并附带一个信息
  6. git stash save "message"
  7. # 查看栈中第一个更改的具体内容
  8. git stash show
  9. # 查看栈中指定的更改的具体内容
  10. git stash show <stash id>

默认情况下,git stash会缓存下列文件:

  • 添加到暂存区的修改(staged changes)
  • Git跟踪的但并未添加到暂存区的修改(unstaged changes)

但不会缓存以下文件:

  • 在工作目录中新的文件(untracked files)
  • 被忽略的文件(ignored files)

贮藏(stash)会处理工作目录的脏的状态——即跟踪文件的修改与暂存的改动——然后将未完成的修改保存到一个栈上, 而你可以在任何时候重新应用这些改动(甚至在不同的分支上)。

  1. > # 将栈中的第一个更改恢复到当前工作区和暂存区,同时删除栈中的第一个更改
  2. > git stash pop
  3. > # 将栈中的指定的更改恢复到当前工作区和暂存区,同时删除栈中的指定的更改
  4. > git stash pop <stash id>

当我们在某一条分支上开发新功能时,突然有个紧急的错误需要修复

这时,我们不得不暂停手头上的工作,切换到另外的分支去修复错误

但是,新功能做到一半,既不能提交,也不能删除,那该怎么办呢

我们可以先把当前的更改保存起来,等处理完错误后再恢复出来,git stash 就是这样的一个用法

它可以将工作区和缓存区的更改保存到一个栈结构中,等后面需要的时候再恢复

  1. > # 清空栈中保存的更改
  2. > git stash clear

3、分支删除

删除本地分支:

git branch -d department-dev

如上删除本地department-dev分支,不能删除当前所在的分支,如果要删除,必须先切换到其他分支上


4、HEAD指针

​​​​​​​Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

HEAD指向的就是当前分支

  • HEAD如果指向master,那么我们现在就在master分支上。
  • HEAD如果指向hotfix,那么我们现在就在hotfix分支上。

所以切换分支本质就是移动HEAD指针

HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长

----------------------

创建一个新的dev分支的时候,此时,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变

---------------------

合并分支

dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并

--------------------

删除分支

删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支


5、分支合并

把指定的分支合并到当前分支上

git merge 分支名

分支合并冲突:修改同一个文件的同一时会发生分支合并冲突

合并分支时,两个分支在同一个文件同一个位置有两套完全不同的修改。Git无法替我们决定使用哪一个。必须人为决定新代码内容。

怎么制造冲突

这里我犯过一个错,我先在hotfix分支修改了a.txt文件,然后没添加暂存区也没提交到本地仓库,我就直接切换回到master分支了,我还很蒙蔽,怎么master分支的a.txt也改了呢?

其实要是在hotfix中add,commit以后再切换,master分支中是看不到的a.txt有修改的

正确的制造冲突

第一步:在hotfix分支修改a.txt文件并add,commit.不会报错,接着切换到master分支

第二步:在master分支修改a.txt文件并add,commit,不会报错。

第三步:把hotfix分支合并到master分支,此时会报错冲突

Git会找出来并提示。

Git使用“<<<<<<<、=========、>>>>>>>>>>”符号帮我们标记出来,现在产生冲突的内容。

vim a.txt,打开发现文件是这样的 

冲突的解决

①编辑有冲突的文件,删除特殊符号,决定要使用的内容

②添加到暂存区。对每个文件使用 git add 命令来其标冲突已解。 一暂存这些原本有冲突文件Git 会将冲突已解        

③执行提交(注意:使用git commit命令时不能带文件名)

此时杀个回马枪,我们切换到hotfix分支,看看a.txt文件的状态,再次合并就不会产生冲突了

容易冲突的操作方式

多个人同时操作了同一个文件
一个人一直写不提交
修改之前不更新最新代码
提交之前不更新最新代码
擅自修改同事代码

减少冲突的操作方式

养成良好的操作习惯,先`pull`在修改,修改完立即`commit`和`push`
一定要确保自己正在修改的文件是最新版本的
各自开发各自的模块
如果要修改公共文件,一定要先确认有没有人正在修改
下班前一定要提交代码,上班第一件事拉取最新代码
一定不要擅自修改同事的代码


IDEA中集成Git

1、git 版本控制,引入git.exe

可以点击右边的“test”按钮,会弹出如下框就好了


 2、初始化本地库

这一步,相当于git init,创建 本地仓库

VCS  版本控制系统


创建Git仓库,自动定位到我的项目,直接点击OK

效果就是出现红色文件(自动状态检查)和出现.git文件夹


3、添加暂存区

右键操作对象(可以是一个目录,也可以是一个单独文件),操作的效果文件会变成绿色


4、添加本地仓库

也是右键选择Git,Commit File或者是Commit Directory

接着点击【Git--》【Commit Directory】在打开的窗口中选择要上传到本地仓库的代码并添加注释后提交到本地仓库内。

 terminal窗口可以写git的命令


5、idea中分支操作

查看当前所在分支
在IDEA窗口右下角 -master

------------

新建分支hotfix

-----------------

合并分支

文件名字是蓝色的-表示已经add过了,可以直接提交到本仓库


6、idea 合并分支,发生冲突

在和远程库交互过程中也有可能发生冲突,因为解决办法一样,所以这里按照分支操作过程中产生的冲突来演示。

冲突指在同一个文件在同一个位置有不同内容。

合并分支的时候可能会有冲突:


我们把hotfix分支合并到master分支时,会弹出一个框,直接双击

直接双击,就会出来一个相当友好的界面。点击我红色框圈住的箭头或叉号,好了之后点击应用会

自动提交,重要的事情说三遍,会自动提交!会自动提交!会自动提交!

  此时,master分支里是我们处理共的代码了

再切换回去到hotfix分支

 此时再把master分支合并到当前的分支hotfix

请问会产生冲突吗?不会。虽然我觉得难以理解,就当是这个冲突已经处理过了吧


7、配置远程仓库

安装Gitee插件


add account


邮箱+密码登录(不是用户+密码)

 确认后效果如下:


8、通过idea创建远程仓库

分享工程到 gitee        

接着会弹出一个框

通过idea创建远程仓库

 要推送其他的分支master到远程仓库,先从hotfix分支切换到master分支,再项目上右键-仓库-push

要拉取的话,和push一样,这回选择pull,因为在idea中我在master,所以拉取时默认选择的也是远程仓库的master分支


9、亲测有效

做尚医通项目的时候跟东哥学到的。前4步没变,在项目上右键add、commit之后 ,再

1. 右击项目点击【Git】--》【Repository】--》【Remotes...】。在打开的【Git Remotes】窗口中添加码云的远程仓库。码云的远程仓库地址可以在码云仓库内找到。

a

第一次使用idea上传代码到git,需要输入git仓库的用户名和密码。

 输入登录gitee的账号密码,这里我用了ssh协议的地址好使,没测试用https协议的,不过老师说可以的。

2.上传代码到码云,右击项目点击【Git】--》【Repository】--》【Push...】在打开的【Push commits】内可以看到已提交到本地仓库的提交信息。点击【Push】按钮将本地仓库的代码上传到码云上,上传成功后就可以在码云上看到。

 接着就可以在码云中看到了


Github

Github搜索

star 收藏

in:readme spring security stars:>3000

1

in:description 微服务 language:java pushed:>2019-09-03

1、找百科大全   awesome   xxx

Awsome Java

2、找例子 xxx sample

3、找空项目架子  xxx starter

4、找教程 xxx tutorial

-------------

找开源项目

https://github.com/ruanyf/weekly
https://github.com/521xueweihan/HelloGitHub

--------

克隆

git clone https://github.com/xkcoding/spring-boot-demo.git

TortoiseSVN

TortoiseSVN:(俗称小乌龟)Subversion版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录。文件保存在中央版本库,版本库非常像普通的文件服务器。

  • 除了能记住文件和目录的每次修改以外,
  • 将文件恢复到过去的版本,
  • 并且可以通过检查历史知道数据做了哪些修改,谁做的修改

windows下安装svn客户端
下载网址:https://tortoisesvn.net/downloads.html

SVN客户端不是指一个桌面应用程序,而是集成到系统的右键菜单中的插件。因此使用客户端向资源库下载项目资源、提交项目资源等都是通过右键菜单来完成的。


IDEA中集成SVN

在idea中进行简单配置。通过file->settings->version control->Subversion,在Subversion配置界面中。在该界面中,添加svn.exe的本地路径,并apply。

 Enable interactive mode:(打开交互模式,即提示信息)

-------------------------

如果找不到svn.exe⽂件,TortoiseSVN的bin⽬录下⾯没有svn.exe。

之所以没有是因为安装TortoiseSVN的时候没有勾选指定安装项,添加command line client tools

---------------------------

 在不卸载原 svn 基础上,重新双击 TortoiseSVN 安装文件进行安装,选择 Modify

把这里这个X,下拉修改一下


选中IDEA菜单栏的VCS > Browse VCS Repository > Browse Subversion Repository

此时会出现如下界面,我们点击+号,输入本地SVN地址,再点击OK即可将本地SVN地址加入进来。

一个坑:

进入setting -->VersionControl 在右边可以看到当前项目的版本管理情况,在下拉列表框中选择subversion, 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/845448
推荐阅读
相关标签
  

闽ICP备14008679号