技术栈系列基础篇3-git

2022-09-21 17:13:58 浏览数 (1)

一、git server安装

1.1 server端安装

  • yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel
  • yum install git // 安装git
  • groupadd git // 创建git用户组
  • useradd git -g git // 创建git用户并将其添加到git用户组中
  • su git // 切换到git用户
  • mkdir -p ~/.ssh && chmod 0700 ~/.ssh // 在home目录下创建 .ssh目录
  • touch ~/.ssh/authorized_keys && chmod 0600 ~/.ssh/authorized_keys // 创建authorized_keys文件
  • git init --bare ~/projectname.git // 创建一个空的仓库
  • chown -R git:git projectname.git // 设置git库的访问权限

1.2 client端安装

  • cat ~/.ssh/id_rsa.pub // 查看ssh公钥信息
  • ssh-keygen -t rsa -b 4096 -C "your_email@domain.com" // 如果没有就创建
  • 将id_rsa.pub内容复制,到server端的authorized_keys文件中,实现免密登录传输
  • cd /path/to/local/project // 切换到本地仓库目录
  • git clone ssh://git@www.xxxxx.com:9003/~/projcetname.git

二、git 常用命令

参考文档:https://www.runoob.com/git/git-workspace-index-repo.html

  • Workspace(工作区):你电脑本地看到的文件和目录,在Git的版本控制下,构成了工作区。
  • Index/Stage(暂存区):一般存放在 .git目录下,即.git/index,它又叫待提交更新区,用于临时存放你未提交的改动。比如,你执行git add,这些改动就添加到这个区域啦。
  • Repository(本地仓库):你执行git clone 地址,就是把远程仓库克隆到本地仓库。它是一个存放在本地的版本库,其中HEAD指向最新放入仓库的版本。当你执行git commit,文件改动就到本地仓库来了~
  • Remote(远程仓库):就是类似github,码云等网站所提供的仓库,可以理解为远程数据交换的仓库~

git命令

描述

git config --list

显示git配置信息

git config --global user.name 'xxxxx'

设置提交的用户信息,包括用户名和邮箱

git config --global user.email 'xxxx@xxxxx.com'

设置提交的用户信息,包括用户名和邮箱

git clone ’git://github.com/schacon/grit.git'

克隆一个远程仓库到本地

git init

初始化一个空的git本地仓库

git add *.go

添加文件到暂存区

git commit -m message

提交暂存区到本地仓库中

git status

查看git仓库的状态

git diff

比较文件的不同,即暂存区和工作区的差异

git reset

回退版本

git rm

删除工作区文件

git mv

移动或重命名工作区文件

git log

查看历史提交记录

远程操作

git remote

远程仓库操作

git fetch

从远程获取代码库

git pull

从远程获取代码库,并合并

git push

推送代码到远程仓库

分支管理

git branch (branchname)

创建分支命令

git merge

合并分支

git branch

列出分支命令

git branch -d (branchname)

删除分支命令

git checkout (branchname)

切换分支

git checkout . 或者git checkout -- <file>

<font color='red'>会用暂存区全部或指定文件替换工作区的文件</font>

git checkout HEAD . 或者git checkout HEAD <file>

<font color='red'>会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。</font>

git 查看提交历史

git log

查看提交历史

git blame (file)

查询制定文件的修改记录

git 标签

git tag -a v1.0

版本打标签

git tag

查看所有标签

三、git 使用技巧

3.1 git撤销提交的方法

  • 首先,使用git log -n 3 --stat命令,可以查看最近3次提交的详细信息,并且会显示每次commit的哈希值。
  • git reset --soft 某次commit哈希值的任意前缀
  • git push origin master --force
  • 强制提交之后,那次commit之后所有的修改都处于没有提交的状态,可以再修改文件,然后将他们都再添加提交即可。
  • 使用git commit -m命令再提交新的commit。

3.2 git 放弃本地修改

  • 场景1.本地修改尚未提交到暂存区, 即本地代码修改还没有执行(git add),使用命令
代码语言:txt复制
git checkout -- <file>  
// 放弃全部修改
git checkout .
  • 场景2. 本地修改已经先提交暂存区,执行的git add,但没有提交git commit, 撤销缓存提交
代码语言:txt复制
// 放弃修改指定文件
  git reset HEAD  <file> 

// 放弃修改所有文件
git reset HEAD .
  • 场景3. 已经git commit 提交,版本回退
代码语言:txt复制
// 回退到前一个版本
git reset --hard HEAD^

//回退到指定版本
 git reset --hard  commitid  

note:

  • HEAD表示当前版本, HEAD^表示上个版本, HEAD^^表示上上个版本
  • commitid通过git log获取,直接使用版本号的前几个字符串即可。(git log --pretty=oneline 一行显示)
  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的版本

3.3 git 使用非标准的ssh端口(非22)

在做内网穿透的时候,使用了端口9003,在我使用 “git@www.xxxxx.com:9003/~/xxxx.git” 时发现不能进行git clone等命令操作;原来,当ssh的端口访问改变的时候,原来的方式就不行了,需要使用新的方式

