云小杰

相对于绝对成功的汲汲渴求,越无杂质的奔赴,越是动人。

要一个黄昏, 满是风, 和正在落下的夕阳。如此, 足够我爱这破碎泥泞的人间。


Download the theme

Git

Git


1. Git 简介

Git是一个版本管理控制系统(缩写VCS),它可以在任何时间点,将文档的状态作为更新记录保存起来,也可以在任何时间点,将更新记录恢复回来。

Git 有什么特点?简单来说就是:高端大气上档次!

1.1 集中式 VS 分布式

先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。

img

集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个 10M 的文件就需要 5 分钟,这还不得把人给憋死啊。

那分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件 A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

img

1.2 Git 简单说明

说明:

  • workspace:工作区
  • staging area:暂存区/缓存区
  • local repository:版本库或本地仓库
  • remote repository:远程仓库

2. Git 配置

Git 官网:https://git-scm.com/。

在使用 git 前,需要告诉 git 你是谁,在向 git 仓库中提交时需要用到。

# 配置
**
1. 配置提交人姓名:git config --global user.name “提交人姓名” # (对当前系统用户有效)
2. 配置提交人姓名:git config --global user.email  “提交人邮箱” # (对当前系统用户有效)
作用:识别开发人员
3. 查看 git 配置信息:git config --list

# 注意
1. 如果要对配置信息进行修改,重复上述命令即可。
2. 配置只需要执行一次

3. 常用命令

  • 查看 git 版本

    • git --verson
      
  • 初始化 git 仓库

    • git init
      
  • 添加文件

    • 添加到版本库

    • git add
      # 可以添加多个文件
      git add [file1] [file2] ...
      ###########
      git add . # 添加当前目录下的所有文件
          
      ###################################
      git add -u <==> git add –update
      提交所有被删除和修改的文件到数据暂存区
          
      git add .
      提交所有修改的和新建的数据暂存区
          
      git add -A <==>git add –all
      提交所有被删除、被替换、被修改和新增的文件到数据暂存区
      
  • 将文件提交到仓库

    • git commit -m "本次提交的信息,可以输入任意内容,当然最好是有意义的"
      
  • 查看仓库状态

    • git status
      # 红色:文件被修改,未添加到版本库去
      # 绿色:文件添加到版本库,未提交
      # nothing to commit, working tree clean 表示已经提交到版本库
      
  • 查看 git 的历史记录

    • git log 
      git log --pretty=oneline   # 一行显示版本信息
      
    • ##### 补充:
      git log lfa380b5O2a0Ob82bfc8d84c5ab5el5b8fbf7dac # 会显示所有关于这个id以及之前的修改记录
      git log lfa380b5O2a0Ob82bfc8d84c5ab5el5b8fbf7dac -1 # 加上-1参数表示我们只想看到一行记录
      # 而如果想要查看这条提交记录具体修改了什么内容,可以在命令中加入p参数,命令如下:
      git log Ifa380b502a00b82bfc8d84c5ab5el5b8fbf7dac -1 -p
      
  • 回退版本

    • 在 Git 中,用 HEAD 表示当前版本,也就是最新的提交 29ce...9598a,上一个版本就是HEAD^,上上一个版本就是 HEAD^^,当然往上 100 个版本写 100 个^比较容易数不过来,所以写成 HEAD~100

    • git reset --hard 版本id
          
      ####################完整命令########################
      git reset [ --soft | --mixed | --hard] [HEAD]
          
      # --mixed 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
      $ git reset HEAD^            # 回退所有内容到上一个版本  
      $ git reset HEAD^ hello.php  # 回退 hello.php 文件的版本到上一个版本  
      $ git reset  052e            # 回退到指定版本
          
      # --soft 参数用于回退到某个版本:
      $ git reset --soft HEAD~3 # 回退到上上上一个版本
          
      # --hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交:
      $ git reset --hard HEAD~3  # 回退到上上上一个版本  
      $ git reset --hard bae128  # 回退到某个版本回退点之前的所有信息。 
      $ git reset --hard origin/master    # 将本地的状态回退到和远程的一样 
      

    image-20220427225626255

  • 查看所有历史记录的版本号

    • git reflog
          
      ################
      LYJ@DESKTOP-2GF6LRA MINGW64 /d/写代码/Java/LearnGit (master)
      $ git reflog
      29ce87a (HEAD -> master) HEAD@{0}: reset: moving to 29ce
      c2bdf2f HEAD@{1}: reset: moving to c2bd
      29ce87a (HEAD -> master) HEAD@{2}: commit: 第三次修改test.txt文件
      686a348 HEAD@{3}: commit: 第二次修改test.txt文件
      c2bdf2f HEAD@{4}: commit: 第一次修改test.txt文件
      d902b2e HEAD@{5}: commit (initial): 创建test.txt文件
      
  • 关联远程仓库

    • git remote add 远程仓库地址别名(可以自定义,一般为origin)  远程仓库地址
      ################## 例子
      git remote add origin https://github.com/xxxxx.git
      
  • 推送到远程仓库

    • git push [-u] 远程仓库地址别名 分支名称
      git push origin master  # 推送远程分支
      git push -u origin master # -u 记住推送地址及分支,下次推送只需要输入git push即可
      
  • 拉取远程仓库中最新的版本

    • git pull 远程仓库地址 远程地址分支名称
      git pull origin master # 拉取 origin 主机的master分支,与本地当前分支合并
          
      ######################## git clone跟git pull的区别 ########################
      git clone是在没有本地仓库的基础上clone别人的东西,而 git pull 则是在有本地仓库的基础上拉取代码到本地。git clone 只是第一次参与开发时用,以后都是用 git pull 命令。
      
  • 删除远程仓库

    • git remote remove origin
      

