首页 > 其他分享 >ssh 和 git 教程(1万字超详细)

ssh 和 git 教程(1万字超详细)

时间:2024-08-12 13:23:13浏览次数:18  
标签:万字超 文件 git ssh 提交 远程 分支

SSH(Secure Shell)是一种用于安全地访问和管理远程计算机的网络协议。它通过加密的连接在不安全的网络上提供安全的通信方式。SSH常用于远程登录、远程命令执行以及安全数据传输。

当我们使用Git进行版本控制时,经常需要将代码推送到远程仓库(例如GitHub、GitLab、Bitbucket等)或者从远程仓库拉取代码。其中访问远程仓库使用的就是SSH

SSH的主要功能

  1. 远程登录:通过SSH客户端,你可以远程登录到另一台计算机,获取其终端会话。
  2. 远程命令执行:可以在远程计算机上执行命令,而无需直接登录到远程终端。
  3. 安全数据传输:使用SCP(Secure Copy Protocol)或SFTP(SSH File Transfer Protocol)在本地和远程计算机之间安全地传输文件。
  4. 端口转发:通过SSH隧道,可以将本地端口流量转发到远程服务器,或将远程端口流量转发到本地。

1、使用ssh连接远程服务器

服务器安装开启 SSH 服务

在 Ubuntu 上,你可以通过以下命令安装和启动 SSH 服务:

sudo apt update
sudo apt install openssh-server
sudo service ssh start

在 CentOS 上,可以使用:

sudo yum install openssh-server
sudo service ssh start

检查 SSH 服务是否正在运行:

service ssh status
 # 成功会显示有 Active: active (running)
 #
 # service ssh restart 这个是重启的命令
获取服务器的 IP 地址
ifconfig
```
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.176.128  netmask 255.255.255.0  broadcast 192.168.176.255
        inet6 fe80::fd92:f82d:65e0:3bda  prefixlen 64  scopeid 0x20<link>
        
我的是 192.168.176.128        
```

查找类似于 192.168.x.x10.x.x.x 的地址,这将是虚拟机的 IP 地址。(如果是云服务器会是公网ip)

本地通过 ssh 连接远程服务器

打开 PowerShell 使用 ssh 命令连接到虚拟机。 例如:

ssh [email protected] -p 22
# -p 和 22 可以不写
# -p 指定端口, ssh默认是 22 端口, 如果你修改了端口, 那么 -p 需要指向你修改的端口

其中 username 是你在虚拟机上的用户名,192.168.x.x 是虚拟机的 IP 地址。
用户名就是 /home/ 文件夹的文件夹名

示例

假设虚拟机的 IP 地址是 192.168.1.100,你的虚拟机用户名是 user,那么在 PowerShell 中你可以输入:

ssh [email protected] -p 22

然后输入虚拟机上的用户密码以完成登录。

注意事项

如果按照上面弄完本地无法通过ssh连接服务器

  • 防火墙配置:确保服务器的防火墙允许 SSH 连接。你可以在虚拟机上使用以下命令开放 SSH 端口(通常是 22):

    sudo ufw allow ssh
    
  • ssh配置

    # 编辑配置文件(默认是ssh配置文件不允许以root用户登陆)
    vim /etc/ssh/sshd_config
    
    # 在 sshd_config中添加如下内容
    PermitRootLogin yes
    PasswordAuthentication yes
    # 上面两个内容分别是允许 ssh以 root 用户登陆 和 启用了密码认证
    

2、简化ssh登陆配置

可以通过创建 SSH 配置文件来简化连接过程,使得每次连接时不需要重复输入用户名和主机号。以下是如何配置 SSH 配置文件的步骤:

1、 编辑 SSH 配置文件

打开 PowerShell 或你的终端

编辑 SSH 配置文件。

配置文件通常位于 ~/.ssh/config(在 Windows 上通常是 C:\Users\YourUsername\.ssh\config)。如果文件不存在,你可以创建它。

vim ~/.ssh/config
# ~ 表示用户的根目录