代码语言:txt复制
	git clone  ssh://git@www.xxxxx.com:9003/~/xxxx.git

四、日常开发中常用的命令

  • git clone
  • git checkout -b dev
  • git add
  • git commit
  • git log
  • git diff
  • git status
  • git pull/git fetch
  • git push

git clone

当我们要进行开发,第一步就是克隆远程版本库到本地呢

代码语言:txt复制
git clone url  克隆远程版本库

git checkout -b dev

克隆完之后呢,开发新需求的话,我们需要新建一个开发分支,比如新建开发分支dev

创建分支:

代码语言:txt复制
git checkout -b dev   创建开发分支dev,并切换到该分支下

git add

git add的使用格式:

代码语言:txt复制
git add .	添加当前目录的所有文件到暂存区
git add [dir]	添加指定目录到暂存区,包括子目录
git add [file1]	添加指定文件到暂存区

有了开发分支dev之后,我们就可以开始开发啦,假设我们开发完HelloWorld.java,可以把它加到暂存区,命令如下

代码语言:txt复制
git add Hello.java  把HelloWorld.java文件添加到暂存区去

git commit

git commit的使用格式:

代码语言:txt复制
git commit -m [message] 提交暂存区到仓库区,message为说明信息
git commit [file1] -m [message] 提交暂存区的指定文件到本地仓库
git commit --amend -m [message] 使用一次新的commit,替代上一次提交

把HelloWorld.java文件加到暂存区后,我们接着可以提交到本地仓库啦~

代码语言:txt复制
git commit -m 'helloworld开发'

git status

git status,表示查看工作区状态,使用命令格式:

代码语言:txt复制
git status  查看当前工作区暂存区变动
git status -s  查看当前工作区暂存区变动,概要信息
git status  --show-stash 查询工作区中是否有stash(暂存的文件)

git log

git log,这个命令用得应该比较多,表示查看提交历史/提交日志~

代码语言:txt复制
git log  查看提交历史
git log --oneline 以精简模式显示查看提交历史
git log -p <file> 查看指定文件的提交历史
git blame <file> 一列表方式查看指定文件的提交历史

git diff

代码语言:txt复制
git diff 显示暂存区和工作区的差异
git diff filepath   filepath路径文件中,工作区与暂存区的比较差异
git diff HEAD filepath 工作区与HEAD ( 当前工作分支)的比较差异
git diff branchName filepath 当前分支的文件与branchName分支的文件的比较差异
git diff commitId filepath 与某一次提交的比较差异

git pull/git fetch

代码语言:txt复制
git pull  拉取远程仓库所有分支更新并合并到本地分支。
git pull origin master 将远程master分支合并到当前本地master分支
git pull origin master:master 将远程master分支合并到当前本地master分支,冒号后面表示本地分支

git fetch --all  拉取所有远端的最新代码
git fetch origin master 拉取远程最新master分支代码

有些伙伴可能对使用git pull还是git fetch有点疑惑,其实 git pull = git fetch git merge。pull的话,拉取远程分支并与本地分支合并,fetch只是拉远程分支,怎么合并,可以自己再做选择。

git push

git push 可以推送本地分支、标签到远程仓库,也可以删除远程分支哦。

代码语言:txt复制
git push origin master 将本地分支的更新全部推送到远程仓库master分支。
git push origin -d <branchname>   删除远程branchname分支
git push --tags 推送所有标签

Git进阶之分支处理

Git一般都是存在多个分支的,开发分支,回归测试分支以及主干分支等,所以Git分支处理的命令也需要很熟悉的呀~

  • git branch
  • git checkout
  • git merge

git branch

git branch用处多多呢,比如新建分支、查看分支、删除分支等等

新建分支:

代码语言:txt复制
git checkout -b dev2  新建一个分支,并且切换到新的分支dev2
git branch dev2 新建一个分支,但是仍停留在原来分支

查看分支:

代码语言:txt复制
git branch    查看本地所有的分支
git branch -r  查看所有远程的分支
git branch -a  查看所有远程分支和本地分支

删除分支:

代码语言:txt复制
git branch -D <branchname>  删除本地branchname分支

git checkout

切换分支:

代码语言:txt复制
git checkout master 切换到master分支

git merge

我们在开发分支dev开发、测试完成在发布之前,我们一般需要把开发分支dev代码合并到master,所以git merge也是程序员必备的一个命令。

代码语言:txt复制
git merge master  在当前分支上合并master分支过来
git merge --no-ff origin/dev  在当前分支上合并远程分支dev
git merge --abort 终止本次merge,并回到merge前的状态

Git进阶之处理冲突

Git版本控制,还是多个人一起搞的,多个分支并存的,这就难免会有冲突出现~

Git合并分支,冲突出现

同一个文件,在合并分支的时候,如果同一行被多个分支或者不同人都修改了,合并的时候就会出现冲突。

举个粟子吧,我们现在在dev分支,修改HelloWorld.java文件,假设修改了第三行,并且commit提交到本地仓库,修改内容如下:

代码语言:txt复制
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello,捡田螺的小男孩!");
    }
}