4. 撤销修改

4.1 撤销工作区的修改

即还未执行 git add 操作

git checkout -- 文件名字 #例如 git checkout -- test.txt

4.2 撤销暂存区的修改

即已经执行 git add 操作

# 需要进行两步操作
**
> 暂存区撤回工作区 git reset HEAD 文件名    例如 git reset HEAD test.txt
> 撤回工作区修改   git checkout -- 文件名   例如 git checkout -- test.txt
**

4.3 git 如何修改最近一次的commit信息

**
1. git commit --amend
2. 进入vim操作界面之后, 点击字母键 i 然后进入INSERT模式,然后对commit信息进行修改,然后ESC 然后 :wq 保存退出
3. 然后执行 git log 会发现最近的一次commit信息被修改成功了

4.4 git checkout的其他用法

**
> 核查工作区相对于版本库修改过的文件: git checkout 后面不加任何参数
> 创建新分支:git branch 分支名
> 切换到新分支:git checkout 分支名
> 上面两个命令也可以合成为一个命令----创建分支并切换到该分支:git checkout -b 分支名
> 以指定的提交节点创建一个临时性分支: git checkout commitID
> 以指定的commitID提交节点创建新的分支并切换到新分支。此时工作区的内容和切换分之前commitID提交节点的内容一样: git checkout -b 分支名 commitID
**

4.5 文件删除

**
1. rm 文件
2. 确定删除
	- git rm 文件 
	- git commit -m ""
3. 取消删除
	- git checkout -- 文件
**
开发过程中,不是每个文件都是有必要交给git管理的,使用这个命令可以从暂存区删除没用的文件,不交给git管理,此时文件在工作目录依然存在,只是没在暂存区而已.

5. Git 分支

  • 创建分支

    • git branch 分支名
      #############################
      git branch 表示查看存在哪些分支
      
  • 切换分支

    • git checkout 分支名
      git checkout -b 分支名 #创建分支并切换到该分支
      
  • 合并分支

    • git merge 来源分支
      # 例如:将dev分支合并到主分支
      git checkout master # 切换到主分支
      git merge dev       # 将dev分支合到主分支
      
  • 删除分支

    • git branch -d 分支名称 # 删除分支(分支被合并后才允许删除)(-D 强制删除)
      # 注意: 如果某分支没有合并,则该分支不可以直接被删除,解决办法就是把小d改为大D即可。
      
  • 暂时保存更改

    • git stash  # 存储临时改动
      git stash pop  # 恢复改动
      #######################################
      应用场景(分支临时切换): 正在 dev 分支开发新功能,做到一半时有人过来反馈一个 bug, 需要马上解决,但是新功能做到了一半你又不想提交。这时就可以使用 git stash 命令先把当前进度保存起来,然后切换到另一个分支去修改bug; 修改完提交后,再切回 dev 分支,使用 git stash pop 来恢复之前的进度继续开发新功能。
          
      # 保存当前未commit的代码  
      git stash  
            
      # 保存当前未commit的代码并添加备注  
      git stash save "备注的内容"  
            
      # 列出stash的所有记录  
      git stash list  
            
      # 删除stash的所有记录  
      git stash clear  
            
      # 应用最近一次的stash  
      git stash apply  
            
      # 应用最近一次的stash,随后删除该记录  
      git stash pop  
            
      # 删除最近的一次stash  
      git stash drop  
      

img

最近的文章

打家劫舍

打家劫舍198. 打家劫舍题目描述你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3...…

继续阅读
更早的文章

分割字符串

分割字符串131. 分割回文串题目描述给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。示例 1:输入:s = "aab"输出:[["a","a","b"],["aa","b"]]示例 2:输入:s = "a"输出:[["a"]]方法一:回溯+动态规划需要求出字符串 $s$ 的所有分割方案,因此我们考虑使用搜索 + 回溯的方法枚举所有可能的分割方法并进行判断。我们可以将字符串 $s$ 的每个子串 ...…

继续阅读