添加 SSH 配置

在配置文件中添加类似以下的配置项:

Host myvm
    HostName 192.168.1.100
    User yourusername
    Port 22
  • Host: 这是你用来标识主机的别名。在这个例子中,我们用 myvm 作为别名。
  • HostName: 这是实际的主机名或 IP 地址。
  • User: 这是连接时使用的用户名。
  • Port: 这是 SSH 连接使用的端口,默认为 22(可以省略,如果使用默认端口)。

保存并测试

ssh myvm

这样,你就可以使用你配置的别名(如 myvm)来连接虚拟机,而不需要每次都输入用户名和主机号。

3、ssh 免密登陆配置

要实现 SSH 免密码登录,你需要配置 SSH 密钥认证。以下是详细步骤:

在本地生成 SSH 密钥对

打开 PowerShell 或终端。

生成 SSH 密钥对。运行以下命令,并按照提示操作:

ssh-keygen
# 运行这个命令会让你填很多选项,我可以一路回车,直接默认就行
将公钥复制到远程主机

将本地 C:\Users\YourUsername\.ssh\ 中的 id_rsa.pub 的内容复制到服务器的 ~/.ssh/authorized_keys 文件中。( ~ 表示服务器的用户的根目录,服务器如果没有.ssh 和 authorized_keys 文件的话可以自己创建 )

测试免密码登录
ssh user@remote_host
# 如果配置的有简化登陆的话 可以直接 ssh mymv
# mymv 是上面简化登录时候自己配置的名字

如果一切设置正确,你应该能够无需输入密码即可登录到远程主机。

4、scp

scp(Secure Copy Protocol)是一个用于在本地和远程主机之间安全地复制文件和目录的命令行工具。它利用 SSH 协议来加密数据传输。

基本语法

scp [options] source destination
  • source:要复制的源文件或目录。
  • destination:目标位置,可以是本地或远程路径。

常用选项

  • -r:递归复制整个目录。如果要复制目录及其内容,必须使用这个选项。

    scp -r localdir user@remotehost:/path/to/remote/dir
    
  • -P:指定远程主机的端口号。注意,大写的 -P 与小写的 -p 不同,大写的 -P 是用来指定端口的。

    scp -P 2222 localfile user@remotehost:/path/to/remote/file
    
1. user@remotehost
  • user:这是远程主机的用户名。

  • remotehost:这是远程主机的主机名或 IP 地址。

2. :/path/to/remote/file
  • 冒号 ::冒号分隔符用于区分用户名和主机地址与远程路径之间的界限。冒号后面的部分是文件在远程主机上的路径。

  • /path/to/remote/file:这是远程主机上的文件或目录的绝对路径。

    • 绝对路径:以 / 开头,表示从根目录开始的完整路径。

      示例:/home/alice/documents/file.txt 表示在远程主机的 /home/alice/documents 目录下的 file.txt 文件。

    • 相对路径:如果路径没有以 / 开头,它是相对于远程用户的家目录(通常是 ~)的路径。

      示例:documents/file.txt 表示在远程主机的用户家目录下的 documents 目录中的 file.txt 文件。

文件传输的例子

  1. 从本地复制文件到远程主机

    scp localfile user@remotehost:/path/to/remote/file
    
    • 这将把本地文件 localfile 复制到远程主机的 /path/to/remote/ 目录下,并重命名为 file
  2. 从远程主机复制文件到本地

    scp user@remotehost:/path/to/remote/file localfile
    
    • 这将把远程主机上的 /path/to/remote/file 文件复制到本地,并重命名为 localfile
  3. 递归复制本地目录到远程主机

    scp -r localdir user@remotehost:/path/to/remote/dir
    
    • 这将把本地目录 localdir 及其所有内容复制到远程主机的 /path/to/remote/dir 目录下。
  4. 从远程主机递归复制目录到本地

    scp -r user@remotehost:/path/to/remote/dir localdir
    
    • 这将把远程主机上的 /path/to/remote/dir 目录及其所有内容复制到本地的 localdir 目录中。