我们切回到master分支,也修改HelloWorld.java同一位置内容,如下:

代码语言:txt复制
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello,jay!!");
    }
}

Git解决冲突

Git 解决冲突步骤如下:

  • 查看冲突文件内容
  • 确定冲突内容保留哪些部分,修改文件
  • 重新提交,done

1.查看冲突文件内容

git merge提示冲突后,我们切换到对应文件,看看冲突内容

2.确定冲突内容保留哪些部分,修改文件

  • Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,
  • <<<<<<<HEAD是指主分支修改的内容,>>>>>>> dev是指dev分支上修改的内容

所以呢,我们确定到底保留哪个分支内容,还是两个分支内容都保留呢,然后再去修改文件冲突内容~

3.修改完冲突文件内容,我们重新提交,冲突done

Git进阶之撤销与回退

Git的撤销与回退,在日常工作中使用的比较频繁。比如我们想将某个修改后的文件撤销到上一个版本,或者想撤销某次多余的提交,都要用到git的撤销和回退操作。

代码在Git的每个工作区域都是用哪些命令撤销或者回退的呢

有关于Git的撤销与回退,一般就以下几个核心命令

  • git checkout
  • git reset
  • git revert

git checkout

如果文件还在工作区,还没添加到暂存区,可以使用git checkout撤销

代码语言:txt复制
git checkout [file]  丢弃某个文件file
git checkout .  丢弃所有文件

git reset

git reset的理解

git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本.

为了更好地理解git reset,我们来回顾一下,Git的版本管理及HEAD的理解

Git的所有提交,会连成一条时间轴线,这就是分支。如果当前分支是master,HEAD指针一般指向当前分支,如下:

假设执行git reset,回退到版本二之后,版本三不见了

git reset的使用

Git Reset的几种使用模式

代码语言:txt复制
git reset HEAD --file
回退暂存区里的某个文件,回退到当前版本工作区状态
git reset –-soft 目标版本号 可以把版本库上的提交回退到暂存区,修改记录保留
git reset –-mixed 目标版本号 可以把版本库上的提交回退到工作区,修改记录保留
git reset –-hard  可以把版本库上的提交彻底回退,修改的记录全部revert。

先看一个粟子demo吧,代码git add到暂存区,并未commit提交,就以下酱紫回退,如下:

代码语言:txt复制
git reset HEAD file 取消暂存
git checkout file 撤销修改

再看另外一个粟子吧,代码已经git commit了,但是还没有push:

代码语言:txt复制
git log  获取到想要回退的commit_id
git reset --hard commit_id  想回到过去,回到过去的commit_id

如果代码已经push到远程仓库了呢,也可以使用reset回滚哦(这里大家可以自己操作实践一下哦)~

代码语言:txt复制
git log
git reset --hard commit_id
git push origin HEAD --force

git revert

与git reset不同的是,revert复制了那个想要回退到的历史版本,将它加在当前分支的最前端。

revert之前:

revert 之后:

当然,如果代码已经推送到远程的话,还可以考虑revert回滚呢

代码语言:txt复制
git log  得到你需要回退一次提交的commit id
git revert -n <commit_id>  撤销指定的版本,撤销也会作为一次提交进行保存

Git进阶之标签tag

打tag就是对发布的版本标注一个版本号,如果版本发布有问题,就把该版本拉取出来,修复bug,再合回去。

代码语言:txt复制
git tag  列出所有tag
git tag [tag] 新建一个tag在当前commit
git tag [tag] [commit] 新建一个tag在指定commit
git tag -d [tag] 删除本地tag
git push origin [tag] 推送tag到远程
git show [tag] 查看tag
git checkout -b [branch] [tag] 新建一个分支,指向某个tag

Git其他一些经典命令

git rebase

rebase又称为衍合,是合并的另外一种选择。

假设有两个分支master和test

代码语言:txt复制
      D---E test
      /
 A---B---C---F--- master

执行 git merge test得到的结果

代码语言:txt复制
       D--------E
      /          
 A---B---C---F----G---   test, master

执行git rebase test,得到的结果

代码语言:txt复制
A---B---D---E---C‘---F‘---   test, master

rebase好处是: 获得更优雅的提交树,可以线性的看到每一次提交,并且没有增加提交节点。所以很多时候,看到有些伙伴都是这个命令拉代码:git pull --rebase

git stash

stash命令可用于临时保存和恢复修改

代码语言:txt复制
git stash  把当前的工作隐藏起来 等以后恢复现场后继续工作
git stash list 显示保存的工作进度列表
git stash pop stash@{num} 恢复工作进度到工作区
git stash show :显示做了哪些改动
git stash drop stash@{num} :删除一条保存的工作进度
git stash clear 删除所有缓存的stash。

git reflog

显示当前分支的最近几次提交

git blame filepath

git blame 记录了某个文件的更改历史和更改人,可以查看背锅人,哈哈

git remote

代码语言:txt复制
git remote   查看关联的远程仓库的名称
git remote add url   添加一个远程仓库
git remote show [remote] 显示某个远程仓库的信息

0 人点赞