使用场景
  • 备份文件:可以用来将本地文件备份到远程服务器。
  • 分发文件:将文件从一台计算机分发到多台计算机上。
  • 跨平台文件传输:在不同操作系统之间传输文件,例如从 Windows 计算机到 Linux 服务器。
安全性

scp 使用 SSH 协议进行文件传输,因此提供了加密传输,确保数据在传输过程中不会被窥视或篡改。

总结

scp 是一个简单且安全的文件传输工具,适合基本的文件复制任务。它利用 SSH 协议进行加密传输,支持本地和远程之间的文件复制操作。

linux中我们常用到的是 tmux 和 vim, 这两个的配置文件在 用户的根目录下(/home/username), 通过 ls -a 可以看到 .vimrc.tmux.conf 的配置文件。我们可以通过 scp 命令快速的配置一个服务器的常用功能.

tmux、vim参考文章

3、Git 概述

什么是Git

Git是一个分布式版本控制系统,用于跟踪文件的更改并协调不同用户之间的代码开发工作。它最初由Linus Torvalds于2005年为Linux内核开发设计。与集中式版本控制系统(如Subversion)不同,Git允许每个用户拥有自己的完整版本库副本,使得分布式开发和离线工作变得非常方便。

Git的核心概念及其关系

版本库(Repository)
  • 本地版本库(Local Repository):存储在你自己的电脑上的Git版本库。
  • 远程版本库(Remote Repository):存储在服务器上的版本库,可以通过网络访问,例如GitHub、GitLab等。
工作区(Working Directory)
  • 工作区是你在电脑上查看和编辑文件的地方。
  • 它包含了项目的所有文件和目录。
  • 你在工作区中对文件所做的更改需要被添加到暂存区然后提交到版本库。
暂存区(Staging Area)
  • 暂存区是一个临时存储区域,在这里你可以将所有将要提交的文件快照进行暂存。
  • 通过使用git add命令,你可以将工作区中的更改添加到暂存区。
  • 暂存区允许你分步提交文件的更改,而不是一次提交所有的更改。
提交(Commit)
  • 提交是将暂存区中的内容永久性地保存到本地版本库的过程。
  • 每次提交都会生成一个唯一的提交ID,用于标识该提交。
  • 提交操作会记录更改的详细信息,如时间、作者、提交信息等。
分支(Branch)
  • 分支是Git中独立的开发线,每个分支都有自己的提交历史。
  • 默认的主分支通常叫mainmaster
  • 通过创建分支,你可以在不影响其他分支的情况下进行开发,之后可以合并分支的更改。
远程仓库(Remote Repository)
  • 远程仓库是托管在服务器上的版本库,用于团队协作和备份。
  • 通过克隆、拉取和推送操作,本地仓库和远程仓库之间可以进行数据同步。
概念之间的关系
  1. 工作区与暂存区:工作区是你实际编辑文件的地方,而暂存区是一个临时区域,用于暂时保存即将提交的更改。通过git add命令将工作区的更改添加到暂存区。

  2. 暂存区与版本库:当你将更改添加到暂存区后,通过git commit命令将暂存区的内容永久性地保存到版本库中。

  3. 本地版本库与远程版本库:本地版本库是你在自己的电脑上工作的地方,远程版本库是托管在服务器上的版本库。通过git pushgit pull命令实现本地与远程版本库的同步。

  4. 分支与提交:分支是不同的开发线,每个分支有独立的提交历史。你可以在不同的分支上进行开发,然后将分支合并,以便整合不同的开发工作。

4、Git的常见用法

以下是Git的一些常见用法,包含如何初始化、克隆、提交、更改、分支操作和与远程仓库交互等。

1. 安装Git

在大多数Linux系统上,你可以通过包管理器安装Git:

sudo apt-get install git  # Debian/Ubuntu
sudo yum install git      # CentOS/RHEL

在macOS上,你可以使用Homebrew安装Git:

brew install git

在Windows上,你可以从Git官方网站下载并安装Git。

2. 初始化版本库

使用 git init 命令初始化一个新的Git版本库。

mkdir my_project
cd my_project
git init
3. 检查状态

使用 git status 命令查看工作区的当前状态。

git status
4. 添加文件到暂存区

使用git add命令将文件添加到暂存区。

git add filename          # 添加单个文件
git add .                 # 添加所有更改的文件
5. 提交更改

使用 git commit 命令提交暂存区的更改。

git commit -m "Commit message"
# 我们使用 commit 后会创建一个新的提交, 每个提交都有位移的hashId, 相当于是快照, 我们可以在不同的快照之间切换
6. 查看提交历史

使用 git log 命令查看提交历史。

git log
7. 回滚操作

git reset 是一个非常强大的命令,用于回滚提交和更改文件状态。它有三种主要模式:--soft--mixed(默认)和 --hard。以下是常用命令的简要介绍:

1. git reset --soft
  • 只重置HEAD指针,不影响暂存区和工作区的文件。适用于希望保留更改但撤销提交的情况。
git reset --soft <commit_hash>
2. git reset --mixed(默认)
  • 重置HEAD指针和暂存区,但不影响工作区的文件。适用于希望保留更改但取消暂存的情况。
git reset --mixed <commit_hash>
# 或
git reset <commit_hash>  # 默认使用 --mixed 模式
3. git reset --hard
  • 重置HEAD指针、暂存区和工作区的文件。适用于希望完全回滚到指定提交并删除所有更改的情况。
git reset --hard <commit_hash>

git reflog 用于记录每次HEAD的移动情况,即使是回滚或重置的操作也会被记录。它在需要恢复误操作时非常有用。以下是常用命令的简要介绍:

1. 查看Reflog
  • 显示HEAD的历史变动记录。
git reflog
2. 恢复到Reflog中的某个状态
  • 使用reflog中的某个状态来恢复HEAD、暂存区和工作区。
git reset --hard <reflog_hash>
8、恢复和撤销操作

git restore 是一个用于恢复或取消更改的命令,它是Git 2.23引入的新命令,旨在简化并替代一些常见的恢复操作,如撤销工作区的更改或取消暂存的更改。以下是 git restore 的常用命令及其用法的简要介绍:

恢复工作区中的文件

如果你在工作区中修改了文件但尚未添加到暂存区,你可以使用 git restore 命令来撤销这些更改:

git restore <filename>     # 恢复特定文件
git restore .              # 恢复所有文件

这个命令会将工作区中的文件恢复到最近一次提交时的状态。

取消暂存的文件

如果你已经使用 git add 将文件添加到暂存区,但还没有提交,你可以使用 git restore --staged 命令来取消暂存:

git restore --staged <filename>    # 取消暂存特定文件
git restore --staged .             # 取消暂存所有文件

这个命令会将暂存区中的文件恢复到工作区的状态。

高级用法

1. 恢复到指定提交

你可以使用 --source 选项指定要恢复的源提交:

git restore --source=<commit_hash> <filename>

这个命令会将指定文件恢复到特定提交的状态。

2. 与其他选项结合使用

git restore 还有一些其他选项,可以进一步控制恢复操作:

  • --worktree:只恢复工作区中的文件(这是默认行为)。
  • --staged:只恢复暂存区中的文件。
  • -s--source:指定源提交。

示例操作

假设你在项目中进行了一些更改,并使用 git restore 进行恢复:

恢复工作区中的更改

你修改了文件 file1.txt,但不想保留这些更改:

git restore file1.txt
取消暂存的更改

你暂存了文件 file2.txt,但还没有提交,现在想取消暂存:

git restore --staged file2.txt
恢复到指定提交

你想将 file3.txt 恢复到提交 abc1234 的状态:

git restore --source=abc1234 file3.txt

5、与远程仓库交互

把本地仓库上传到远程仓库 (云仓库), 可以让项目脱离本地, 可以让我们随时用不同的电脑获取并修改项目的内容

  • 添加远程仓库:使用 git remote add 命令添加远程仓库。(这里需要注意, 下面的操作基本都是通过 ssh 跟远程仓库进行通信的, 像push pull 是通过 scp 实现的)

    git remote add origin https://github.com/user/repo.git
    # 我们一般用的都是 github 来创建一个项目当作远程仓库, 我们需要 执行上面讲的 "ssh中讲到的免密登陆配置" 类似的操作
    # 在本地通过 ssh 生成一个私钥和公钥, 把公钥里的内容粘贴到 github setting 中的 ssh 添加一个 ssh key 中
    # 这样就可以免密登陆远程仓库了
    
    # origin:这是远程仓库的名称,通常默认用 origin 来指代主远程仓库。
    # 当运行 git push 或 git pull 命令时,如果没有指定其他远程仓库,Git 会默认使用 origin。
    # url 是 github 的仓库地址
    
  • 推送到远程仓库:使用 git push 会将本地分支的提交推送到远程分支

    git push <remote> <branch>
    
    • <remote>:远程存储库的名称,通常是origin。

    • <branch>:要推送的本地分支的名称。

    git push origin main      # 推送到远程主分支
    git push origin new_branch  # 推送到远程新分支
    
  • 拉取远程更改:git pull命令用于从远程存储库获取最新的更改,并将它们合并到本地分支。它相当于执行了git fetch和git merge两个操作。

    git pull <remote> <branch>
    
    • <remote>:远程存储库的名称,通常是origin。

    • <branch>:要拉取的远程分支的名称。

    git pull origin main
    
  • 获取远程仓库信息:使用 git fetch 命令获取远程仓库的最新信息,但不进行合并。

    git fetch origin
    
  • 克隆远程仓库:使用 git clone 命令从远程仓库克隆一个版本库到本地。

    git clone https://github.com/user/repo.git
    

6、不常用的操作

在Git中,分支的操作有时不如其他操作常用。当我们初始化一个Git仓库时,默认会创建一个名为master(或在新版本中是main)的分支。每次执行git commit命令时,都会在当前分支上创建一个新的提交。

此外,我们可以在任何一个提交上创建一个新分支。这个新分支会包含当前提交的所有内容。当我们在新分支上进行提交操作时,这些提交记录会添加到新分支上,而不会影响原来的分支。

这种表达应该更加准确和清晰。如果你还有其他问题或需要进一步修改,请告诉我!

1. 创建和切换分支

使用 git branch 命令创建新分支,使用 git checkout 命令切换分支。

git branch new_branch     # 创建新分支 new_branch 是新分支的 name
git checkout new_branch   # 切换到新分支

或使用 git checkout -b 一次性完成分支的创建和切换。

git checkout -b new_branch
2. 上传分支

将本地分支推送到远程仓库。

git push origin your-branch-name

如果希望本地分支与远程分支关联,以便在将来进行拉取或推送时不需要指定远程分支名称,可以使用以下命令:

git push --set-upstream origin your-branch-name
3. 合并分支

使用 git merge 命令将分支合并到当前分支。

git checkout main        # 切换到主分支

git merge new_branch     # 合并new_branch到主分支
4. 解决合并冲突

合并过程中,如果有冲突,Git会标记冲突部分,用户需要手动解决冲突并提交解决后的更改。

# 编辑冲突文件,解决冲突后
git add conflicted_file
git commit -m "Resolved merge conflict"
5. 查看分支信息

使用 git branch 命令查看本地分支,使用 git branch -r 查看远程分支。

git branch          # 查看本地分支

git branch -r       # 查看远程分支
6. 删除分支

使用 git branch -d 命令删除本地分支。

git branch -d branch_name  # 删除本地分支

使用 git push origin --delete 命令删除远程分支。

git push origin --delete branch_name  # 删除远程分支

标签:万字超,文件,git,ssh,提交,远程,分支
From: https://blog.csdn.net/m0_74065705/article/details/140897830

相关文章

  • git项目的地址获取及自动clone.
    痛点:项目使用的git项目过多,我的目前60多个。文件夹当时创建的时候比较杂乱。后期找项目比较困难。执行方案:迁移项目,根据git地址内的文件夹进行对应的文件夹创建,#!/usr/bin/python3#-*-coding:utf-8-*-importos,subprocessdefget_folder_list(path=os.getcwd(),......
  • Linux:@2024-08-11 最新的Openssl-3.3.1 Openssh-9.8p1 Centos7上的编译后二进制 一键
     附件:Portable_Openssl-Openssh9.8p1-bin-el7.v1.4.1.tgz.zip 特点:适用于centos7.x 已经编译为二进制对老版本的关键二进制文件sshd、sftp、scp、openssl进行了备份升级前,自动打开一个端口为2222的老版本的sshd服务,你可以连接那个2222的服务,以防死翘翘。对sshd_confi......
  • 【git】如何切换原仓库地址
    文章目录一、打开项目目录二、更换原仓库git1.使用rm-rf.git删除.git文件,或直接删除文件里的.git文件2.初始化仓库重新生成.git3.使用gitremoteaddorigin仓库地址关联到新的远程库地址4、使用gitremote-v查看仓库的关联信息5.使用gitadd.添加文件......
  • 【git】gitee 提交错误,如何回退
    文章目录查看提交记录设定退回到位置提交查看提交记录gitloggitlog如下图所示共2次提交记录最近一次是错误提交(笔者提交是在错误的工作路径上传了)设定退回到位置gitreset--hardhash值gitreset--soft83fcc380d5250599eca************5提交gitpu......
  • SSH(Secure Shell)服务配置
    SSH(SecureShell)服务配置是一个涉及多个步骤和配置项的过程,旨在确保远程登录和数据传输的安全性。以下是对SSH服务配置的详细阐述,包括基本概念、配置步骤、常用选项以及最佳实践。一、SSH基本概念SSH是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。S......
  • Gitlab怎么使用ssh进行克隆
    系统环境和软件环境查看系统环境#cat/etc/redhat-releaseCentOSStreamrelease9#uname-aLinuxCentOSStream9Git2155.14.0-381.el9.x86_64#1SMPPREEMPT_DYNAMICMonOct3023:56:21UTC2023x86_64x86_64x86_64GNU/Linux软件环境#gitlab-railsconsole......
  • git clone 网络太差总是失败:error: RPC 失败。curl 92 HTTP/2 stream 5 was not close
    ❯gitclonehttps://github.com/Almamu/linux-wallpaperengine.git.正克隆到'.'...remote:Enumeratingobjects:6271,done.remote:Countingobjects:100%(1447/1447),done.remote:Compressingobjects:100%(628/628),done.error:RPC失败。curl92HTT......
  • 如何忽略已经提交到 Git 仓库中的文件
    文章目录前言一、确认文件是否已经被提交二、确认.git文件存在三、修改.git/info/exclude文件四、修改文件名五、提交和推送六、验证总结前言在日常开发中,我们常常会遇到这样的情况:不小心将不应追踪的文件提交到了Git仓库中,例如配置文件、临时文件等。尽管可......
  • Github-vscode联合使用保姆及教程
    Github-VScode联合使用保姆及教程update:2024/8/10_Karenbluu文章目录Github-VScode联合使用保姆及教程1.Git和Github分别是什么2.安装2.1git安装2.2vscode安装3.使用Github3.1拉取项目3.1.1拉取方法3.1.2注意事项3.2寻找合适的项目3.3创建自己的git......
  • region format is illegal, only digit, letter and - is allowed!(.env文件中行内注释
    引子:一个图片上传功能,用腾讯云cos,一直找不到错误原因,结果是.env文件中的行内注释!错误描述上传图片代码defaction_upload_img_cloud(request):user=CustomUser.objects.get(id=request.user_id)file=request.FILES['img']file_name=file.nameun......